Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 890

 

Есть такой советник который позволяет определить момент, когда сработал отложенный ордер

https://www.mql5.com/ru/code/17610

С помощью него получаю тикет ордера SELL_STOP

Код соотвецтвено изменил на

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      Print("Attempt number ",counter);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error#",GetLastError());
        }
      counter++;
     }
  }

Все хорошо до определенного момента. Пока в истории не появится другой тип ордера.

Например SELL_LIMIT.

ПРИМЕР

Как только в истории появляется SELL_LIMIT я уже не могу получить тикет последнего SELL_STOP.

Советник выкидывает ошибку. 

The order 9 is not pending

Хотя в истории то есть SELL_STOP

И при чем тут 9ый если мне тикет 7го нужен

Такое ощущение что советник ищет требуемый ордер не по всей истории а только по последнему
TypePendingOrderTriggered
TypePendingOrderTriggered
  • голосов: 21
  • 2017.02.14
  • Vladimir Karputov
  • www.mql5.com
()   {    (bln_find_order)      {        counter=;       (,counter);       ();         {          (type_order== || type_order== ||             type_order== ||type_order==)            {             (,ul_find_order,,                   (()(ul_find_order,)));             bln_find_order=;                     counter=;             ;            }...
 

Здравствуйте. Получаю ошибку если StopLoss_=0

failed modify #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Invalid stops]


 if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     if(StopLoss_<=0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }

                     if(StopLoss_>0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }
                    }
                 }
если вместо m_position.StopLoss() ставлю нуль, та же ошибка. В чём дело?
 
Sile Si:

Здравствуйте. Получаю ошибку если StopLoss_=0

failed modify #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Invalid stops]

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
        {
         if(StopLoss_<=0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_position.StopLoss(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }

         if(StopLoss_>0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }
        }
     }

если вместо m_position.StopLoss() ставлю нуль, та же ошибка. В чём дело?

Ошибочная логика написания программы.

При StopLoss_=0 срабатывает верхнее условие - попытка модификации TakeProfit. Ошибка в том, что Вы отнимаете от ЦЕНЫ ОТКРЫТИЯ - при этом уровень TakeProfit может оказаться ВЫШЕ ТЕКУЩЕЙ ЦЕНЫ, а это ошибка.

В Вашем случае нужно отнимать от ТЕКУЩЕЙ ЦЕНЫ (m_position.PriceCurrent).

 
Vladimir Karputov:

Была открыта позиция sell, активировался selllimit, мне нужно перенести tp относительно новой цены позиции, а не относительно текущей цены.

Какую проверку нужно сделать чтобы не пытаться модифицировать на недопустимую цену?

 
Sile Si:

Была открыта позиция sell, активировался selllimit, мне нужно перенести tp относительно новой цены позиции, а не относительно текущей цены.

Какую проверку нужно сделать чтобы не пытаться модифицировать на недопустимую цену?

Проверка:

if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent()
   {
    m_trade.PositionModify(m_position.Ticket(),
                           m_position.StopLoss(),
                           m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                           );
...
 
Vladimir Karputov:

Проверка:

Спасибо, но ошибка осталась.

aqa

Может быть недопустимо близко к текущей цене. Как это проверить?

 
Sile Si:

Спасибо, но ошибка осталась.

Может быть недопустимо близко к текущей цене. Как это проверить?

У меня нет доступа к бирже, поэтому или сами или работайте на форексных инструментах. Извините.


Добавлено: введите ещё одну проверку - для позиции Sell новый TakeProfit (расчётное значение) не должен быть ВЫШЕ или РАВЕН текущему TakeProfit позиции.

 
Vladimir Karputov:

У меня нет доступа к бирже, поэтому или сами или работайте на форексных инструментах. Извините.


Добавлено: введите ещё одну проверку - для позиции Sell новый TakeProfit (расчётное значение) не должен быть ВЫШЕ или РАВЕН текущему TakeProfit позиции.

Наверно, цене открытия (POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

Наверно, цене открытия (POSITON_PRICE_OPEN) ?

Этот вариант был выше. Смотрите сообщения выше. Вы ответили в середине беседы.

 
Vladimir Karputov: ...введите ещё одну проверку - для позиции Sell новый TakeProfit (расчётное значение) не должен быть ВЫШЕ или РАВЕН текущему TakeProfit позиции.

Не подходит, модифицирую по ATR Какие ещё проверки можно сделать для данной ошибки? Все возможные. В мт4 есть STOPLEVEL, а здесь что?

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