Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Написал программу? Опубликуй ее в Code Base!
AntonOB
17
AntonOB 2016.07.05 17:59 

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

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

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

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

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

Yurij Izyumov
16804
Yurij Izyumov 2016.07.05 18:02  
вам логическую цепочку или весь код ? MQL4 или MQL5
AntonOB
17
AntonOB 2016.07.05 19:33  
Yurij Izyumov:
вам логическую цепочку или весь код ? MQL4 или MQL5

MQL5. Я новичок. 

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

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

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

Sergey Vasilev
158
Sergey Vasilev 2016.07.06 00:39  

Если позиция открыта советником, то у нее, скорее всего, будет магик. Поэтому на 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 2016.07.06 01:46  
   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
8774
Sergei Vladimirov 2016.07.07 12:58  

2 Sergey Vasilev.

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

Sergei Vladimirov
8774
Sergei Vladimirov 2016.07.07 13:00  
AntonOB:

MQL5. Я новичок. 

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

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

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

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