求教MT5 EA发布遇到Invalid volume错误

 

大家好,

我在发布新版本的时候,遇到了Invalid volume错误,但是我可以肯定手数计算没有问题,我也使用1.67手进行本地测试均没有问题,也改为了更小的手数也仍然不行。

并且之前版本从未遇到过类似问题,请大家帮我看一下,以下是错误信息和相关代码。


bool TradeClass::SendOrder(const ENUM_ORDER_TYPE _OP,
                           const double _lots = DEFULT_TRADE_LOT,
                           const int _SL = DEFULT_TRADE_SL,
                           const int _TP = DEFULT_TRADE_TP,
                           const double _Price = 0,
                           const datetime _Expiration = 0) {
   ExeResultInt = OrderObj.OrderTotal[ORDER_TYPE_BUY_LIMIT] + OrderObj.OrderTotal[ORDER_TYPE_BUY_STOP] + OrderObj.OrderTotal[ORDER_TYPE_SELL_LIMIT] +OrderObj.OrderTotal[ORDER_TYPE_SELL_STOP];
   if(SymbolMaxOrder != 0 && ExeResultInt >= SymbolMaxOrder-1) return false;
   double SL,TP,Lot=NormalizeDouble(_lots,2);
   if(_lots >= MaxLot) Lot=MaxLot;
   else if(_lots <= MinLot) Lot=MinLot;
   SL = _SL != 0 ? SLTransfer(symbol,_OP,_SL,_Price) : _SL;
   TP = _TP != 0 ? TPTransfer(symbol,_OP,_TP,_Price) : _TP;
   t.SetExpertMagicNumber(MagicNumber);
   t.SetDeviationInPoints(Slippage);
   t.SetTypeFilling(ORDER_FILLING_IOC);
   if(_OP == ORDER_TYPE_BUY || _OP == ORDER_TYPE_SELL) {
      if(MathAbs(ASK(symbol) - BID(symbol)) > MaxSpread) return false;
      if(SL != 0 && !CheckSL(_OP,SL,Price(_OP,_Price))) return false;
      if(TP != 0 && !CheckTP(_OP,TP,Price(_OP,_Price))) return false;
      if(CheckMoneyForTrade(Lot,_OP)) {
         ExeState = t.PositionOpen(symbol,_OP,NormalizeDouble(Lot,2),Price(_OP,NormalizeDouble(_Price,digits)),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),Comment);
      }
   } else {
      if(!CheckPrice(_OP,_Price)) return false;
      if(SL != 0 && !CheckSL(_OP,SL,Price(_OP,_Price))) return false;
      if(TP != 0 && !CheckTP(_OP,TP,Price(_OP,_Price))) return false;
      if(CheckMoneyForTrade(Lot,ORDER_TYPE_BUY)) {
         if(_OP == ORDER_TYPE_BUY_LIMIT) {
            ExeState = t.OrderOpen(symbol,ORDER_TYPE_BUY_LIMIT,NormalizeDouble(Lot,2),NormalizeDouble(_Price,digits),NormalizeDouble(_Price,digits),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),0,0,Comment);
         } else if(_OP == ORDER_TYPE_SELL_LIMIT) {
            ExeState = t.OrderOpen(symbol,ORDER_TYPE_SELL_LIMIT,NormalizeDouble(Lot,2),NormalizeDouble(_Price,digits),NormalizeDouble(_Price,digits),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),0,0,Comment);
         } else if(_OP == ORDER_TYPE_BUY_STOP) {
            ExeState = t.OrderOpen(symbol,ORDER_TYPE_BUY_STOP,NormalizeDouble(Lot,2),NormalizeDouble(_Price,digits),NormalizeDouble(_Price,digits),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),0,0,Comment);
         } else if(_OP == ORDER_TYPE_SELL_STOP) {
            ExeState = t.OrderOpen(symbol,ORDER_TYPE_SELL_STOP,NormalizeDouble(Lot,2),NormalizeDouble(_Price,digits),NormalizeDouble(_Price,digits),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),0,0,Comment);
         }
      }
   }
   if(ExeState) OrderObj.RefreshOrderInfo();
   else printf(__FUNCTION__+" Failed to send order : "+GetLastError());
   return ExeState;
}
 
jianbin huang:

大家好,

我在发布新版本的时候,遇到了Invalid volume错误,但是我可以肯定手数计算没有问题,我也使用1.67手进行本地测试均没有问题,也改为了更小的手数也仍然不行。

并且之前版本从未遇到过类似问题,请大家帮我看一下,以下是错误信息和相关代码。


可以查看货币对允许的仓位最小步进单位是多少手,仓位最小步进单位是0.01手的一般不会出现错误,有时候不是所有的品种都一样的哦。
 

你在本地計算的單量沒錯 但是MQL修改了品種的規格 審核時就會出現錯誤

可以試試 根據錯誤提示發布的相關連接 開發一個通用的單量計算器

MQL在審核EA公布測試 最小單量 最大單量 單量步進 掛單間隔...等等 會用一些隨機性的數據測試 並非我們正常交易使用的

目的在測試公布EA的通用性  你可以把EA改成通用性 然後在產品說明上建議用戶使用特定品種

 
是不是账户类型限制不能下0.01单位的数字