Ошибка "OrderSend error 131. - страница 4

 
Ihor Herasko:



"Вы" - это множественное число. "Ты" - это единственное число.  Во смотри, ты переделал мой пример кода в более правильную форму или возможно ты уже им пользовался. НО почему ты изначально не мог выложить сюда эту умную информацию, которая помогла бы людям. Тема была создана в 2007 году,  накопилось три  страницы полного бреда вплоть до того, что  у кого-то виндонс не тот стоит (поэтому ошибка) или МТ не обновлён.

Молодец что нашёл ошибку! Давай тогда поменяем строчки местами

double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);   // это шаг лота

        lot = (int)(lot/lotstep) * lotstep;  /// вот такая вот формула  (лот делим на шаг, округляем до целых, и умножаем на шаг)

if (lot < MarketInfo(Symbol(),MODE_MINLOT))   lot = MarketInfo(Symbol(),MODE_MINLOT);  // проверяем чтобы наш лот НЕ был меньше минимального

        if (lot > MarketInfo(Symbol(),MODE_MAXLOT))  lot = MarketInfo(Symbol(),MODE_MAXLOT);  // проверяем чтобы наш лот НЕ был больше максимального

        lot = NormalizeDouble(lot,2);



У меня как-то давно были проблемы со значениями 0,1500000000, тоже появлялась ошибка 131 из-за этого.  Возможно в новых обновлениях это уже и неважно!

 
Sergey Kruglov:

"Вы" - это множественное число. "Ты" - это единственное число. 

ОК, давай на ты.

Во смотри, ты переделал мой пример кода в более правильную форму или возможно ты уже им пользовался. НО почему ты изначально не мог выложить сюда эту умную информацию, которая помогла бы людям. Тема была создана в 2007 году,  накопилось три  страницы полного бреда вплоть до того, что  у кого-то виндонс не тот стоит (поэтому ошибка) или МТ не обновлён.

Просто подобных тем было множество. И приведенный мною код был выложен также. Изначальная идея кода принадлежит не мне. Сейчас уже не помню, кому: то ли Дмитрию Федосееву, то ли Андрею Хатимлянскому, то ли Игорю Киму. Ну а эту тему до сегодняшнего дня я попросту не видел.

Молодец что нашёл ошибку! Давай тогда поменяем строчки местами

double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);   // это шаг лота

        lot = (int)(lot/lotstep) * lotstep;  /// вот такая вот формула  (лот делим на шаг, округляем до целых, и умножаем на шаг)

if (lot < MarketInfo(Symbol(),MODE_MINLOT))   lot = MarketInfo(Symbol(),MODE_MINLOT);  // проверяем чтобы наш лот НЕ был меньше минимального

        if (lot > MarketInfo(Symbol(),MODE_MAXLOT))  lot = MarketInfo(Symbol(),MODE_MAXLOT);  // проверяем чтобы наш лот НЕ был больше максимального

        lot = NormalizeDouble(lot,2);



У меня как-то давно были проблемы со значениями 0,1500000000, тоже появлялась ошибка 131 из-за этого.  Возможно в новых обновлениях это уже и неважно!

Дело в том, что строка:

 lot = (int)(lot/lotstep) * lotstep

является эквивалентом функции NormalizeDouble. Поэтому последняя строка попросту лишняя в коде. К тому же в ней идет упор на то, что объемы всегда имеют 2 значащих цифры после запятой. Но ведь нам неизвестно, что будет в будущем. Может введут нанолоты (0.001). Тогда NormalizeDouble все испортит. 

P. S. При вставке кода пользуйся кнопкой SRC. Так код будет лучше выглядеть.

P.P.S. При озвученных мною значениях минлота и лотстепа оба варианта (и мой, и твой) будут работать некорректно ))). Ведь не учтен как раз вариант, когда lotStep > minLot или не кратен ему. В таких случаях нужно к результату minLot добавлять.

 
Ihor Herasko:



Ладно. Ты прав. Молодец! Главное ты нашёл как исправить проблему и это важно. А раз так эту тему можно закрыть! ))) И удалить ))) А завтра появится новая похожая тема, где будут опять мусолить ошибку 131 с предложениями обновить виндовс. И опять же кто-то напишет правильное решение, ты это решение переделаешь ещё правильнее, вспомнишь своих корешей которые являются гуру в это вопросе, вспомнишь что эта тема уже была  ну и тд.

