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>MaxStopLoss//CurrentStop= =0)。若下单时未设停损,则条件CurrentStop>MaxStopLoss 永远不会成立,因为MaxStopLoss永远不会小于零。因此,我们加入Or条件, CurrentStop= =0。


