在莫斯科交易所(MOEX)里使用限价订单进行自动网格交易
概述
本文详细讲述了采用 MQL5 语言开发 网格交易策略 EA 的方法。 该 EA 采用网格策略,面向 MetaTrader 5 终端,并在 MOEX 上进行交易。 EA 包括了依据止损和止盈平仓,以及在某些市场条件下取消挂单。
1. 网格交易
本文将研究网格 EA 的应用,旨在 MOEX 上自动化交易期货合约。 该 EA 能够在特定价格范围内,按照指定间隔下订单。
在网格交易过程中,会在设定价格之上和之下分别放置订单,从而创建一张订单网格,其价格逐级升高和降低。
例如,您可以针对 VTB Bank (PJSC) — VTBR-6.22 (VBM 2) 的普通股期货合约,在低于市场价格 100 卢布价位处放置买入订单,,以及在每高于市场价格 100 卢布价位处放置一笔卖出订单。 如此,即可从各种条件下进行的交易里获益。
当价格在预定范围内波动时,网格交易非常适合这种波动和“横盘”行情。 这种交易方式能够在价格变化幅度不大的情况下盈利。 网格级别越频繁,从事的业务频率就越高。 不过,这会导致消耗更高的成本,因为每笔订单的利润变得更薄。
因此,有必要找到一个折衷方案,即在大量交易的同时赚取少量利润;亦或交易策略的订单较少,但利润较大。
您可以通过设置上/下边界和栅格频率来自定义网格设置。 创建网格后,EA 会自动遵照预先计算的价格放置买卖订单。
我们看看它是如何工作的。 假设您预计 VBM 2 期货合约价格在未来 7 天内在 1600 至 2800 卢布之间波动。 在这种情况下,您可以设置网格交易,以便在预测范围内进行交易。
在网格交易面板中,您可以设置策略参数,包括:
-
价格范围的上限和下限;
-
可在指定价格范围内放置订单数量;
-
在每笔买卖限价订单之间的步长。
图例 1. 放置订单网格
在这种情况下,随着 VBM 2 期货价格下降至 1600 卢布,网格 EA 将以低于市场价格的价格累积持仓。 当价格开始回填时,EA 将以高于市场价格卖出。 该策略试图在价格方向逆转时扭亏为盈。
2. 金融市场上大多数资产价格走势类型均适合交易系统
交易策略的入场点与品种的行情走势息息相关。 这意味着您可在任意时刻扩展网格(执行入场成交)。 正如您可能知道的,大多数时候行情都会出现波动。 该 EA 是专门为这种行情条件创建的,遵循所谓的典范 — 低买高卖。
网格交易最优选横盘类型,当价格局限在某个范围内移动,且没有明确定义的方向时。 突破边界,通常意味着横盘行情的结束和新趋势的开始。
当价格在强力支撑和阻力价位之间挤压时,形成了一个宽幅的横盘. 无论是多头还是空头都不足以获得绝对胜利,因此不会出现新的趋势。 所有这些定义针对每个品种都是严格独立的,且只在特定品种行情走势的背景下才予以考虑。
如果我们研究这种交易方式的一般情况,那么,若在 MOEX 上交易了大约一个月的 VBM 2 期货合约,即使存在从低边界 1600 到上边界 2800 的单向(一般最终)移动,以及存在价格波动(从主要走势回踩)的情况下,总盈利也超过了一般亏损,结果就是,订单全被激活,然后重置限价买卖订单。
所交易品种在价格水平间的波动(在范围内),能让我们在选定时间区间内,提升由该网格交易方式获得的利润。
网格 EA 在每笔订单中的交易手数均采用相同值,因此您需要基于这种交易方法规划您的资金管理。
从横盘的一侧边界回踩的交易,假设会持续到横盘的另一侧边界。 当运用这种交易方法时,重要的是要考虑到会不会遇到能够引发强劲走势的重要新闻。 此外,出于安全原因,在范围之外应设置止损。
3. 网格交易的特点和好处
设置网格后,EA 不会向其内添加新的外部订单,直到当前网格全部平仓,盈亏尤天。
基于交易系统的建议:选择的品种应具有足够的交易量和清晰走势。 此外,最好排除持仓滚动续期,这样其市场深度就不会是空的。 此外,避免由新闻引发的无回踩单边走势 。
该交易系统涉及采用平均摊薄层级交易(Nayman E. 交易大师:秘密资料, 134 页),当您以更好的价格如前执行相同的操作时(多头买入或空头卖出)。
平均摊薄的主要缺点是您事先不知道行情如何对您不利。 于此同时,平均摊薄需要投入额外的保证资金,从而增加您的持仓风险。 大多数新萌交易者都会犯一个常见的错误 — 为了追求高利润,他们令自己的账户处于“超负荷”状态,把杠杆比率提升到绝对惊人的程度,有时甚至会爆仓,耗尽所有可用资金(Nayman E. “大师交易:秘密资料”, 135 页)。
这种交易方式的主要特点是能够设置最小和最大价位的数值,从而确保在交易品种的指定价格范围内利用限价订单进行交易。
通过设置上下两个价位的止损,您可以限定交易账户的亏损。
当触发止损时,终端通知价格突破预设价位,及其走势可能的突破朝向。 因此,可能需要重新分析价格层级,并在网格交易 EA 的外部参数中设置其值(见下文)。
4. 实现网格交易
4.1. 网格交易机制网格交易阶段:
-
初始结构 - EA 在选定的交易品种上启动
-
当触发您在网格里放置的第一笔订时,开仓
-
当后续网格订单不断触发(增加或减少初始持仓)时,网格将更新
-
止损、止盈、当前持仓的交易时间限制、您可自行决定离场的盈利 %
-
通过网格 EA 控制交易 — 当前盈利的网格交易平仓的时段,若交易品种有新的相关高点和低点时将其重置
该网格策略开始时没有初始持仓。 初始持仓将在初始启动,行情移动超过最近的挂单价格时被激活。
例如
假设您在 2022 年 1 月 4 日设置策略参数如下:
- 合约: 期货 VBM 2
- 价格下限:1,600 卢布
- 价格上限:2,800 卢布
- 网格中的元素数:10
- 模式: 等距
假设您已将策略参数设置如下:
初始中性网格买入订单将低于当前市场价格。 同期,卖出订单将高于当前市场价格。 触发最近的买入或卖出限价单后,将要发生的过程 — 我们称之为交易网格激活。 9 笔订单将在以后的交易中用到。
按订单类型,价格分布如下:
- 限价买入: 1,600 卢布, 1,733 卢布, 1,866 卢布,1,999 卢布
- 限价卖出: 2,135 卢布, 2,268 卢布, 2,401 卢布, 2,534 卢布, 2,667 卢布, 2,800 卢布
(您还可以根据 D1 上的 ATR 指标百分比,根据经验考虑在网格中排列订单的最佳选项,从而以中等风险赚取获最佳利润)。
所有已执行订单的摘要。
每笔业务由相应的配对买卖订单组成,交易类型 – FILO (先进,后出). 利润可以根据每笔配对的买卖订单计算。
范围从下边界(LOW_PRICE_BuyLim)到上边界(HIGH_PRICE_SellLim),并依据指定的订单数量(Number_of_elements_in_the_grid)等间隔划分,。 建议独立查看,并选择网格中的订单范围和数量(从 3 开始),以便订单之间的总宽度高于品种的点差,且边界的价格值在当前价格范围之外。
此外,价格范围的上边界 HIGH_PRICE_SellLim 应超过范围的下边界 LOW_PRICE_BuyLim。
4.2. 更新网格
每次达到其中一个价格层级时,即限价订单被执行时,都应更新网格。 最后执行的订单始终为空,然后以设定价格执行买入和卖出限价订单,如下例所示。
例如,在这种情况下,当网格策略由第一笔卖出限价订单激活之后,随后 VBM2 期货合约走势上扬;及至激活下一笔卖出限价订单之后,网格的下半部分(买入限价订单数量)增加 1 笔买入限价订单 - 相较于网格的上一笔买入限价订单高出 1 个步长(更接近价格)。
特别是,在激活第一笔卖出限价单后,网格交易被激活,价格走势上扬;鉴于网格已被激活,网格每层级的限价如下:
价格, 卢布 | 订单/持仓方向和类型 |
---|---|
2,534 | 由限价订单而来的卖出 |
2,401 | 由限价订单而来的卖出 |
2201.5 | 持仓为最初两笔卖出限价订的交易量 |
2,132 | 由限价订单而来的买入 |
1,999 | 由限价订单而来的买入 |
1,866 | 由限价订单而来的买入 |
1,733 | 由限价订单而来的买入 |
1,600 | 由限价订单而来的买入 |
这显示在下图中:
图例 2. 网格被激活,并触发下一笔限价订单后,更新订单网格
因此,继续更新网格订单。
网格参数:
//+------------------------------------------------------------------+ //| EXTERNAL GRID VARIABLES //+------------------------------------------------------------------+ input int Volume = 1; //Contract/lot volume input double HIGH_PRICE_SellLim = 2800.00; //HIGH_PRICE_SellLim (the upper price of the last SellLim grid order) input double LOW_PRICE_BuyLim = 1600.00; //LOW_PRICE_BuyLim (the lower price of the last BuyLim grid order) for BuyLim input double HIGH_PRICE_SL = 100.00; // HIGH_PRICE_SL: SL in points from HIGH_PRICE_SellLim (the upper stop loss price) for SellLim input double LOW_PRICE_SL = 100.00; // LOW_PRICE_SL: SL in points from LOW_PRICE_BuyLim (lower stop loss price) for BuyLim input int Pending_order_period = 12; // Pending_order_period: limit order setting time in months input int Number_of_elements_in_the_grid = 10; // Number of elements in the grid (number of limit orders) input double TakeProfit = 0; // TakeProfit from the setting price in order pips input double Profit_percentage = 0; // Profit_percentage - grid closure % in profit // works if > "0" input bool Continued_trading = false; // Continued_trading - whether to continue trading after exiting by the grid closure % with profit input int Time_to_restrict_trade = 0; // Time_to_restrict_trade - setting the expiration time (in days) for a position with profit // (exiting the market upon the period end in days) input int Magic = 10; // Magic Number
外部变量的名称及其解码已尽详尽精,因此不需要额外的注释。
此外,我们设置变量
HIGH_PRICE_SellLim
不低于上边界
LOW_PRICE_BuyLim
不低于 MOEX 定义(设置)值的下限值:
https://www.moex.com/en/contract.aspx?code=VTBR-6.22
所有必要的数据显示在 MOEX 品种参数之中(图例 3)
图例. 3. 品种参数 - VTB 银行(PJSC)VTBR-6.22 普通股期货合约
交易方式如图例 4.2 所示。
结果就是,在启动此处所述的网格交易 EA 后,您应获得关于机器人所处交易品种的详细信息(图例 4.1 和 4.2):
图例 4.1. 针对 VTBR-6.22 启动网格 EA
如果止损和止盈的数值不为零,则除了激活买入和卖出限价订单值外,它们的价位也将显示在交易终端中:
图例 4.2. 在 VTBR-6.22 上使用网格 EA,止损和止盈值均非零
结果就是,我们拥有一个限价订单网格,当最低和最高价格范围内全部激活后,重新设置。
只要所交易品种的价格还位于价格范围内,网格 EA 就在交易账户上不断累积利润。 即便我们考虑到这种网格交易的一个明显缺陷,即,若遇到任何方向上的强劲走势,都不会有回滚,由此也不会出现按预期在一定价格范围内的移动,我可以如下这般说:
- 首先,这种走势并不“频繁”,
- 第二,当价格离开正确选择的范围和订单数量时,账户上已经赚取了足够的利润,可弥补当前的亏损,
- 第三,只有价格不断在价格范围的最大值和最小值之间波动(移动),买卖频繁成交,交易账户就会盈利。
结束语
与整个基于网格的交易方法一样,这里研究的网格 EA 需要把价格控制在指定范围内。 当价格接近其边界时,有可能限价订单停止网格交易,并在新的范围内,以新的交易量重新开始。
可以创建网格从趋势(该选项将在本文的下一部分介绍)或范围(在本文中描述)中获利。 基于网格的交易研究的是依靠 EA 进行交易,并要不断重置限价订单,即,只要价格继续横盘波动,就要执行买卖双向订单。
通过设置限价单的止损价位来控制单边价格走势的风险。 结果就是,这里提供的 EA 允许我们避免突然的市场暴跌(暴涨),因为通常随后就是调整性价格走势。 换言之,如果我们选择价格范围、合约价值、网格订单数量,以及正确计算止盈和止损,我们就能够避免回撤,无需不断监控市场。
此处讨论的网格策略不应被视为财务或投资建议。 根据您的判断和风险使用网格交易,这意味着您自己要依据财务能力量力而行,控制并合理地运用交易方法。
参考:
Nayman, E., (2002). 交易大师: 秘密资料。 莫斯科, Alpina 出版发行 (俄语)。
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/10672