Закрытие ордера по условию

 

Помогите пожалуйста закрыть открытые ордера по условию индикаторов, а именно интересует случай когда одна MA больше другой вот кусок из программы который работает только на покупку но закрывает она только по SL или TP а надо чтобы закрывала при пересечении одной MA другой

  if (x3>x2 && x2>x1)
{
  ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,"-",0,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
}
else Print("Ошибка при открытии BUY позиции : ",GetLastError());
return(0);
}

А вот как это кусок сделать чтобы работал неполучается


if(x3<x2)
{
OrderClose(total,Lots,Bid,2);

return(0);
}

 
Ну кто-нибудь помогите плиз
 
void CheckForClose(int Magic)
  {

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Curr_symb) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(x3<x2) OrderClose(OrderTicket(),OrderLots(),Bid,3);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(x3>x2) OrderClose(OrderTicket(),OrderLots(),Ask,3);
         break;
        }
     }
//----
  }

наверно так

почитайте хэлп по функции OrderClose

 

https://www.mql5.com/ru/forum/105913 (закрытие позиций по сигналу индюка))

Там есть пример со стохастиком:

//********* Закрытие позиций ****************************************
if (AutoClose) {  //если выключатель включен
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
 for (int v=0; v<OrdersTotal(); v++)                        {//перебираем ордера       
   if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))            {//выбираем из открытых           
     if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum){//по заданному магику 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>75 && Stochast_0<75)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем бай-позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<25 && Stochast_0>25)    {
              OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем сел-позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //AutoClose
 
Tatero:


А вот как это кусок сделать чтобы работал неполучается


if(x3<x2)
{
OrderClose(total,Lots,Bid,2);

return(0);
}

 

 double x1=iMA(NULL,0,MovingPeriod_1,MovingShift,MODE_SMA,PRICE_CLOSE,0);
 double x2=iMA(NULL,0,MovingPeriod_2,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//-

а потом - пойдет "ваш кусок"...

Не забудьте во внешних параметрах задать:

   extern int MovingPeriod_1 = 14;//период быстрой ма
     extern int MovingPeriod_2= 21;//период медленной ма


 
Tatero:
Ну кто-нибудь помогите плиз

https://book.mql4.com/ru/trading/orderclose

2 IgorM

void CheckForClose(int Magic)
  {

   for(int i=0;i<OrdersTotal();i++) { //- Это неверно для цикла с удалением ордеров - сотни раз обсуждалось
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Curr_symb) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(x3<x2) OrderClose(OrderTicket(),OrderLots(),Bid,3);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(x3>x2) OrderClose(OrderTicket(),OrderLots(),Ask,3);
         break;
        }
     }
//----
  }  

 
VladislavVG:

https://book.mql4.com/ru/trading/orderclose

2 IgorM


спс, я посмотрю, просто эту функцию себе оставил из программы для автоматического написания советников Forex EA Generator

если не сложно исправьте эту ф-цию плз 

 
IgorM:


спс, я посмотрю, просто эту функцию себе оставил из программы для автоматического написания советников Forex EA Generator

если не сложно исправьте эту ф-цию плз

void CheckForClose(int Magic)
  {

   for(int i=OrdersTotal()-1;i>=0;i--) { //- при переборе в другую сторону после удаления ордера меняется нумерация и ордера могут быть пропущены
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Curr_symb) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(x3<x2) OrderClose(OrderTicket(),OrderLots(),Bid,3);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(x3>x2) OrderClose(OrderTicket(),OrderLots(),Ask,3);
         break;
        }
     }
//----
  }  

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