Скачать MetaTrader 5

MQL4. Открытие противоположной сделки после стопа

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй торговый сигнал. Получи доступ к миллионам трейдеров!
Anna_89
507
Anna_89 2015.09.30 13:55 
Здравствуйте! Подскажите, пожалуйста функцию открытие противоположной сделки после закрытия стопа? 
Vitalii Ananev
8168
Vitalii Ananev 2015.09.30 14:04  
Anna_89:
Здравствуйте! Подскажите, пожалуйста функцию открытие противоположной сделки после закрытия стопа? 
 Вам нужна функция которая ищет в истории последнюю по времени закрытую сделку. И далее если эта сделка закрыта с убытком, то можно предположить, что она закрылась по ордеру стоп лосс. После этого можно с помощью функции OrderSend() открыть противоположную сделку.  
Yuri Evseenkov
2303
Yuri Evseenkov 2015.09.30 14:11  
Anna_89:
Здравствуйте! Подскажите, пожалуйста функцию открытие противоположной сделки после закрытия стопа? 

Функция OrderCloseBy в MQL4. Экономит один спред.

/ OrderCloseBy

Справочник MQL4 / Торговые функции / OrderCloseBy

OrderCloseBy

Закрытие одним открытым ордером другого ордера, открытого по тому же самому инструменту, но в противоположном направлении.

bool  OrderCloseBy(
   int        ticket,      // номер ордера для закрытия
   int        opposite,    // номер противоположного ордера
   color      arrow_color  // цвет
   );

Параметры

ticket

[in]  Уникальный порядковый номер закрываемого ордера.

opposite

[in]  Уникальный порядковый номер противоположного ордера.

arrow_color

[in]  Цвет стрелки закрытия на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

  if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
    {
     OrderCloseBy(order_id,opposite_id);
     return(0);
    }

 


Anna_89
507
Anna_89 2015.09.30 14:35  
Yuri Evseenkov:

Функция OrderCloseBy в MQL4. Экономит один спред.

/ OrderCloseBy

Справочник MQL4 / Торговые функции / OrderCloseBy

OrderCloseBy

Закрытие одним открытым ордером другого ордера, открытого по тому же самому инструменту, но в противоположном направлении.

bool  OrderCloseBy(
   int        ticket,      // номер ордера для закрытия
   int        opposite,    // номер противоположного ордера
   color      arrow_color  // цвет
   );

Параметры

ticket

[in]  Уникальный порядковый номер закрываемого ордера.

opposite

[in]  Уникальный порядковый номер противоположного ордера.

arrow_color

[in]  Цвет стрелки закрытия на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

  if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
    {
     OrderCloseBy(order_id,opposite_id);
     return(0);
    }

 


А как эту функцию использовать в коде:

int start()
  {
   int tiket;
     
   if(Time[0]==prevtime)
      return(0);
   prevtime=Time[0];

   if(OrdersTotal()<1)
     {
      double STF0  = iMA(Symbol(), 0, MA1_Period, 0, 3, 4, 0);
      double STF1  = iMA(Symbol(), 0, MA1_Period, 0, 3, 4, 1);
      double MA1   = iMA(Symbol(), 0, MA1_Period, 0, 3, 4, 0);
      double MA2   = iMA(Symbol(), 0, MA2_Period, 0, 3, 4, 0);
      double MA3   = iMA(Symbol(), 0, MA3_Period, 0, 3, 4, 0);
     
      if(((STF1>STF0) && (MA1>MA2)) && (MA2>MA3)) // Buy
           {
            tiket=OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),Slippage,NormalizeDouble(Ask-Sl*Point,Digits),0,"",Magic,0,clrGreen);
            if(tiket<0) { Print("Ошибка при выборе ордера BUY #",GetLastError()); prevtime=Time[1]; }
           }
      if(((STF1<STF0) && (MA1<MA2)) && (MA2<MA3)) // Sell
           {
            tiket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Slippage,NormalizeDouble(Bid+Sl*Point,Digits),0,"",Magic,0,clrRed);
            if(tiket<0) { Print("Ошибка при выборе ордера BUY #",GetLastError()); prevtime=Time[1]; }
           }
     }
Yuri Evseenkov
2303
Yuri Evseenkov 2015.09.30 15:07  

Нужно вычислить значение стопа.  SL_BUY=Ask-Sl*Point,Digits, и вставить проверку условия: если ASK<SL_BUY то применяем  функцию OrderCloseBy() согласно логике вашего кода.





Anna_89
507
Anna_89 2015.09.30 15:15  
Yuri Evseenkov:

Нужно вычислить значение стопа.  SL_BUY=Ask-Sl*Point,Digits, и вставить проверку условия: если ASK<SL_BUY то применяем  функцию OrderCloseBy() согласно логике вашего кода.





У меня получается так. При этом выдает ошибку OrderCloseBy error 4051.

if(OrdersTotal()<1)
     {
      double STF0  = iMA(Symbol(), 0, MA1_Period, 0, 3, 4, 0);
      double STF1  = iMA(Symbol(), 0, MA1_Period, 0, 3, 4, 1);
      double MA1   = iMA(Symbol(), 0, MA1_Period, 0, 3, 4, 0);
      double MA2   = iMA(Symbol(), 0, MA2_Period, 0, 3, 4, 0);
      double MA3   = iMA(Symbol(), 0, MA3_Period, 0, 3, 4, 0);
     
      if(((STF1>STF0) && (MA1>MA2)) && (MA2>MA3)) // Buy
           {
            SL_BUY=NormalizeDouble(Ask-Sl*Point,Digits);
            
            tiket1=OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),Slippage,SL_BUY,0,"",Magic,0,clrGreen);
            if(tiket1<0) { Print("Ошибка при выборе ордера BUY #",GetLastError()); prevtime=Time[1]; }
           }
      if(Ask<SL_BUY)    
       {
        OrderCloseBy(tiket1,tiket2,clrNONE);
        return(0);  
       }   
      if(((STF1<STF0) && (MA1<MA2)) && (MA2<MA3)) // Sell
           {
            SL_SELL=NormalizeDouble(Bid+Sl*Point,Digits);
            
            tiket2=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Slippage,SL_SELL,0,"",Magic,0,clrRed);
            if(tiket2<0) { Print("Ошибка при выборе ордера BUY #",GetLastError()); prevtime=Time[1]; }
           }
       if(Bid<SL_SELL)    
       {
        OrderCloseBy(tiket2,tiket1,clrNONE);
        return(0);  
       }       
     }
Yuri Evseenkov
2303
Yuri Evseenkov 2015.09.30 15:34  

Вместо  if(Bid<SL_SELL)  должно быть  if(Bid>SL_SELL) открыт ордер на продажу и Bid должен быть больше .

Это фрагмент кода и мне трудно судить о правильности. Попробуйте.

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