欢迎来到我们的 MetaTrader4 智能交易系统课程的第四部分!如果您还没有学习,请查看前三期。
到目前为止,我们一直在处理采购订单。但我们是交易者,不是投资者!因此,如果我们的专家顾问也可以做空市场,而不是只买系统,那就太好了。换句话说,我们希望支持做多和做空;买卖。我们仍在开发我们的 Forex Wall-E 专家顾问,所以让我们从中断的地方继续!
买卖订单
我们一直在建立我们的专家顾问,但到目前为止,它只能购买市场。虽然这是一个很好的第一步,但在某些情况下您可能还想出售特定的外汇对!买卖订单之间没有太大区别,但是我们需要记住一些事情。在我们进入代码之前,让我们回顾一下。
买卖
您可能已经在前几期中注意到,每次我们创建买单时,我们都使用Ask 作为OrderSend()函数的参数:
44
|
if (OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask - stopLoss * Point, Ask + takeProfit * Point, "my forex wall-e order" , 12345, 0, Red)) { |
这是因为卖价是卖出该货币对单位的最低价。换句话说,要价是卖家愿意接受的最低价格。当我们购买给定的货币对时,我们使用卖价作为我们的入场价。
另一方面,买入价正好相反:它是购买该货币对单位的人想要给出的最高价格。就像在拍卖中一样,买方然后竞标以获得外汇对的单位。因此,当我们卖出一个给定的货币对时,我们使用买入价作为我们的入场价。
现在,您可能想知道这两个价格之间是否可能存在差异。如果你这么想,那你就完全正确,经常有!Bid 和 Ask 之间的差异称为 Bid-Ask 价差或简称价差。
了解买价和卖价之间的区别很重要,因为一旦我们开始在 Wall-E 专家顾问中支持买卖订单,我们就会同时使用这两者。
什么时候买,什么时候卖?
到目前为止,我们只能创建一个买单。回想一下,输入买单的条件如下:
43
|
if (Ask + 500 * Point < ema) { |
换句话说,我们检查了卖价是否比我们的 300 指数移动平均线低 50 点以上,我们买入。虽然非常基本,但这可以构成均值回归策略的基础,因为我们假设如果价格偏离移动平均线太多,它将返回均值。
让我们再次看看这种只买策略在 2016 年在 EURUSD 4H 图表上的表现:
好吧,不是很好,但也不会亏钱!现在,鉴于上述买入的条件,卖出的条件是什么?
对!如果买入价高于 300 指数移动平均线 50 点以上,我们将卖出!添加这个条件应该不会太难,所以让我们深入研究代码。
为卖单添加代码
在第一步中,我们将在第 47 行之后添加一个代码块。它看起来类似于我们创建买单时的情况,但这会产生相反的效果。请注意,OP_BUY常量已更改为OP_SELL,并且我们使用买价而不是卖价。我们的 if 语句也将更改以检查正确的条件:
48
49
50
51
52
|
if (Bid - 500 * Point > ema) { if (OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + stopLoss * Point, Bid - takeProfit * Point, "my forex wall-e order" , 12345, 0, Red)) { Print( "Sell order succeeded!" ); } } |
对于止损和止盈值,还请注意我们已将运算符从 + 更改为 – 并将 – 更改为 +。在买入订单中,我们的止损将低于入场价,我们的止盈将高于入场价。对于卖单,情况正好相反!
更新我们的追踪止损
还记得在第 3 章中,我们添加了追踪止损吗?到目前为止,这只支持买单,所以我们也需要更新我们的专家顾问的那部分!为此,我们需要稍微更改 TrailStops()函数中第 73 行的 if 语句。这是修改后的代码,带有一个也支持卖单的 if 语句:
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > trailingStop * Point && OrderStopLoss() < Bid - trailingStop * Point) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - trailingStop * Point, OrderTakeProfit(), 0, Green)) { Print( "OrderModify error " , GetLastError()); } return ; } } else if (OrderType() == OP_SELL) { if (OrderOpenPrice() - Ask > trailingStop * Point && OrderStopLoss() > Ask + trailingStop * Point) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + trailingStop * Point, OrderTakeProfit(), 0, Green)) { Print( "OrderModify error " , GetLastError()); } return ; } } |
如您所见,我们添加了一个 else 块来支持卖单(else if ( OrderType() == OP_SELL))。在这个块中,我们检查卖价是否已经低于开盘价减去我们的追踪止损阈值,并且我们检查止损是否真的需要改变。
如果两个条件都有效(或评估为 TRUE),我们将在第 82 行执行 OrderModify() 函数来更改我们的卖单的止损,实质上为我们的卖单实施追踪止损。
重新审视投标和要价
请注意,当我们创建订单时,我们如何使用买单的卖价和卖单的买价。然而,细心的读者可能已经注意到,为了改变我们的止损,我们使用买单的买价和卖单的卖价!这怎么可能?
如果您为外汇对购买手数,我们使用卖价。但是如果你想关闭订单会发生什么?您之前购买的批次将需要再次出售!这意味着角色已经颠倒,您现在将使用出价来获得可能的最佳价格,将您的拍品出售给市场上的其他人。相反,如果您卖出外汇对的手数,我们使用买入价。如果我们想要关闭订单,我们需要再次购买这些手数,这意味着我们使用卖价。
如果这听起来有点令人困惑,请不要太担心。您的交易平台通常会自动处理此问题,但是当我们开发智能交易系统时,这是我们必须明确定义的。只要知道在修改或关闭您的订单时,您可能希望反过来使用 Bid and Ask。
结论
现在我们也为我们的卖单实现了所有代码,让我们再次运行我们的策略测试器。使用与之前相同的参数,我们会得到不同的结果吗?
这确实看起来比我们以前的只买策略更顺畅一些!确保您的策略适用于买卖订单通常会产生这种平滑效果,因为它适用于牛市和熊市。为了获得更好的净值曲线,任何大的洗盘都会被拉平一点。
在本章中,我们研究了三件事:
- 买价和卖价的区别
- 添加条件以创建卖单
- 更新我们的追踪止损以支持买卖订单
我们还没有完全做到这一点,进入和退出交易的条件非常基本,但我们正在缓慢但肯定地扩展我们的专家顾问以包含更多功能。请继续关注下一章,我们将在其中了解头寸规模。
如果您想及时了解本课程下一部分的发布时间,请及时关注我们!