Отложенный ордер на MQL5

 

Добрый день, нужна помощь в выставлении лимитированного ордера на покупку по барам. Т.е если брать таймфрэйм D1, то требуется выставить ордер на покупку выше high-я вчерашнего дня.

Прилагаю код. Как правильно описать эту процедуру ?


void OnStart()
  {
   double   open1  =  iOpen(Symbol(),Period(),1);
   double   close1 =  iClose(Symbol(),Period(),1);
   double   high1  =  iHigh(Symbol(),Period(),1);
   double   low1   =  iLow(Symbol(),Period(),1);

// Создать запрос 
MqlTradeRequest  request = {0};
         request.action = TRADE_ACTION_PENDING;
         request.symbol = Symbol();
         request.volume = 0.1;
         request.price  = SymbolInfoDouble(request.symbol,SYMBOL_ASK)-1000*_Point;
         request.sl     = request.price-500*_Point;
         request.tp     = request.price+100*_Point;
         request.type   = ORDER_TYPE_BUY_LIMIT;
         request.type_filling = ORDER_FILLING_FOK;
         request.expiration = ORDER_TIME_DAY;

MqlTradeResult result = {0};
if (OrderSend (request,result))
    Print ("Ордер успешно отправлен, ошибок нет =  ", GetLastError());
else
        Print ("Не удалось отправить запрос, ошибка = ", GetLastError());
}
 
setborg:

Добрый день, нужна помощь в выставлении лимитированного ордера на покупку по барам. Т.е если брать таймфрэйм D1, то требуется выставить ордер на покупку выше high-я вчерашнего дня.

Прилагаю код. Как правильно описать эту процедуру ?


Вместо Period() надо поставить PERIOD_D1 и полученное значение указать в качестве цены.

 
Alexey Viktorov:

Вместо Period() надо поставить PERIOD_D1 и полученное значение указать в качестве цены.

Можете хотя бы написать пример ?

 
setborg:

Можете хотя бы написать пример ?

Ну какой пример когда надо заменить всего один параметр?

   double   high1  =  iHigh(Symbol(),PERIOD_D1,1);
   double   low1   =  iLow(Symbol(),PERIOD_D1,1);

// Создать запрос 
MqlTradeRequest  request = {0};
         request.action = TRADE_ACTION_PENDING;
         request.symbol = Symbol();
         request.volume = 0.1;
         request.price  = low1; // или high1 если ставить лимитник на йух
         request.sl     = request.price-500*_Point;
         request.tp     = request.price+100*_Point;
         request.type   = ORDER_TYPE_BUY_LIMIT; // или ORDER_TYPE_SELL_LIMIT
         request.type_filling = ORDER_FILLING_FOK;
         request.expiration = ORDER_TIME_DAY;

MqlTradeResult result = {0};
if (OrderSend (request,result))
    Print ("Ордер успешно отправлен, ошибок нет =  ", GetLastError());
else
        Print ("Не удалось отправить запрос, ошибка = ", GetLastError());
}

Правильность заполнения структуры не проверял.

 

Отложенный ордер на MQL5

Ииеется ввиду ордер, который сработает не сразу, а будет находится в стакане?
 
prostotrader:

Отложенный ордер на MQL5

Имеется ввиду ордер, который сработает не сразу, а будет находится в стакане?
Да
 
setborg:
Да

Подставьте свои значения и лишнее уберите...

//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void COrder::Place(const double price, const double volume, const bool buy_sell)
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  ticket = 0;
  req_id = 0;
  mem_magic = magic_storage + 1;
  check_count = 0;
  if(magic_storage >= (magic_number + 65530)) mem_magic = magic_number;
//--- Fill structure
  request.action = TRADE_ACTION_PENDING;
  request.magic  = mem_magic;
  request.symbol = a_symbol;
  request.volume = volume;
  request.price  = price;
  if(buy_sell)
  {
    request.type = ORDER_TYPE_BUY_LIMIT;
  }
  else
  {
    request.type = ORDER_TYPE_SELL_LIMIT;
  } 
  request.comment = "Отложенный ордер...";      
  request.type_filling = ORDER_FILLING_RETURN;
  request.type_time = ORDER_TIME_DAY;
//--- Send order
  if(OrderSendAsync(request, result) == true)
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) 
    {
      req_id = result.request_id;
      magic_storage = mem_magic;
      state = ORD_DO_SET;
      mem_time = GetMicrosecondCount();
      mem_start_time = TimeCurrent();
      SetTransCount();
    }
    else
    {
      mem_magic = 0;
      mem_time = 0;
      mem_start_time = 0;
      CheckError(result.retcode, "Place: Ордер не установлен! Причина: ", order_status, ticket);
    }
  }
  else
  {
    mem_magic = 0;
    mem_time = 0;
    mem_start_time = 0;
    CheckError(result.retcode, "Place: Ордер не отослан! Причина: ", order_status, ticket);
  }
}

Если используете OrderSend(), то вместо req_id = result.request_id; нужно ticket = result.order;