Кстати при наборе в яндексе "mql4 ошибка 131", яндекс выдаёт этот форум и эту ветку в форуме. 

 
Sergey Kruglov:

Кстати при наборе в яндексе "mql4 ошибка 131", яндекс выдаёт этот форум и эту ветку в форуме. 


Все проще. Есть специальная статья от разработчиков терминала. И там имеется функция для проверки корректности объема.

 
Ihor Herasko:

Здарова! )

Вот ещё тему придумал! При частичном закрытии ордера, тоже нужно учитывать шаг лота и минималку?!?!?!?!

Пример: Висит открытый ордер объёмом 1 лот. Параметры брокера: минималка 0.10 ,  шаг лота 0.05.

Получается тут тоже нужно учитывать шаги. То есть я не смогу закрыть от ордера 0.01, минимум 0.05. А так же не смогу закрыть 0.06, только или 0.05 или 0.10  и тд до минималки. Дошли до минималки и опять препятствие - кусок в  0.95  от ордера в 1 лот тоже не закроется.

 

Подскажите что надо исправить советник выдает ошибку OrderSend error 131


Вот код 

//+----------------------------------------------------------------------------+

//|  Возвращает размер лота, в зависимости от настроек                         |

//+----------------------------------------------------------------------------+

double GetLot()

  {


   double tmpLots;

   int iDigitsForLot = 3;

   double _Risk = Risk;

   string Symb = Symbol();

   double OneLot = NormalizeDouble(MarketInfo(Symbol(),MODE_MARGINREQUIRED), Digits);

   double MinLot = NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT), Digits);

   double StepLot = NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSTEP), Digits);

   double Free   =AccountFreeMargin();

   double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);

   double MaxLotCurBalans = AccountBalance()/MarketInfo(Symbol(),MODE_MARGINREQUIRED); // макисмально допустимый лот при текущем балансе


   if(StepLot == 0.001)

      iDigitsForLot = 3;

   if(StepLot == 0.01)

      iDigitsForLot = 2;

   if(StepLot == 0.1)

      iDigitsForLot = 1;


   if(Lots>0)

     {

      double Money=Lots*OneLot;

      if(Money<=AccountFreeMargin())

         tmpLots=Lots;

      else

         tmpLots=MathFloor(Free/OneLot/StepLot)*StepLot;

     }

   else

     {

      if(_Risk>100)

         _Risk=100;

      if(_Risk <- 0.0)

         tmpLots=MinLot;

      else

         tmpLots=MathFloor(Free*_Risk/100/OneLot/StepLot)*StepLot;

     }


   if(tmpLots<MinLot)

      tmpLots=MinLot;

   if(tmpLots>Max_Lot)

      tmpLots=Max_Lot;

   if(tmpLots > MaxLotCurBalans)

      tmpLots = MaxLotCurBalans;


   return (NormalizeDouble(tmpLots, iDigitsForLot));

  }

 
ALEKSEI PLIUIKO:

Подскажите что надо исправить советник выдает ошибку OrderSend error 131


Такой подход:

 if(StepLot == 0.001)

      iDigitsForLot = 3;

   if(StepLot == 0.01)

      iDigitsForLot = 2;

   if(StepLot == 0.1)

      iDigitsForLot = 1;

не годится. Шаг изменения объема далеко не всегда кратен 10. 

Для приведения объема к разрешенному используйте:

double VolumeRound(double volume, double volumeMin, double volumeMax, double volumeStep)
{
   if (volumeStep == 0.0)
      return volumeMin;

   return (MathMin(MathMax(MathRound(volume / volumeStep) * volumeStep, volumeMin), volumeMax));
}
 
Ihor Herasko:

Такой подход:

не годится. Шаг изменения объема далеко не всегда кратен 10. 

Для приведения объема к разрешенному используйте:

спасибо но не получается все равно выдает ошибку

 
ALEKSEI PLIUIKO:

спасибо но не получается все равно выдает ошибку

Так функцию нужно не только вставить в код, но и применить ))

 
Ihor Herasko:

Так функцию нужно не только вставить в код, но и применить ))

Извиняюсь можете помочь

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