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

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

 


 
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]; }
           }
     }
 

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





 
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);  
       }       
     }
 

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

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

Причина обращения: