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

 
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, а здесь что?

 
Sile Si:

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

На бирже я не подскажу, тут уж Вы сами. Я не имею доступа к реал бирже.


Добавлено: всегда при ошибке распечатывайте как можно больше информации: Bid, Ask, Last, PriceCurrent, PriceOpen, TakeProfit (текущий и расчётный) ...


Добавлено, добавлено.

Универсальная функция - вызывается после любой торговой операции

//+------------------------------------------------------------------+
//| Print CTrade result                                              |
//+------------------------------------------------------------------+
void PrintResult(CTrade &trade,CSymbolInfo &symbol,CPositionInfo &position)
  {
   Print("Code of request result: "+IntegerToString(trade.ResultRetcode()));
   Print("code of request result as a string: "+trade.ResultRetcodeDescription());
   Print("Deal ticket: "+IntegerToString(trade.ResultDeal()));
   Print("Order ticket: "+IntegerToString(trade.ResultOrder()));
   Print("Volume of deal or order: "+DoubleToString(trade.ResultVolume(),2));
   Print("Price, confirmed by broker: "+DoubleToString(trade.ResultPrice(),symbol.Digits()));
   Print("Current bid price: "+DoubleToString(symbol.Bid(),symbol.Digits())+" (the requote): "+DoubleToString(trade.ResultBid(),symbol.Digits()));
   Print("Current ask price: "+DoubleToString(symbol.Ask(),symbol.Digits())+" (the requote): "+DoubleToString(trade.ResultAsk(),symbol.Digits()));
   Print("Broker comment: "+trade.ResultComment());
   Print("Price of position opening: "+DoubleToString(position.PriceOpen(),symbol.Digits()));
   Print("Price of position's Stop Loss: "+DoubleToString(position.StopLoss(),symbol.Digits()));
   Print("Price of position's Take Profit: "+DoubleToString(position.TakeProfit(),symbol.Digits()));
   Print("Current price by position: "+DoubleToString(position.PriceCurrent(),symbol.Digits()));
   DebugBreak();
  }


Также нужно обновлять цену объекта класса CSymbolInfo непосредственно перед модификацией.

 
Vladimir Karputov:

Что в параметры передавать?

if(_LastError>0){PrintResult();}
'PrintResult' - wrong parameters count A_1.mq5 901 34