EA实盘漏单严重,请求朋友们指点!

 

针对MT4所写的EA, 加载到MT4平台服务器实盘,总是很多时候该下单而没有反应,也没有报错。

但用该平台该服务器的历史数据进行回测又十分准确,无一漏单。

郁闷中....

   static datetime tK=0,tD=0;



         // 空单条件成立 且止损价已确定
         if(Sell && S止损价!=0)
           {
            // 计算空单手数(非固定手数)
            if(fix_Lot==false)
              {
               if(AccountEquity()-HCc()-MCc()-HLs()!=0 && 止损金额/(AccountEquity()-HCc()-MCc()-HLs())!=0 && 止损金额/(AccountEquity()-HCc()-MCc()-HLs())>sLr/100) // 不等于0 即除数不能为0
               Lot=NormalizeDouble(Lot*(sLr/100/(止损金额/(AccountEquity()-HCc()-MCc()-HLs()))),dit);
              }
            if(Lot<MinL) Lot=0;  if(Lot>MaxL) Lot=MaxL;
            // 开现价空单或挂单
            if(Lot>0 && tK!=iTime(_Symbol,PERIOD_H1,0))
              {
               if(上根K线收盘价<=SymbolInfoDouble(_Symbol,SYMBOL_BID))
                 {
                  res=OrderSend(_Symbol,OP_SELL,Lot,Bid,30,S止损价,0,"EA", magic,0,clrNONE);
                  if(res>0)  tK=iTime(_Symbol,PERIOD_H1,0);
                 }
               if(res<=0)
                 {
                  if(gua<1)  reg=OrderSend(_Symbol,OP_SELLLIMIT,Lot,上根K线收盘价,30,S止损价,0,"EA", magic,0,clrNONE);
                  if(reg>0)  tK=iTime(_Symbol,PERIOD_H1,0);
                  else       Print("OrderSend failed with error #",GetLastError());
                 }
              }
           }

         // 空单条件成立 且止损价已确定
         if(Buy && B止损价!=0)
           {
            // 计算多单手数(非固定手数)
            if(fix_Lot==false)
              {
               if(AccountEquity()-HCc()-MCc()-HLs()!=0 && 止损金额/(AccountEquity()-HCc()-MCc()-HLs())!=0 && 止损金额/(AccountEquity()-HCc()-MCc()-HLs())>sLr/100) // 不等于0 即除数不能为0
               Lot=NormalizeDouble(Lot*(sLr/100/(止损金额/(AccountEquity()-HCc()-MCc()-HLs()))),dit);
              }
            if(Lot<MinL) Lot=0;  if(Lot>MaxL) Lot=MaxL;
            // 开现价多单或挂单
            if(Lot>0 && tD!=iTime(_Symbol,PERIOD_H1,0))
              {
               if(上根K线收盘价>=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-点差折算)
                 {
                  res=OrderSend(_Symbol,OP_BUY,Lot,Ask,30,B止损价,0,"EA", magic,0,clrNONE);
                  if(res>0)  tD=iTime(_Symbol,PERIOD_H1,0);
                 }
               if(res<=0)
                 {
                  if(gua<1)  reg=OrderSend(_Symbol,OP_BUYLIMIT,Lot,上根K线收盘价+点差折算,30,B止损价,0,"EA", magic,0,clrNONE);
                  if(reg>0)  tD=iTime(_Symbol,PERIOD_H1,0);
                  else       Print("OrderSend failed with error #",GetLastError());
                 }
              }
           }
 

測試頁面改一下滑點的設置

EA代碼也要調整下滑點

回測是完美交易環境 模擬盤跟實盤並不是完美交易環境

 
代码下单是有限制的,一个小时只下一次单,要考虑是否条件满足,但不到一小时的情况,仅供参考
 

EA没有按照自己的设计逻辑运行,那就需要逐步排查错误,最简单的排查方法就是在每个交易条件之后添加Alert来查看,比如第1个条件之后添加Alert("EA运行到位置1这里了",条件值1); 第2个条件之后添加Alert("EA运行到位置2这里了",条件值2);后面的条件依此类推,这样你就知道EA运作到哪个条件之后就停住不动了,对比打印出来的数值跟逻辑预期到底对不对,祝你好运。

 

感谢几位朋友的指点

反复找原因,发现问题是:Lot计算时用到月线最高价,而月K线数有时候未能获取到, 导致Lot为0

   int  bars=Bars(Symbol(),43200);
   if(bars<=0) //无有效月K线
     {
      bool synchronized=false;
      int  attempts=0;
      while(attempts<5)
        {
         if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED))  { synchronized=true; break; }
         attempts++;
         Sleep(200);
        }
      if(!synchronized)
        {
         Print("Failed to get number of bars for ",Symbol());  idisplay("-1", "无法获取月K线数", 308,53,12, Clr);
        }
     }
   double     HighPrice=0, Contract=MarketInfo(Symbol(),MODE_LOTSIZE);         // 以基础货币计算的手数  即合约
   if(bars>0) HighPrice=iHigh(Symbol(),43200,iHighest(Symbol(),43200,MODE_HIGH,bars-1,1)); // 本月之前最高价

   if(HighPrice*Contract/100!=0)  Lot=NormalizeDouble(AccountEquity()/(HighPrice*Contract/杠杆)*仓位比例,dit);
 
bool类型的 标示符SERIES_SYNCHRONIZED (同步数据)  MT5文档有介绍,

但在MT4文档中  未列出该标示符。 不过对于MT4最新版,实际也是可用的。