Не модифицируются объединенные позиции на нетинговом счете MT5 MQL5

 

Всем Привет. Не модифицируются объединенные позиции на нетинговом счете MT5 если цена при объединении имеет больше знаков чем символ. к примеру если на евро доллар где сейчас 1,1800 будет позиция 1,1813333

пишет 10016 ошибку == Cделка не модифицирована по причине: Неправильные стопы в запросе

NormalizationDouble вбивал. тикет проверил.

пробывал и классическим MQL через OrderSend и через CTrade

обе функции будут внизу


int modify_ticket_f(ulong ticket, double tpzz, double slzz)
 {

 bool r = 0;

 if(PositionSelectByTicket(ticket))
  {
  if( NormalizeDouble(PositionGetDouble(POSITION_TP),Digits()) != NormalizeDouble(tpzz,Digits()) ||
      NormalizeDouble(PositionGetDouble(POSITION_SL),Digits()) != NormalizeDouble(slzz,Digits()) )
   {

   MqlTradeRequest request;
   MqlTradeResult  result;
   zm(request);
   zm(result);

   request.action       = TRADE_ACTION_SLTP;                   // Тип торговой операции
   request.position     = ticket;                              // тикет
   request.symbol       = Symbol();                            // symbol
   request.sl           = NormalizeDouble(slzz,Digits());      // sl
   request.tp           = NormalizeDouble(tpzz,Digits());      // tp
   request.magic        = PositionGetInteger(POSITION_MAGIC);  // magic number

   int t = OrderSend(request,result);

   Print("position modify buy: ",result.retcode," | ",result.comment);

    Print(" ++++ tp2 ",dts(tpzz,d)," sl2 ",dts(slzz,d));

   if(result.retcode==10009||result.retcode==10010)
    {
    error_cleaning_f(1);
    r = 1;
    }
   else
    {
    Print("++ order open erore");
    if(error_f(result.retcode,1))
     r = 1;
    else
     r = 0;
    }

   }
  else r = 1;
  }
 else r = 1;

 return r;

 }

int modify_ticket_f2(ulong ticket, double tpzz, double slzz)
 {

 bool r = 0;

 if(m_position.Select(Symbol()))
  {
  if( NormalizeDouble(m_position.TakeProfit(),Digits()) != NormalizeDouble(tpzz,Digits()) ||
      NormalizeDouble(m_position.StopLoss(),Digits()) != NormalizeDouble(slzz,Digits()) )
   {
   if(m_trade.PositionModify(ticket,nd(slzz,d),nd(tpzz,d)))
    {
    r=1;
    Print("position modify");
    }
   else
    {
    Print("++ position modify erore");
    }
   }
  else r = 1;
  }
 else r = 1;

 return r;

 }


 

Советник Simple Trailing 2 немного модифицируем - в OnInit добавляем открытие двух позиций SELL:

   m_trailing_step         = InpTrailingStep          * m_adjusted_point;
   //---
   bool res=false;
   while(!res)
      res=m_trade.Sell(0.01);
   Sleep(1000*3600*5);
   res=false;
   while(!res)
      res=m_trade.Sell(0.03);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)


Настройки тестера:

Результат:



То есть проблем с модификацией на неттинге нет.

Simple Trailing 2
Simple Trailing 2
  • www.mql5.com
Советник-утилита: выполняет трейлинг прибыльных позиций по текущему символу
 
Sirius Trader:

Всем Привет. Не модифицируются объединенные позиции на нетинговом счете MT5 если цена при объединении имеет больше знаков чем символ. к примеру если на евро доллар где сейчас 1,1800 будет позиция 1,1813333

пишет 10016 ошибку == Cделка не модифицирована по причине: Неправильные стопы в запросе

NormalizationDouble вбивал. тикет проверил.

пробывал и классическим MQL через OrderSend и через CTrade

обе функции будут внизу

Выведите в лог значения tpzz, slzz и текущей цены (Bid для Buy и Ask для Sell). Скорее всего стопы слишком близко к рынку или вообще в неправильных местах: стоп Buy выше Bid, профит Buy ниже Bid и т. д.

 
Ihor Herasko:

Выведите в лог значения tpzz, slzz и текущей цены (Bid для Buy и Ask для Sell). Скорее всего стопы слишком близко к рынку или вообще в неправильных местах: стоп Buy выше Bid, профит Buy ниже Bid и т. д.

Добрый день. тоже так думал. но проверил - нет. sl и tp находился за 200 пипсов от текущей цены.. специально выводил в принт тп/сл
 

То что вы делаете 

request.sl           = NormalizeDouble(slzz,Digits());      // sl
request.tp           = NormalizeDouble(tpzz,Digits());      // tp

не всегда будет работать, так как SYMBOL_POINT не всегда равен SYMBOL_TRADE_TICK_SIZE

 
Sirius Trader:
Добрый день. тоже так думал. но проверил - нет. sl и tp находился за 200 пипсов от текущей цены.. специально выводил в принт тп/сл

А стоплевел какой? 200 пунктов - не так уж и много. На BTCUSD, к примеру, стоплевел бывает и более 2 000 пунктов.

 
NormalizeDouble(MathRound(value/tick_size)*tick_size,_Digits)
Причина обращения: