Открытие и закрытие ордера

 

Доброго времени суток!
Пытаюсь открыть ордер в советнике

#define EXPERT_MAGIC 123456

void sell_simple(double volume)
{
//--- объявление и инициализация запроса и результата
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- параметры запроса
   request.action    = TRADE_ACTION_DEAL;                     // тип торговой операции
   request.symbol    = _Symbol;                               // символ
   request.volume    = volume;                                // объем в лотах
   request.type      = ORDER_TYPE_SELL;                       // тип ордера
   request.price     = SymbolInfoDouble(Symbol(),SYMBOL_BID); // цена для открытия
   request.magic     = EXPERT_MAGIC;                          // MagicNumber ордера
//--- отправка запроса
   if(!OrderSend(request,result))
   {
      PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      return;
   }
//--- информация об операции
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
}
Потом закрыть его
void close_order()
{
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      string symbol=PositionGetSymbol(i);
   
      ulong  order_ticket=OrderGetTicket(i);                   // тикет ордера
      ulong  magic=OrderGetInteger(ORDER_MAGIC);               // MagicNumber ордера
      //--- если MagicNumber совпадает
      if(magic==EXPERT_MAGIC)
      {
         //--- обнуление значений запроса и результата
         ZeroMemory(request);
         ZeroMemory(result);
         //--- установка параметров операции     
         request.action=TRADE_ACTION_REMOVE;                   // тип торговой операции
         request.order = order_ticket;                         // тикет ордера
         //--- отправка запроса
         if(!OrderSend(request,result))
         {
            PrintFormat("OrderSend error %d",GetLastError());  // если отправить запрос не удалось, вывести код ошибки
         }
         //--- информация об операции   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         return;
      }
   }
}
Соответственно закрыть не получается, потому что magic равняется 0, а не ожидаемому 123456
Если использовать
int total=OrdersTotal();
вместо
int total=PositionsTotal();
тогда total получается нулевым.
Что я делаю не так?
 
Вы путаете ПОЗИЦИЮ с ОТЛОЖЕННЫМ ОРДЕРОМ. Вам нужно работать со списком ПОЗИЦИЙ и получать данные ПОЗИЦИЙ.
 
Писал комментарий, отправил, а он куда то делся. :(
Всё таки, как мне осуществить полный цикл: открытие-анализ-закрытие_по_условию? Желательно, с примером.
 
SimpleUser #:
Писал комментарий, отправил, а он куда то делся. :(
Всё таки, как мне осуществить полный цикл: открытие-анализ-закрытие_по_условию? Желательно, с примером.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Открытие и закрытие ордера

Vladimir Karputov, 2021.09.04 08:42

Вы путаете ПОЗИЦИЮ с ОТЛОЖЕННЫМ ОРДЕРОМ. Вам нужно работать со списком ПОЗИЦИЙ и получать данные ПОЗИЦИЙ.

Вот здесь смесь мух и котлет у Вас:

   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      string symbol=PositionGetSymbol(i);
   
      ulong  order_ticket=OrderGetTicket(i);                   // тикет ордера
      ulong  magic=OrderGetInteger(ORDER_MAGIC);               // MagicNumber ордера
Причина обращения: