经典策略之一文读懂网格交易

什么是网格交易?

网格交易法又叫渔网交易法, 是在标的价格不断震荡的过程中,对标的价格绘制网格,在市场价格触碰到某个网格线时进行低买高卖操作获利的策略。

  • 适用场景: 震荡行情,在价格下跌时买入,价格上涨时卖出

  • 分类: 根据多空倾向可以分为做多网格、做空网格和中性网格,即:做多网格只会开多和平多,适合于震荡向上的行情,做空网格只会开空和平空,适合于震荡向下的行情。中性网格是在策略开启时的市场价格的上方开空/平空,下方开多/平多

  • 优点:震荡套利。如果判断接下来将会有较长时间的震荡行情时,可以获取额外alpha

  • 缺点: 对行情判断要求较高。由于是逆势交易,如果遇上单边上涨行情,则容易卖飞; 若遇上单边下跌行情,则亏损会较大

网格交易具体步骤

网格交易具体步骤如下:

  1. 1. 确定交易标的。 选择的标的最好价格变化较大,交易较为活跃。 如果标的不活跃,价格波动不大,很难触发交易

  2. 2. 确定网格的中枢、压力位和支撑位 确定适当的压力位和支撑位,使价格大部分时间能够在压力位和支撑位之间波动。如果压力位和支撑位设置范围过大,会导致难以触发交易;如果压力位和支撑位设置范围过小,则会频繁触发交易,除了交易成本外,一旦突破支撑位,亏损可能较大

  3. 3. 设置网格宽度和数量 设定多少个网格以及网格的宽度可以自定义

    • * 等宽网格可能会导致买卖点过早,收益率较低。设置不等宽网格能避免该问题,但可能会错失买卖机会

    • * 常用的网格设计模式: 等差网格和等比网格。 等差网格为每相邻两档挂单价格的差值相等,如1、2、3、4;等比网格为每相邻两档挂单价格的比值相等, 如1、2、4、8

  4. 4. 当价格触碰到网格线时,若高于买入价,则每上升一格卖出x手;若低于买入价,则每下跌一格买入x手

代码实现

核心代码如下:

def next(self):
        grid = pd.cut([self.data.close[0]], self.band, labels=self.labels)[0]

        if np.isnan(grid):
            self.log('价格波动超过网格范围: %.2f' %(self.data.close[0]))
            return

        # 价格上涨
        if grid > self.last_grid:
            grid_range = [self.last_grid, grid]
            if self.last_grid == 0:
                self.last_grid = grid
                return
            if self.last_grid != 0:
                if grid_range != self.last_grid_range:
                    self.last_grid = grid
                    self.last_grid_range = grid_range
                    if self.position.size > 0:
                        self.log('SELL CREATE %.2f, cur position: %d' % (self.data.close[0], self.position.size))
                        self.sell(size=self.p.stake)

        # 价格下跌
        if grid < self.last_grid:
            grid_range = [grid, self.last_grid]
            if self.last_grid == 0:
                self.last_grid = grid
                return
            if self.last_grid != 0:
                if grid_range != self.last_grid_range:
                    self.last_grid = grid
                    self.last_grid_range = grid_range
                    if self.position.size < 10:
                        self.log('BUY CREATE %.2f, cur position: %d' % (self.data.close[0], self.position.size))
                        self.buy(size=self.p.stake)  

说明:

  • 如果标的一直没有交易,说明此时标的价格已经超过设置的网格范围,可以调整网格压力位、阻力位;如果只是暂时没有交易,如果不是超过范围,也可以调整网格宽度和数量

  • 怎样记录价格是否突破网格线?使用pandas库提供的cut函数,将当前价格所处的网格区域表示出来。当网格区域发生变化,说明价格突破了一个网格线

结论&交流

关注微信公众号:诸葛说talk,获取更多内容。同时还能获取邀请加入量化投资研讨群, 与众多从业者、技术大牛一起交流、切磋,名额有限,不要错过。

写文章不易,觉得本文对你有帮助的话,帮忙点赞转发赞赏,让笔者有坚持写好文章的动力。

参考

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,网格交易策略是一种基于价格波动的交易策略,它是通过在价格上下方设置一定的间隔来进行交易的。当价格上升到一定水平时,EA会在上方设置卖出单,并在下方设置买入单,以期望在价格波动中获得利润。 下面是一个基本的网格交易策略EA的示例: ```python import MetaTrader5 as mt5 import time # 设置网格交易策略EA的参数 symbol = "EURUSD" grid_size = 20 # 网格大小 grid_spacing = 50 # 网格间距 lot_size = 0.01 # 每笔交易的手数 # 连接MetaTrader 5客户端 mt5.initialize() account_info = mt5.account_info() print(f"账户余额:{account_info.balance}") # 获取当前价格 symbol_info = mt5.symbol_info(symbol) last_price = mt5.symbol_info_tick(symbol).ask # 初始化网格 buy_orders = [] sell_orders = [] for i in range(-(grid_size//2), (grid_size//2)+1): buy_price = last_price - i*grid_spacing sell_price = last_price + i*grid_spacing buy_order = {"type": mt5.ORDER_TYPE_BUY_LIMIT, "symbol": symbol, "price": buy_price, "lot": lot_size} sell_order = {"type": mt5.ORDER_TYPE_SELL_LIMIT, "symbol": symbol, "price": sell_price, "lot": lot_size} buy_orders.append(buy_order) sell_orders.append(sell_order) # 开始网格交易 while True: # 获取当前价格 symbol_info = mt5.symbol_info(symbol) last_price = mt5.symbol_info_tick(symbol).ask # 更新网格 for i in range(len(buy_orders)): if buy_orders[i]["price"] < last_price - grid_spacing: # 关闭过期的买入单 if mt5.order_send(mt5.ORDER_TYPE_CLOSE_BY, buy_orders[i]["symbol"], buy_orders[i]["lot"], buy_orders[i]["price"], slippage=5) == -1: print("关闭买入单失败") # 更新买入单价格 buy_orders[i]["price"] = last_price - (grid_size-i)*grid_spacing buy_orders[i]["ticket"] = mt5.order_send(buy_orders[i]["type"], buy_orders[i]["symbol"], buy_orders[i]["lot"], buy_orders[i]["price"], slippage=5) if buy_orders[i]["ticket"] == -1: print("开启买入单失败") if sell_orders[i]["price"] > last_price + grid_spacing: # 关闭过期的卖出单 if mt5.order_send(mt5.ORDER_TYPE_CLOSE_BY, sell_orders[i]["symbol"], sell_orders[i]["lot"], sell_orders[i]["price"], slippage=5) == -1: print("关闭卖出单失败") # 更新卖出单价格 sell_orders[i]["price"] = last_price + (grid_size-i)*grid_spacing sell_orders[i]["ticket"] = mt5.order_send(sell_orders[i]["type"], sell_orders[i]["symbol"], sell_orders[i]["lot"], sell_orders[i]["price"], slippage=5) if sell_orders[i]["ticket"] == -1: print("开启卖出单失败") time.sleep(1) ``` 上述代码中,我们首先连接了MetaTrader 5客户端,并设置了网格交易策略EA的参数。然后,我们获取了当前价格,并初始化了网格。接着,我们在一个无限循环中不断更新网格,如果价格超出了某一网格的范围,我们就关闭过期的订单并打开新的订单。 需要注意的是,这只是一个简单的网格交易策略EA示例,实际的交易策略需要根据市场情况进行调整和优化。此外,MetaTrader 5中还有许多其他的交易函数和指标,可以用于开发更加复杂的交易策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值