Как изменить объем отложенного ордера?

 

Здравствуйте!

Как изменить объем отложенного ордера?

значение которое подается в

h_request.volume

игнорируется

int OrderModifyPending08(ulong l_ticket,double h_price=0,double h_volume=0)
  {
   MqlTradeRequest  h_request={};      
   MqlTradeResult   h_result={};
   if(!OrderSelect(l_ticket))
      return(-1);
   h_request.symbol=OrderGetString(ORDER_SYMBOL); 
   h_request.price=(h_price<=0 ? OrderGetDouble(ORDER_PRICE_OPEN):h_price);

   h_request.volume=h_volume;  
  
   h_request.order=l_ticket;

   h_request.action=TRADE_ACTION_MODIFY; 
  

   OrderSend(h_request,h_result);

   return((int)h_result.order);
  }

 
Этого нельзя сделать.
 
Roman:

Здравствуйте!

Как изменить объем отложенного ордера?

значение которое подается в

h_request.volume

игнорируется

int OrderModifyPending08(ulong l_ticket,double h_price=0,double h_volume=0)
  {
   MqlTradeRequest  h_request={};      
   MqlTradeResult   h_result={};
   if(!OrderSelect(l_ticket))
      return(-1);
   h_request.symbol=OrderGetString(ORDER_SYMBOL); 
   h_request.price=(h_price<=0 ? OrderGetDouble(ORDER_PRICE_OPEN):h_price);

   h_request.volume=h_volume;  
  
   h_request.order=l_ticket;

   h_request.action=TRADE_ACTION_MODIFY; 
  

   OrderSend(h_request,h_result);

   return((int)h_result.order);
  }

Только удалить и заново поставить.

 
Artyom Trishkin:

Только удалить и заново поставить.

Это баг или фича, в поддержку уже писали?

Можноли в один тик успеть и удалить ордер и поставить новый?

 
Roman:

Это баг или фича, в поддержку уже писали?

Можноли в один тик успеть и удалить ордер и поставить новый?

Это всегда так было. 
 
Artyom Trishkin:
Это всегда так было. 
ясно. напишу в поддержку, вдруг поддержат! :)
 
Roman:
ясно. напишу в поддержку, вдруг поддержат! :)
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

// Изменяет объем отложенного ордера. Async = true - асинхронный режим отправки приказов
bool OrderChangeLots( const long Ticket, const double Lots, const bool Async = false )
{
  return(OrderSelect(Ticket, SELECT_BY_TICKET) && (Lots != OrderLots()) && (Async
         ? (OrderDeleteAsync(Ticket) &&
            OrderSendAsync(OrderSymbol(), OrderType(), Lots, OrderOpenPrice(), 0, OrderStopLoss(), OrderTakeProfit(), OrderComment(), OrderMagicNumber(), OrderExpiration()))
         : (OrderDelete(Ticket) &&
            (OrderSend(OrderSymbol(), OrderType(), Lots, OrderOpenPrice(), 0, OrderStopLoss(), OrderTakeProfit(), OrderComment(), OrderMagicNumber(), OrderExpiration()) != -1))));
}

void OnStart()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() >= OP_BUYLIMIT))
      OrderChangeLots(OrderTicket(), OrderLots() + 1, true);
}
 
fxsaber:

Спасибо, огромное! Только код такого уровня не осилю :( Могу только как на бэйсике программу менять.

без библиотэки, парой строк обойтись возможно?


поддержка сказала этого нет.

 
Roman:

Спасибо, огромное! Только код такого уровня не осилю :( Могу только как на бэйсике программу менять.

без библиотэки, парой строк обойтись возможно?

Одной строкой - вызывайте OrderChangeLots, исходник которой выше.

 
fxsaber:

Одной строкой - вызывайте OrderChangeLots, исходник которой выше.

Ну зачем вводишь человека в заблуждение?

 
Alexey Viktorov:

Ну зачем вводишь человека в заблуждение?

Много трактовок, поэтому не понял.

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