Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Anna Furmanova
705
Anna Furmanova  
Здравствуйте! Подскажите, пожалуйста функцию открытие противоположной сделки после закрытия стопа? 
Vitalii Ananev
10674
Vitalii Ananev  
Anna_89:
Здравствуйте! Подскажите, пожалуйста функцию открытие противоположной сделки после закрытия стопа? 
 Вам нужна функция которая ищет в истории последнюю по времени закрытую сделку. И далее если эта сделка закрыта с убытком, то можно предположить, что она закрылась по ордеру стоп лосс. После этого можно с помощью функции OrderSend() открыть противоположную сделку.  
Yuri Evseenkov
2336
Yuri Evseenkov  
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 Furmanova
705
Anna Furmanova  
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
2336
Yuri Evseenkov  

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





Anna Furmanova
705
Anna Furmanova  
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
2336
Yuri Evseenkov  

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

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

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