[交易杂谈]唉,挂单又挂不上了,到底怎么回事!
如果是在 mt4 或 mt5 用人工交易,下即时单或挂单或修改止盈损价格,是 不会 发生挂单或止盈损无法挂上的问题,因为 mt4/mt5 的人工下单窗口对于设置无法下单成功的设置,在按下下单或是修改按键,那个按键将会是灰色而无法执行的,直接挡住会失败的价格设置。
会有挂单或是修改止盈损价格问题的,会是在 ea 的下单处理上,这和 ea 的下单或是检查机制是否判断正确,也和生成这个 ea 策略的思维是否考虑这些细节有关。
下面对于 mt4/mt5 处理即时单和挂单和止盈损设置的价格机制作一个完整的说明。
在 mt4/mt5 的任何商品的即时价格都有两个价格,以下图 ETHUSD 以太币 的下单窗口为例,即时价格比较低的是蓝色的 bid 价格,比较高的价格是红色的 ask 价格。这个和股票期货看盘软件的买卖上下几档价格概念是类似的。
1. 即时单
多单成交将会用当时的价格比较高的 ask 价格来成交
空单会是用价格比较低的 bid 价格来成交
所以这个平台的 ETHUSD 即时 bid 价格 1817.67 即时 ask 价格 1820.32,点差就是 1820.32 - 1817.67 = 265点。
接下来导入每个商品的 stop level 点数的概念。每个 mt4/mt5 平台对于每个商品都有 stop level 点数的规格,在 mt4/mt5 商品价格列表,鼠标右键点击,出现一个选单,选择‘规格’,就会看到这个商品规格窗口。停损级别点数 就是 mt4/mt5 英文交易术语的 stop level 点数的中文,这个点数也可能是 0。通常冷门商品或是贵金属股指,这个 stop level 点数都会大于外汇直盘商品的 stop level 点数。
所以这个平台 ETHUSD 的 stop level 点数就是 44 点。mql4/mql5 获取每个商品的 stop level 点数函数是 SymbolInfoInteger(Symbol(), ,SYMBOL_TRADE_STOPS_LEVEL) 返回是整数值,单位是那个商品的点数。
如果 stop level 显示是 0,不代表止盈损或挂单没有价格限制,只是在后续说明里,用 bid 或 ask 作基准时,改为上下加 0 点限制,还是有限制的。
2. 止盈损价格设置限制
多单的止盈价格需要设置在即时 bid 价格的上方再加 stop level 点数更高的价格,也就是 1817.67 加 44 点 等于 1818.11 以上的价格才能设置止盈价格成功。
止损价格需要设置在即时 bid 价格下方再减 stop level 点数更低的价格,也就是 1817.67 减 44 点 等于 1817.11 以下的价格才能设置止损价格成功。
为何多单的止盈损限制是用 bid 价格作基准,因为多单的平仓是靠 bid 价格来作,所以 mt4/mt5 平台对于多单的止盈损价格设置限制是以 bid 作基准。
空单止盈损价格设置限制 - 在上述的 bid 改为 ask 和上下方向作反向叙述。
3. 如果这个多单在 1820.32 位置成交,那要设置止盈 1000 点和止损 1000 点要如何设置?
多单要设置可以获利或是亏损刚好 1000 点的基准,不是用上面多单例子的 bid 而是用成交价 ask 价格来作基准(空单相反)。
如果成交在 1820.32 ask 价格,止盈价格设置在 1820.32 + 1000点 = 1830.32,开仓价格是 1820.32 平仓价格是 1830.32,这样相减,获利才会是 1000 点。但是当行情往上走到 1830.32 可以获利平仓这个多单,多单平仓价格是靠 bid 价格,也就是 bid 是从 1817.67 走到 1830.32,这样行情实际是走了 1000 + 265 点差 = 1265,毕竟点差是成本,要获利 1000 点,必须行情再多走了点差的距离 265 点。
如果是止损价格设置在 1820.32 - 1000点 = 1810.32,开仓价格是 1820.32 平仓价格是 1810.32,这样相减,亏损才会是 1000 点。但是当行情往下走到 1810.32 可以亏损平仓这个多单,多单平仓价格是靠 bid 价格,也就是 bid 是从 1817.67 走到 1810.32,这样行情实际是才走了 1000 - 265 点差 = 735 点,毕竟点差是成本,要亏损 1000 点,必须行情只需走减少点差的距离,735 点就可以达到止损价格,也就会亏损 1000 点。
有些饶舌,但是从点差就是买卖成本的概念,就可以容易理解这个点差点数在行情实际走多少点就达成预期的止盈或止损点数。
4. 挂单价格限制
如果在上方挂 buy stop, 挂单价格需要高于 ask 价格 1820.32 再加 stop level 44 点,也就是 buy stop 挂单价格需要高于 1820.76。
如果在上方挂 sell limit, 挂单价格需要高于 bid 价格 1817.67 (和上面的 buy stop 用不同的基准价格) 再加 stop level 44 点,也就是 sell limit 挂单价格需要高于 1819.11。
如果在下方挂 sell stop, 挂单价格需要低于 bid 价格 1817.67 再减 stop level 44 点,也就是 sell stop 挂单价格需要低于 1817.23。
如果在下方挂 buy limit, 挂单价格需要低于 ask 价格 1820.32 (和上面的 sell stop 用不同的基准价格) 再减 stop level 44 点,也就是 buy limit 挂单价格需要低于 1819.88。
一个设计完整的 ea,对于挂单下单前的判断会比即时单的处理增加许多检查代码,上面的价格限制都需要预先设计在 ea 里作判断,另外如判断无法在那时挂单成功,是否后续要补挂,还是用当时可以挂上的价格来挂单,或用即时单来直接下单?如果 ea 卸载或是关闭 mt4/mt5,没有成交的挂单是否要在关闭前先作删除?这些都是需要在思考挂单策略时先考虑的细节。
如果不是套小点差获利的剥头皮策略,用触价下即时单来下单和提前用挂单下单,在 ea 的获利概率上其实差别并不大,并不需要拘泥在挂单会对策略的改善有太大的改进。
个人提供 MT4/MT5 EA 或 指标定制编程代写服务,有兴趣可扫描下方二维码添加晓辉编程为好友,进行详细沟通。