переоткрытие

 

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

Прошу подсказать след. вопрос.

Как реализовать при поступлении сигнала следующее:

если советник только запустился - проверку, что открытых позиций нет, чтобы не добавиться и не закрыть то, что не нужно;

если позиция уже есть (допустим покупка), сделать противоположную сделку, так чтобы позиция была открыта тем же объемом в другую сторону (продажа).

 
вам логическую цепочку или весь код ? MQL4 или MQL5
 
Yurij Izyumov:
вам логическую цепочку или весь код ? MQL4 или MQL5

MQL5. Я новичок. 

Пробую написать советник.

Определил условие покупки. Дальше пробую через условный оператор if-else. Не получается переоткрытие. Открываются buy и sell, если нет текущих позиций. Закрываются позиции по обратному сигналу. Но перевернуться не выходит.

Простой советник на двух скользящих. 

 

Если позиция открыта советником, то у нее, скорее всего, будет магик. Поэтому на Mql4 будет так:

if(OrdersTotal() != 0){                          //Если есть открытые ордера..
   for (int i = 0; i < OrdersTotal(); i++){     //..просматриваем каждый открытый ордер   
      OrderSelect(i, SELECT_BY_POS);            //Выбираем рыночный ордер, начиная с первого (можно с последнего)
      
      //Если символ ордера соответствует символу, на котором запущен советник
      //и магик ордера соответствует магику советника
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic){ 
         
         //Проверяем направление выставленного ордера
        if(OrderType() == OP_BUY){  //Если ордер выставлен на покупку
            
            /*Выставляем ордер на продажу с параметрами:
            Symbol()    - символ, на котором запущен советник
            OP_SELL     - направление на продажу
            OrderLots() - объем ранее выбранного ордера
            price       - цена, по которой выставляется ордер
            slippage    - проскальзывание
            sl          - стоплос
            tp          - тейкпрофит
            */
            OrderSend(Symbol(), OP_SELL, OrderLots(), price.bid, slippage, sl, tp, NULL, magic);
         }
         else if(OrderType() == OP_SELL){//Если ордер выставлен на продажу
            
            //Выставляем ордер на покупку
            OrderSend(Symbol(), OP_BUY,  OrderLots(), price.ask, slippage, sl, tp, NULL, magic);
         }
      }
   }
}
 
   MqlTradeRequest request;
   MqlTradeResult  result;
   if(OrdersTotal() != 0){                          //Если есть открытые ордера..
      for (int i = 0; i < OrdersTotal(); i++){     //..просматриваем каждый открытый ордер   
         OrderGetTicket(i);            //Выбираем рыночный ордер по тикету, начиная с первого (можно с последнего)
         
         //Если символ ордера соответствует символу, на котором запущен советник
         //и магик ордера соответствует магику советника
         if(OrderGetString(ORDER_SYMBOL) == Symbol() && OrderGetInteger(ORDER_MAGIC) == magic){ 
            
            //Проверяем направление выставленного ордера
           if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY){  //Если ордер выставлен на покупку
               
               /*Заполняем структуру отправки ордера на продажу
               */
               request.action = TRADE_ACTION_DEAL;
               request.symbol = Symbol();
               request.volume = OrderGetDouble(ORDER_VOLUME_CURRENT);
               request.price  = price.bid;
               request.type   = ORDER_TYPE_SELL;
               request.type_filling = ORDER_FILLING_FOK;
            }
            else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL){//Если ордер выставлен на продажу
               
               //Заполняем на покупку
               request.action = TRADE_ACTION_DEAL;
               request.symbol = Symbol();
               request.volume = OrderGetDouble(ORDER_VOLUME_CURRENT);
               request.price  = price.ask;
               request.type   = ORDER_TYPE_BUY;
               request.type_filling = ORDER_FILLING_FOK;
            }
            
            if(request.price != 0.0)
               OrderSend(request, result);
            
         }
      }
   }
 

2 Sergey Vasilev.

Ваш код для четвёрки будет плодить рыночные ордера на каждом тике по экспоненте, а в пятёрке вообще нужно проверять позиции, а не ордера (и то только на хеджевых счетах). )) 

 
AntonOB:

MQL5. Я новичок. 

Пробую написать советник.

Определил условие покупки. Дальше пробую через условный оператор if-else. Не получается переоткрытие. Открываются buy и sell, если нет текущих позиций. Закрываются позиции по обратному сигналу. Но перевернуться не выходит.

Простой советник на двух скользящих. 

Счёт хеджевый или неттинговый? Если неттинговый, то проверяйте наличие открытой позиции на инструменте и её направление. Если она есть, и если она не в ту сторону, куда надо, то просто открывайте противоположную позицию удвоенным лотом.
Причина обращения: