Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
AntonOB
17
AntonOB  

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

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

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

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

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

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

MQL5. Я новичок. 

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

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

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

Sergey Vasilev
158
Sergey Vasilev  

Если позиция открыта советником, то у нее, скорее всего, будет магик. Поэтому на 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);
         }
      }
   }
}
Sergey Vasilev
158
Sergey Vasilev  
   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);
            
         }
      }
   }
Sergei Vladimirov
9124
Sergei Vladimirov  

2 Sergey Vasilev.

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

Sergei Vladimirov
9124
Sergei Vladimirov  
AntonOB:

MQL5. Я новичок. 

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

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

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

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