EA中如何计算止损和止赢

楼主  收藏   举报   帖子创建时间:  2019-05-05 05:50 回复:0 关注量:585
[原创转载] macy01.blogcn.com
  
  
  一般一个EA中会定义止损水平和止赢水平,一般大家定义的参数都是int型,即点数。例如下面的变量定义:
  extern int _SlipPage     = 2;   //最大允许滑点数
  extern int _StopLoss     = 30;  //止损水平
  extern int _TakeProfit   = 100; //赢利水平
  extern int _Magic        = 0;   //订单Migc号码
  
  在使用OrderSend开仓的时候,并不能够直接将上面的参数传递给OrderSend,因为OrderSend需要的是真实的市场价位,例如EURUSD开多仓位置为1.5000,则对应止损为1.4970,止赢为1.5100;对于其他货币小数位数可能不同,例如USDJPY。注意事项为:
  (1)如果没有经过转换,或者价位设置错误(例如多单的止损高于入场价位),则会返回错误码130: errorDescription="无效的止损(invalid stops)";
  (2)在传入OrderSend时,最好使用NormalizeDouble(stopLoss,Digits)将参数处理为小数位数合适的Double类型
  
  转换的代码如下面所示:
  
  void Trade()
  {
    double openLots = LotsMgmt();    //开仓手数
    int ticket;                      //订单编号
    double stopLoss=0, takeProfit=0;
   
    if(CheckForOpen()==OPEN_BUY)
    {
      //计算止赢点位
      if(_TakeProfit==0)
        takeProfit=0;
      else
        takeProfit=Ask+_TakeProfit*Point;
        
      //计算止损点位   
      if(_StopLoss==0)
        stopLoss=0;
      else
        stopLoss=Ask-_StopLoss*Point;
            
      //这里止损和止赢必须使用NormalizeDouble处理和相应货币的小数位数对应
      ticket=OrderSend(Symbol(), OP_BUY, openLots, Ask, _SlipPage, NormalizeDouble(stopLoss,Digits),NormalizeDouble(takeProfit,Digits), ORDER_COMMENT, _Magic, 0, Red);  
      if(ticket==-1)
        Print("Error Occured : "+ErrorDescription(GetLastError()));
    }
   
    if(CheckForOpen()==OPEN_SELL)
    {
      //计算止赢点位
      if(_TakeProfit==0)
        takeProfit=0;
      else
        takeProfit=Bid-_TakeProfit*Point;
         
      //计算止损点位   
      if(_StopLoss==0)
        stopLoss=0;
      else
        stopLoss=Bid+_StopLoss*Point;
         
      //这里止损和止赢必须使用NormalizeDouble处理和相应货币的小数位数对应
      ticket=OrderSend(Symbol(), OP_SELL, openLots, Bid, _SlipPage, NormalizeDouble(stopLoss,Digits),NormalizeDouble(takeProfit,Digits), ORDER_COMMENT, _Magic, 0, Green);
      if(ticket==-1)
        Print("Error Occured : "+ErrorDescription(GetLastError()));
    }
  }
打赏