Кривая логика скрипта или предвзятое отношение его исполнения в зависимости от лота (АДСКИЕ числа 0.03 и 0.06)

 

Здравствуйте.

Столкнулся с неприятным непредсказуемым исполнением элементарного "переворотного" скрипта в МТ5 2093 на Win7x32.

Имеем открытую позицию с установленными стопом и тейком, а скрипт: 1) удаляет стоп открытой позиции 2) по цене бывшего стопа открывает противоположный ордер с размером, стопом, тейком указанными в тексте скрипта.

И почему-то при нормальной работе скрипта со многими размерами лота, если устанавливаемый ордер или позиция равны 0,03 или 0,06 - вылетает ошибка "failed buy(или sell) stop 0.00...[Invalid volume]" и "Order send error 4756"

Ошибка проявляется рандомно. Только с указанными цифрами сам столкнулся, а сколько их еще - неизвестно.

Может скрипт кривой? Ну почему же тогда он на ура работает с другими лотами?

HELP форумчане-разработчики

Файлы:
70o9bp9.mq5  8 kb
 
geritretar:

Здравствуйте.

Столкнулся с неприятным непредсказуемым исполнением элементарного "переворотного" скрипта в МТ5 2093 на Win7x32.

Имеем открытую позицию с установленными стопом и тейком, а скрипт: 1) удаляет стоп открытой позиции 2) по цене бывшего стопа открывает противоположный ордер с размером, стопом, тейком указанными в тексте скрипта.

И почему-то при нормальной работе скрипта со многими размерами лота, если устанавливаемый ордер или позиция равны 0,03 или 0,06 - вылетает ошибка "failed buy(или sell) stop 0.00...[Invalid volume]" и "Order send error 4756"

Ошибка проявляется рандомно. Только с указанными цифрами сам столкнулся, а сколько их еще - неизвестно.

Может скрипт кривой? Ну почему же тогда он на ура работает с другими лотами?

HELP форумчане-разработчики

Проблема в том как Вы сравниваете лоты.

if(pos_lot==lot1) ord_lot=lot2;
if(pos_lot==lot3) ord_lot=lot4;
if(pos_lot==lot5) ord_lot=lot6;
//if(pos_lot==lot4) ord_lot=lot5;
//if(pos_lot==lot5) ord_lot=lot6;

== не работает с некоторыми даблами... Поищите, как сравнивать вещественные числа.

 

Реализация нормализации цены с учётом квантования (взято из CSymbolInfo )

//+------------------------------------------------------------------+
//| Normalize price                                                  |
//+------------------------------------------------------------------+
double CSymbolInfo::NormalizePrice(const double price) const
  {
   if(m_tick_size!=0)
      return(NormalizeDouble(MathRound(price/m_tick_size)*m_tick_size,m_digits));
//---
   return(NormalizeDouble(price,m_digits));
  }


и проверка корректности лота (здесь m_symbol - объект класса CSymbolInfo )

//+------------------------------------------------------------------+
//| Lot Check                                                        |
//+------------------------------------------------------------------+
double LotCheck(double lots)
  {
//--- calculate maximum volume
   double volume=NormalizeDouble(lots,2);
   double stepvol=m_symbol.LotsStep();
   if(stepvol>0.0)
      volume=stepvol*MathFloor(volume/stepvol);
//---
   double minvol=m_symbol.LotsMin();
   if(volume<minvol)
      volume=0.0;
//---
   double maxvol=m_symbol.LotsMax();
   if(volume>maxvol)
      volume=maxvol;
   return(volume);
  }
 

Вот спасибо, добрый человек.

Слона то я и не заметил.

Всего то строчка NormalizeDouble в коде, которая была в аналогичном скрипте МТ4, здесь была пропущена.

Теперь всё работает как и задумывалось.

Еще раз, FANKS!

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