Периодически получаю ошибку 130

 
Поиском не нашел толкового ответа, хотя вопрос всплывает достаточно часто :(
Создаю ордера на покупку так, как показано в коде, периодически создание ордера не проходит, возвращается ошибка 130 (неправильные Сл-Тп). Причем создание ордера то проходит, то не проходит, закономерности отловить не удается.
Подскажите, в чем может быть проблема?

CreateBuyOrder(0.1,true,0.0,true,0.0,LotMagic);
 
 
int CreateBuyOrder(double LotVolume,bool MinStopLoss,double LotStopLoss,bool MinTakeProfit,double LotTakeProfit,int LotMagic) {
   // Создание ордера на покупку
   string LotSymbol = Symbol();  // График для которого выполняется ордер (текущий)
   int LotSlippage = 3;          // Проскальзывание
   string LotComment = NULL;     // Комментарий
   datetime LotExpiration = 0;   // Срок истечения отложенного ордера (0 - мгновенное исполнение)
   color LotArrowColor = CLR_NONE;  // Цвет отображения стрелки ордера на графике (не отображать)
   double LotPrice = Ask;        // Цена покупки
   double STVariation = MarketInfo(LotSymbol,MODE_STOPLEVEL)*Point;  // Минимальное отклонение цены для установки StopLoss и TakeProfit
   if(MinStopLoss==true) LotStopLoss = Bid-STVariation;   // Стоп-лосс
   if(MinTakeProfit==true) LotTakeProfit = Bid+STVariation;  // Тейк-профит
   int Rez = OrderSend(LotSymbol,OP_BUY,LotVolume,LotPrice,LotSlippage,LotStopLoss,LotTakeProfit,LotComment,LotMagic,LotExpiration,LotArrowColor);
   if(Rez<0) {
      Print("Невозможно создать ордер на покупку. Ошибка: ",GetLastError());
      return(0);
   }
   return(Rez);
}
 
Вы пытаетесь открыть ордер на грани дозволенного, поэтому иногда это удается (если текушая цена Ask не изменилась к моменту обработки приказа сервером), но иногда отфутболивается (если текущая в момент обработки ордера цена Ask отстоит от заявленного уровня StopLoss ближе чем на StopLevel пунктов ). Почитайте ветку Некорректный возврат ошибки №130 при установке ордера, погоняйте тот скрипт. Есть об этом информация в учебнике - Требования и ограничения при проведении торговых операций
 
Force_Majeure:
Подскажите, в чем может быть проблема?
Уже не раз говорили, что минимальный уровень установки стопов - стоплевел+1.
Замените одну строку, проблема практически пропадет:
double STVariation = MarketInfo(LotSymbol,MODE_STOPLEVEL)*Point+Point;
"Практически" - потому что на быстром рынке и это не поможет.
 
т.е. правильно я понимаю, что кардинального решения нет, а можно только бороться с этим эмпирически завышая минимальные Сл-Тп или увеличивая слипаж?
 
komposter:
Уже не раз говорили, что минимальный уровень установки стопов - стоплевел+1.
Это уже в прошлом. С некоторых пор в этой области всё приведено в соответствие. Теперь - полноценный StopLevel.
 
Force_Majeure:
т.е. правильно я понимаю, что кардинального решения нет, а можно только бороться с этим эмпирически завышая минимальные Сл-Тп или увеличивая слипаж?

Неправильно понимаете.
Вот здесь обо всём подробно: Учебник по MQL4 - Торговые операции - Характеристики ордеров и правила проведения торговых операций
 
SK. писал (а):
Это уже в прошлом. С некоторых пор в этой области всё приведено в соответствие. Теперь - полноценный StopLevel.
Ну вот, и хоть бы кто сказал...
Спасибо, буду знать.
 
SK. писал (а):
Force_Majeure:
т.е. правильно я понимаю, что кардинального решения нет, а можно только бороться с этим эмпирически завышая минимальные Сл-Тп или увеличивая слипаж?

Неправильно понимаете.
Вот здесь обо всём подробно: Учебник по MQL4 - Торговые операции - Характеристики ордеров и правила проведения торговых операций
Или я чего не понимаю, или все так эмпирически и делается :) В приведенной статье читаю:

Поэтому в торговых приказах для открытия рыночных ордеров не рекомендуется использовать значения стоп-приказов, максимально приближенные к заявленной цене открытия ордера. Напротив, рекомендуется иметь некоторый запас, т.е. указывать такие значения стоп-приказов, которые удалены от заявленной цены открытия ордера на 1-2 пункта дальше, чем на величину минимально допустимой дистанции.
 
Force_Majeure:
Или я чего не понимаю, или все так эмпирически и делается :) В приведенной статье читаю:

Поэтому в торговых приказах для открытия рыночных ордеров не рекомендуется использовать значения стоп-приказов, максимально приближенные к заявленной цене открытия ордера. Напротив, рекомендуется иметь некоторый запас, т.е. указывать такие значения стоп-приказов, которые удалены от заявленной цены открытия ордера на 1-2 пункта дальше, чем на величину минимально допустимой дистанции.

Я же писал уже вторым постом в этой ветке:
Rosh:
Вы пытаетесь открыть ордер на грани дозволенного, поэтому иногда это удается (если текушая цена Ask не изменилась к моменту обработки приказа сервером), но иногда отфутболивается (если текущая в момент обработки ордера цена Ask отстоит от заявленного уровня StopLoss ближе чем на StopLevel пунктов ). Почитайте ветку Некорректный возврат ошибки №130 при установке ордера, погоняйте тот скрипт. Есть об этом информация в учебнике - Требования и ограничения при проведении торговых операций
 
Rosh:

Я же писал уже вторым постом в этой ветке:
Rosh:
Вы пытаетесь открыть ордер на грани дозволенного, поэтому иногда это удается (если текушая цена Ask не изменилась к моменту обработки приказа сервером), но иногда отфутболивается (если текущая в момент обработки ордера цена Ask отстоит от заявленного уровня StopLoss ближе чем на StopLevel пунктов ). Почитайте ветку Некорректный возврат ошибки №130 при установке ордера, погоняйте тот скрипт. Есть об этом информация в учебнике - Требования и ограничения при проведении торговых операций

Я прочитал, спасибо. Требованиям в Требования и ограничения при проведении торговых операций мой код не противоречит. Из обсуждения Некорректный возврат ошибки №130 при установке ордера я могу сделать вывод что для устранения ошибки нужно увеличивать слипаж и все равно, полностью ее избыть не удастся. Если я чего-то не понял, поясните пожалуйста подробнее.
 
Force_Majeure:
.. я могу сделать вывод что для устранения ошибки нужно увеличивать слипаж и все равно, полностью ее избыть не удастся. Если я чего-то не понял, поясните пожалуйста подробнее.

Если бы все операции осуществлялись "моментально" (подобно тому, как это происходит в рамках одного ПК), то проблема бы не возникала. Однако, нужно принимать во внимание, что реальные торговые приказы обрабатываются в режиме реального времени. Это никому не нравится, но это реалии жизни. Сами посудите: кто может гарантировать, что с момента образования торгового приказа на Вашем ПК до момента принятия решения на сервере не произойдут новые критические события? Например, курс может резко измениться или в ту же секунду сотни других трейдеров тоже захотят поторговать, в результате чего торговые приказы на сервере выстроятся в очередь (а за время движения очереди могут произойти новые события).

Посмотрите ещё Учебник по MQL4 - Торговые операции - Общий порядок проведения торговых операций .

В целом какой-либо одной отдельно взятой цифрой проблема не решается в принципе. Нужно анализировать события, отслеживать курсы и вообще использовать интеллектуальный алгоритм обработки ситуации.

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