Как правильно выставить безубыток

 

  Как правильно выставить безубыток у сделки в Buy?  Сейчас у меня стоит такое условие:

         if( Ask > OrderOpenPrice()-(Point*NoLoss) && NoLoss>0) 

            {

            SL = Ask + (NoLoss*Point);

            OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue); 

            return(0);

            }

Но когда наступает устловие, модификация ордера происходит не единожны, а как при трейлинге. Возможно, я в условии допустил ошибку? Помогите, пожалуйста, разобраться.
 
Sergey Lapshov:

  Как правильно выставить безубыток у сделки в Buy?  Сейчас у меня стоит такое условие:

         if( Ask > OrderOpenPrice()-(Point*NoLoss) && NoLoss>0) 

            {

            SL = Ask + (NoLoss*Point);

            OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue); 

            return(0);

            }

Но когда наступает устловие, модификация ордера происходит не единожны, а как при трейлинге. Возможно, я в условии допустил ошибку? Помогите, пожалуйста, разобраться.
Это потому, что у Вас СЛ завязан на цену аск, а должен быть завязан на цену открытия ордера. И должно быть условие, что если СЛ модифицирован на цену открытия + Point*NoLoss(в пунктах) - модификация более не происходит.
 
Alexey Kozitsyn:
Это потому, что у Вас СЛ завязан на цену аск, а должен быть завязан на цену открытия ордера. И должно быть условие, что если СЛ модифицирован на цену открытия + Point*NoLoss(в пунктах) - модификация более не происходит

Внес изменения. Теперь получаю 130ю ошибку

         if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 ) 

            {            

            SL = OrderOpenPrice()+(NoLoss*Point); 

            if(OrderStopLoss()!= SL){                    

            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);

            }

            return(0);

            }                  

            } 

 
Sergey Lapshov:

Внес изменения. Теперь получаю 130ю ошибку

         if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 ) 

            {            

            SL = OrderOpenPrice()+(NoLoss*Point); 

            if(OrderStopLoss()!= SL){                    

            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);

            }

            return(0);

            }                  

            } 

Слишком близко  от цены ставите стоп. Учитывайте минимально допустимый уровень стоп-лосса/тейк-профита. 
 
Sergey Lapshov:

Внес изменения. Теперь получаю 130ю ошибку

         if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 ) 

            {            

            SL = OrderOpenPrice()+(NoLoss*Point); 

            if(OrderStopLoss()!= SL){                    

            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);

            }

            return(0);

            }                  

            } 

SL нужно нормализовать. И так лучше действительные числа не сравнивать. Почитайте как это делать в документации. Ссылка ниже.

https://www.mql5.com/ru/docs/basis/types/double 

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Kozitsyn:

SL нужно нормализовать. И так лучше действительные числа не сравнивать. Почитайте как это делать в документации. Ссылка ниже.

https://www.mql5.com/ru/docs/basis/types/double 

посмотрел примеры.. как же всё-таки лучше сделать? Так? 

 


if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 ) 

            {            

            SL = NormalizeDouble((OrderOpenPrice()+(NoLoss*Point)),Digits); 

            if(OrderStopLoss()<> SL){                    

            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);

            }

            return(0);

            }                  

            }  

 

 как минимально допустимый уровень стоп-лосса прикрутить? он у меня 0 равен

 
Sergey Lapshov:

посмотрел примеры.. как же всё-таки лучше сделать? Так? 

 


if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 ) 

            {            

            SL = NormalizeDouble((OrderOpenPrice()+(NoLoss*Point)),Digits); 

            if(OrderStopLoss()<> SL){                    

            OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);

            }

            return(0);

            }                  

            }  

 

 как минимально допустимый уровень стоп-лосса прикрутить? он у меня 0 равен

<> - это вы откуда взяли? Не придумывайте.

https://www.mql5.com/ru/docs/basis/operations/relation 

Ясно ведь приведено два примера сравнения вещественных чисел. Используйте функцию:

bool CompareDoubles(double number1,double number2) 
  { 
   if(NormalizeDouble(number1-number2,8)==0) return(true); 
   else return(false); 
  } 

А условие сравнения пишите так:

if( !CompareDoubles( OrderStopLoss(), SL ) ) // Если стоп ордера != SL
  { 
   OrderModify(...);                         // Модифицируем ордер
  } 

Минимально допустимый уровень СЛ? Это как? Если Вы говорите о минимальном отступе от цены, то смотрите функцию SymbolInfoInteger(), идентификатор SYMBOL_TRADE_STOPS_LEVEL. Узнаете мин. допустимое расстояние от текущей цены (бид для ордеров на покупку) в пунктах. Умножаете это значение на поинт текущего символа, вычитаете от текущей цены бид. Это и будет мин. отступ от текущей цены для установки СЛ.

Документация по MQL5: Основы языка / Операции и выражения / Операции отношения
Документация по MQL5: Основы языка / Операции и выражения / Операции отношения
  • www.mql5.com
Основы языка / Операции и выражения / Операции отношения - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Sergey Lapshov:
У Вас слишком много пробелов в знаниях, чтобы писать советники. Начните со статей на сайте, учебника Ковалева по mql4 и документации (коды ошибок там описаны).
Причина обращения: