Проблемы с 200 Билдом.

 

Обновился до 200 билда, решил потестить советника и столкнулся с такой проблемой. При запуска советника на парах USDJPY и EURJPY в журнале появляется следующее:

 
Как видно из скриншота, на указанных парах тестер неверно подсчитывает размер лота!
В советнике есть проверка свободных средств и при визуальном тестировании он выдает соответствующее сообщение через Coment. На EURUSD все нормально. Это баг или как?
 
DEan:
Как видно из скриншота, на указанных парах тестер неверно подсчитывает размер лота!
Из скриншота не видно, что это делает тестер.

DEan:
Это баг или как?
Это баг. Однозначно.
 
Irtron:
DEan писал (а):
Как видно из скриншота, на указанных парах тестер неверно подсчитывает размер лота!
Из скриншота не видно, что это делает тестер.

Взгляните в левый нижний угол скрина, там явно читается!
 

Взгляните в левый нижний угол скрина, там явно читается!

К сожалению, этого недостаточно. Опубликуйте полный код эксперта, пожалуйста.
 
Думаю полный код Вам врятли нужен, а вот подпрограммы, отвечающие за открытие ордера, привожу:
//=======================================================================================================//
int CheckForOpen()
   {
    double sStopLoss,sTakeProfit,bStopLoss,bTakeProfit;
    
    if(StopLoss==0) {sStopLoss=0; bStopLoss=0;} 
    if(TakeProfit==0) {sTakeProfit=0; bTakeProfit=0;}
    if(StopLoss!=0) {sStopLoss=Bid+StopLoss*Point; bStopLoss=Ask-StopLoss*Point;}
    if(TakeProfit!=0) {sTakeProfit=Bid-TakeProfit*Point; bTakeProfit=Ask+TakeProfit*Point;}
        
    if (a2==a22) 
      {
       CheckForFreeMarging ();
       ticket=OrderSend(Symbol(),OP_SELL,vol,Bid,3,sStopLoss,sTakeProfit,"",MAGICMA,0,Red);
       if (ticket==-1) Print("Error opening SELL order : ",GetLastError());
       return(0);
      }
    if (a3==a33) 
      {
       CheckForFreeMarging ();
       ticket=OrderSend(Symbol(),OP_BUY,vol,Ask,3,bStopLoss,bTakeProfit,"",MAGICMA,0,Blue);
       if (ticket==-1) Print("Error opening BUY order : ",GetLastError());
       return(0);
      }
    return (0);
   }
//=============================================================================================//
int CheckForFreeMarging ()
   {
    int a;
    string para    = Symbol();
    double ask     =MarketInfo(para,MODE_ASK);
    double lotsize =MarketInfo(para,MODE_LOTSIZE);
    double minlot  =MarketInfo(para,MODE_MINLOT);
   
    a=(ask*lotsize/AccountLeverage()*minlot);
    if (AccountFreeMargin()<a)
      {Comment ("Недостаточно средств на счете для открытия ордера!!!"); return (0);}
   
    CalculateVolume();
    
    return (0);
   }
//=============================================================================================//
//--- calculate current volume
double CalculateVolume()
  {
   double lot_min =MarketInfo(Symbol(),MODE_MINLOT);
   double lot_max =MarketInfo(Symbol(),MODE_MAXLOT);
   double lot_step=MarketInfo(Symbol(),MODE_LOTSTEP);
     
//--- check data
   if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0) 
     {
      Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
      return(0);
     }
   if(AccountLeverage()<=0)
     {
      Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]");
      return(0);
     }
//--- basic formula
   vol=NormalizeDouble(AccountFreeMargin()*RiskSize/AccountLeverage()/10.0,2);
//--- additional calculation
//   ...
//--- check min, max and step
   vol=NormalizeDouble(vol/lot_step,0)*lot_step;
     
   if(vol<lot_min) vol=lot_min;
   if(vol>lot_max) vol=lot_max;
   if(AutoLots==false) vol=Lots;
//---
   
   return(0);
  }
//===========================================================================================//
 
Пробовал на 198 билде, советник работает, проблем нет!
 
Два вопроса:
  • А Вы не переключались между торговыми счетами во время повторных запусков тестера?

    Могло быть так, что на предыдущем счете были ограничения на минимальный лот не 0.10 , а 1.00 (например). Проверьте основные логи терминала на коннеты.

  • Было ли подключение к серверу до 01:52 (когда код стал срабатывать)?

    Если терминал не имел рыночных данных на момент старта до 01:52, то такое поведение (неспособность совершить операцию) возможно.

Очень важно знать:

Для тестера необходима вся рыночная информация по счету, инструментам и истории чартов, чтобы все правильно рассчитывать. Рыночная информация кешируется на клиенте в терминале. Для успешного тестирования терминал должен иметь данные по текущему используемому счету (из настроек).

 
Счет на MetaQuotes-Demo - MetaQuotes Software Corp., впрочем, пробовал и на MIG-Demo - MIG Investments SA - результат тот же.
Пробовал разные размеры лота (0.1-5). Пробовал снова, вот скрин.

 
Тогда вышлите мне на renat AT metaquotes . ru полный код эксперта - я самостоятельно протестируюсь, опубликую результаты, а затем удалю код.
 
Сообщение "invalid lots amount" выдаётся в том случае, когда количество лотов <=0

Даже из приведённого фрагмента видно, что Вы неправильно используете функции. Что это за код?
    if (AccountFreeMargin()<a)
      {Comment ("Недостаточно средств на счете для открытия ордера!!!"); return (0);}
   
    CalculateVolume();
    
    return (0);

Средств не хватает, поэтому Вы не рассчитываете объём. Тем не менее пытаетесь открыть ордер. Всегда!

Причина обращения: