Автоматическая валидация в маркет и

 

Господа, прошу помощи - собственного соображения не хватает.

Имеется ли разница, из какой страны отправляется советник на валидацию?

Один и тот же советник отправляется из России и где-то из США.

Российский результат без ошибок:

test on EURUSD,H1
strategy tester report 258 total trades
test on NZDUSD,H1 there are no trading operations
test on GBPUSDcheck,M30 there are no trading operations
test on XAUUSDcheck,Daily strategy tester report 7 total trades

В США результат с ошибками:

2016.02.03 00:10:00 Tester: not enough money for buy 0.20 NZDUSD at 0.65186 sl: 0.64776 tp: 0.65886 [2016.02.03 00:10]
2016.02.03 00:10:00 Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 130, FreeMargin: -129.36 2016.02.03 00:10:00 ERRATIC_EA__1 NZDUSD,H1: OrderSend error 134

При этом советник однозначно проверяет остаток свободных средств:

if (AccountFreeMargin() <= MarketInfo(Symbol(),MODE_MARGINREQUIRED)*lot) Print("No FreeMargin");
else {
 if (OrderSend(Symbol(),OP_BUY,NormalizeLots(lot),Ask,slippage,NormalizeDouble(SL,Digits),NormalizeDouble(TP,Digits),MQLInfoString(MQL_PROGRAM_NAME),MAGIC,0,Blue)==-1)
     Print(__FUNCTION__," BUY_ORDER_SEND Ask:",Ask," SL:",SL," TP:",TP," lot:",lot,_LastError);
}
 
Sergey Deev:

Господа, прошу помощи - собственного соображения не хватает.

Имеется ли разница, из какой страны отправляется советник на валидацию?

Один и тот же советник отправляется из России и где-то из США.

Российский результат без ошибок:

В США результат с ошибками:

При этом советник однозначно проверяет остаток свободных средств:


PrevBalance: 1.00,

Скорее всего робот слился. Поэтому выдает ошибку. 

Да и проверка свободной маржи, мягко говоря, у Вас неправильная. 


MODE_MARGINREQUIRED

32

Размер свободных средств, необходимых для открытия 1 лота на покупку


Эта функция возвращает размер только на BUy 

и не учитывает то, сколько сейчас уже открыто позиций. 

попробуйте использовать эту функцию:

AccountFreeMarginCheck

Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете.

double  AccountFreeMarginCheck(
   string  symbol,     // символ
   int     cmd,        // торговая операция
   double  volume      // количество лотов
   );





Не замечал, что отправлять с разных стран советника на валидацию - имеют разные результаты. Все везде одинаковое. 


Я думаю этот вопрос лучше адресовать в сервисдеск. Тут Вам точно ничего не ответят. 

 
Vladislav Andruschenko:


попробуйте использовать эту функцию:

AccountFreeMarginCheck

Пробовал - та же самая беда

 
Sergey Deev:

Пробовал - та же самая беда


У меня приблизительно такая конструкция получается:

int tickets=0;
         double _Price_Sell=Bid-_points*_Point;
         if(_Price_Sell!=0)
           {
            if(_stopLoss>0) _sl=NormalizeDouble(_Price_Sell+_stopLoss*_Point,_Digits);
            if(_takeProfit>0) _tp=NormalizeDouble(_Price_Sell-_takeProfit*_Point,_Digits);
            if(_MaxLotCheck(Symbol(),OP_SELL,_Price_Sell,85)>=Lots && AccountFreeMargin()>25)
              {

               tickets=OrderSend(Symbol(),OP_SELLSTOP,Lots,_Price_Sell,0,_sl+stoplvl*_Point,_tp-stoplvl*_Point,"",MAGICMA,0,0);
               if(tickets<0){Print("@@@!!! OP_SELLSTOP ",GetLastError());}
              }
           }
//------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Access functions OrderCalcMargin(...).                           |
//| INPUT:  name            - symbol name,                           |
//|         trade_operation - trade operation,                       |
//|         price           - price of the opening position,         |
//|         percent         - percent of available margin [1-100%].  |
//+------------------------------------------------------------------+
double _MaxLotCheck(string symbol,int trade_operation,
                    double price,double percent)
  {
   double margin=0.0;
//--- checks
   if(symbol=="" || price<=0.0 || percent<1 || percent>100)
     {
      Print("CAccountInfo::MaxLotCheck invalid parameters");
      return(0.0);
     }
//--- calculate margin requirements for 1 lot
   if(!_MarginCheck(symbol,trade_operation,1.0,price) || margin<0.0)
     {
      Print("CAccountInfo::MaxLotCheck margin calculation failed");
      return(0.0);
     }
//---
   if(margin==0.0) // for pending orders
      return(MarketInfo(symbol,MODE_MAXLOT));
//--- calculate maximum volume
   double volume=NormalizeDouble(AccountFreeMargin()*percent/100.0/margin,2);
//--- normalize and check limits
   double stepvol=MarketInfo(symbol,MODE_LOTSTEP);
   if(stepvol>0.0)
      volume=stepvol*MathFloor(volume/stepvol);
//---
   double minvol=MarketInfo(symbol,MODE_MINLOT);
   if(volume<minvol)
      volume=0.0;
//---
   double maxvol=MarketInfo(symbol,MODE_MAXLOT);
   if(volume>maxvol)
      volume=maxvol;
//--- return volume
   return(volume);
  }
//+------------------------------------------------------------------+
//| Access functions OrderCalcMargin(...).                           |
//| INPUT:  name            - symbol name,                           |
//|         trade_operation - trade operation,                       |
//|         volume          - volume of the opening position,        |
//|         price           - price of the opening position.         |
//+------------------------------------------------------------------+
double _MarginCheck(string symbol,int trade_operation,
                    double volume,double price)
  {
   return(AccountFreeMargin()-AccountFreeMarginCheck(symbol,trade_operation,volume));
  }
 
Vadim Konyaev:


У меня приблизительно такая конструкция получается:



а чем эти цифры вычислили? 

if(_MaxLotCheck(Symbol(),OP_SELL,_Price_Sell,85)>=Lots && AccountFreeMargin()>25)
 
Vadim Konyaev:


У меня приблизительно такая конструкция получается:


AccountFreeMarginCheck(symb, ((isbuy) ? OP_BUY : OP_SELL),  lot) > 0

Всегда так прокатывает. И при работе и при валидации.

 
Vladislav Andruschenko:



а чем эти цифры вычислили? 

85 - процент от маржи, 25 - остаток на счете... как-то так
 
Vadim Konyaev:
85 - процент от маржи, 25 - остаток на счете... как-то так
Это понятно. Я про цифры. Почему не 78 процент маржи? И 24 остаток? 

Я и спросил. Эти цифры как то вычислили?  Или просто так захотелось? 
 
Vladislav Andruschenko:
Это понятно. Я про цифры. Почему не 78 процент маржи? И 24 остаток? 

Я и спросил. Эти цифры как то вычислили?  Или просто так захотелось? 
Подбирал... чтоб ошибки не было
 
Sergey Deev:

Господа, прошу помощи - собственного соображения не хватает.

Имеется ли разница, из какой страны отправляется советник на валидацию?

Один и тот же советник отправляется из России и где-то из США.

Российский результат без ошибок:

В США результат с ошибками:

При этом советник однозначно проверяет остаток свободных средств:

Я использую вот эти функции

MQL5

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

MQL4

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,type,lots);
   //-- если денег не хватает
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- проверка прошла успешно
   return(true);
  }
Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • 2016.07.19
  • MetaQuotes Software Corp.
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
Причина обращения: