诚信为本
量力而为
当前位置:峰汇在线 ea编程知识 正文

EA编程中移动止损只作用一次,怎么编写?

移动止损在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在本网也有现成的范例,可以直接搜索下载测试。

版权所有转载请注明标题及链接:峰汇在线 » EA编程中移动止损只作用一次,怎么编写?