5.3 移动停损

5.3 移动停损

我们也可以用交易单回路修改多张交易单。移动停损就是常见的例子。移动停损会随着交易单获利而以交易单价格上下移动停损。移动停损可“锁定”获利,并提供绝佳的损失保障。

移动停损以最大点数表示。例如,移动停损若设为50点,则你的停损永远会在价格的50点内。如价格反转,获利下降,停损就留在原地。停损仅往获利的方向移动,不会反向移动。

修改移动停损时,须查看目前市价和停损价的点差是否大于移动停损。若是,停损就会被修改,这样距离目前市价的点差才会等于移动停损的点差。

移动停损依平仓价来计算,平仓价就是买单的买价或卖单的卖价。请注意:平仓价与入单价正好相反。

我们来检查修改移动停损之代码。首先,我们声明移动停损设定的外部变量:

以下的源代码会检查所有市价买单,并在必要时修改停损:

以OrderSelect()选择交易单库后,用目前的买价减去停损设定,再乘以PipPoint(),来确定最大移动停损间距。此间距会储存在变量MaxStoploss中。

在其他情况之下,如果你同时下单其他报价商品,我们会使用MQL功能NormalizeDouble()将MaxStopLoss变量舍入至正确的小数字数。MetaTrader的报价最髙可达8位小数。透过使用NormalizeDouble(),我们将报价舍入至4位或5位位小数(日元报价为2~3位小数)。

接着,获取目前选定之交易单的停损,并用NormalizeDouble()舍入,以保证策划的安全。我们指定此值给变量CurrentStop。

然后,查看目前的交易单是否需要修改。如自定义数字、符号及交易单类型都符合,而且目前的停损(CurrentStop)小于MaxStopLoss,就修改交易单的停损。我们把MaxStopLoss变量当作新的停损传送至OrderModify()功能。

如OrderModify()功能不成功,就会执行错误处理程序,而且目前价格信息、单号、目前停损及修改停损都会打印至日志中。

卖单的移动停损条件不同,须个别讨论。这里是修改卖单的条件:

请注意条件(CurrentStop>MaxStopLossz//CurrentStop==0)。若下单时未设停损,则条件CurrentStop>MaxStopLoss永远不会成立,因为MaxStopLoss永远不会小于零。因此,我们加入Or条件,CurrentStop==0。