Как закрыть позиции без перебора в советнике? - страница 3

 
fxsaber #:
Непонятно, зачем полное закрытие и модификации делать синхронным торговыми приказами? Всегда используйте для этого асинхронку без каких-либо обработок транзакций.

Руки до этого не дошли, так как нет жесткой необходимости в этом для используемых мной советников. Такая реализация пока устаивает.

 
Anton Novokhatskii #:

Спасибо за разьяснение, попробую изменить)

Возьмите функцию из документации, замените синхронное закрытие на асинхронное и будет вам счастье.

#define EXPERT_MAGIC 123456   // MagicNumber эксперта
//+------------------------------------------------------------------+
//| Закрытие всех позиций                                            |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // количество открытых позиций   
//--- перебор всех открытых позиций
   for(int i=total-1; i>=0; i--)
     {
      //--- параметры ордера
      ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // MagicNumber позиции
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции
      //--- вывод информации о позиции
      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  magic);
      //--- если MagicNumber совпадает
      if(magic==EXPERT_MAGIC)
        {
         //--- обнуление значений запроса и результата
         ZeroMemory(request);
         ZeroMemory(result);
         //--- установка параметров операции
         request.action   =TRADE_ACTION_DEAL;        // тип торговой операции
         request.position =position_ticket;          // тикет позиции
         request.symbol   =position_symbol;          // символ 
         request.volume   =volume;                   // объем позиции
         request.deviation=5;                        // допустимое отклонение от цены
         request.magic    =EXPERT_MAGIC;             // MagicNumber позиции
         //--- установка цены и типа ордера в зависимости от типа позиции
         if(type==POSITION_TYPE_BUY)
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
            request.type =ORDER_TYPE_SELL;
           }
         else
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
            request.type =ORDER_TYPE_BUY;
           }
         //--- вывод информации о закрытии
         PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- отправка запроса
         if(!OrderSendAsync(request,result))
            PrintFormat("OrderSendAsync error %d",GetLastError());  // если отправить запрос не удалось, вывести код ошибки
         //--- информация об операции   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //---
        }
     }
  }

Если не нужна проверка магика, так удалите её (выделено жёлтым) и все дела…

 
Yuriy Bykov #:

Руки до этого не дошли, так как нет жесткой необходимости в этом для используемых мной советников. Такая реализация пока устаивает.

У Вас просто гарантированное закрытие, т.е. не случай топикстартера.

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

Как закрыть позиции без перебора в советнике?

Anton Novokhatskii, 2024.04.10 08:49

 В MT5 если кликнуть правой кнопкой мыши на открытые позиции, можно найти вкладку Групповые операции- Закрыть все позиции.
 
if(OrderType()==OP_BUY ){ if((Бабушка попросила закрыться)){OrdB=OrderClose(OrderTicket(),OrderLots(),SYMBOL_BID,0,Red)}