移动止损在EA交易中有着广泛的运用,从移动止损的执行方式上大致可以分为两种:一是达到某种条件后一次性修改止损,也可以叫一次性移动止损;二是达到某种条件后随价格跳动盈利扩大同步移动止损,这种方式较常用。下面我们以实际价格来演示这两种方式的移动止损:
1、一次性移动止损:比如在1800开黄金多单,初始止损1797。现在设置盈利5美金的时候一次性保护3美金。执行的交易动作是当价格上涨到1805后将止损修改到1803的位置,一旦成功,之后便不再执行了。
2、循环移动止损:同样在1800开黄金多单,初始止损也是在1797。而设置盈利5美金后回调2美金就平仓。执行的交易动作是当价格上涨到1805后将止损修改到最新价格下面2美金位置(第一次是修改到1803),之后,价格每上涨一点,止损就上移一点,始终和最高报价保持2美金的距离。
分析这两种方式的移动止损,就会发现它们的共同点是:1、都有一个激活或者说启动条件;2、激活后都是执行订单修改指令;3、都是将订单止损往盈利的方向移动。
从逻辑上来说,移动止损的修改止损都需要有个参照价格,我们可以细细研究两种方式移动止损的不同之处,那就是参照价格不同:一次性移动止损修改止损是以订单开仓价格为参照价格;循环移动止损修改止损是以最新价格为参照价格。
市场最新价格是动态的、不断刷新的,所以循环移动止损就随最新价格在同步移动止损;而一个订单的开仓价格是固定的、不会改变的,所以一次性移动止损就可以做到只执行一次。
以上面演示的价格为例,一次性移动止损参考代码如下:
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-OrderOpenPrice() > 500*Point)
{
if(OrderStopLoss() < OrderOpenPrice() + 300*Point || OrderStopLoss()==0)
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 300*Point,OrderTakeProfit(),0))
{
Print("OrderModify BUY-SL Error #",GetLastError());
}
}
}
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderOpenPrice()- Ask > 500*Point)
{
if(OrderStopLoss() > OrderOpenPrice() - 300*Point || OrderStopLoss()==0)
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 300*Point,OrderTakeProfit(),0))
{
Print("OrderModify SELL-SL Error #",GetLastError());
}
}
}
}
}
代码中的500、300表示黄金跳动的5美金和3美金,如果黄金小数点后面是三位数,那么再多加个0。当然,这里只是示范,其意思是盈利5美金执行一次性保护3美金的移动止损功能。实际编程中通常都是将这两个设为输入参数以便设置或调整。另外,上面所说的两种方式的移动止损EA在本网也有现成的范例,可以直接搜索下载测试。