Прошу помощи в скрипте - необходимо закрыть ордер при условии

 

Здравствуйте, в скриптах не силен и прошу помощи. Вроде простое условие но целый день не могу с этим разобраться.

Нужно закрыть существующий ордер при условии "if (v_kumoBreakoutSignal == 0 )"    спасибо



//+------------------------------------------------------------------+
//|                                                            T.mq4 |
//|                                                       Daniyar |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Daniyar"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


extern   string   ICHIMOKU             = "***************************************************";
extern   int      e_tenkan_sen         = 8; 
extern   int      e_kijun_sen          = 21;
extern   int      e_senkou_span_b      = 55;
extern   int      e_Ichimoku_shift     = 0;
extern   int      e_breakout_distance  = 10;



extern   string   ORDINI                     = "***************************************************";
extern   double   e_TakeProfit               = 100;
extern   double   e_Stoploss                 = 25;
extern   double   e_TrailingStop             = 35;
extern   double   e_TrailingStep             = 5;
extern   double   e_Lots                     = 0.1;
extern   int      e_MagicID                  = 23456;


double   g_Point = 0.0001;

int init(){
   double Poin;
   if (Point == 0.00001) Poin = 0.0001; 
   else 
      if (Point == 0.001) Poin = 0.01; 
      else Poin = Point; 
      
   g_Point = Poin;
   return(0);
}

int deinit(){
   return(0);
}


int start(){

   
   int v_total=OrdersTotal();
   if(v_total<1) {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*e_Lots)){
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
      }
   }
   else{
     int v_i = 0;
     while (v_i < v_total){
      
      if((OrderSelect(v_i, SELECT_BY_POS, MODE_TRADES)==true) && (OrderMagicNumber() == e_MagicID)){
         if (e_TrailingStop > 0){
            
            TrailingStop();
            return(0);
         }
      }   
      v_i++;
     }
   }

   int v_kumoBreakoutSignal  = kumoBreakoutSignal();
   int v_ticket;
  

   if (v_kumoBreakoutSignal == 1 ){
      RefreshRates();
      v_ticket=OrderSend(Symbol(), OP_BUY, e_Lots, Ask, 3, Ask - (e_Stoploss*g_Point), Ask + (e_TakeProfit*g_Point), "Kumo Breakout EA", e_MagicID, 0, Green);
      if(v_ticket>0){
         if(OrderSelect(v_ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
      }
      else Print("Error opening BUY order : ",GetLastError()); 
      return(0); 
   }
      
   if (v_kumoBreakoutSignal == 2 ){
      RefreshRates();
      v_ticket=OrderSend(Symbol(), OP_SELL, e_Lots, Bid, 3, Bid + (e_Stoploss*g_Point), Bid - (e_TakeProfit*g_Point), "Kumo Breakout EA", e_MagicID, 0, Red);
      
      if(v_ticket>0){
         if(OrderSelect(v_ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
      }
      else Print("Error opening SELL order : ",GetLastError()); 
      return(0); 
   }
       
   if (v_kumoBreakoutSignal == 0 ){
      RefreshRates();


          
      
      Закрыть открытый ордер
    
      
      
      
           
   }
   return(0);
}


int kumoBreakoutSignal(){
   
   
   int v_kumoBreakout = 0;
   int i;
   
   double v_SENKOUSPANA = iIchimoku(NULL, 0, e_tenkan_sen, e_kijun_sen, e_senkou_span_b, MODE_SENKOUSPANA, e_Ichimoku_shift);
   double v_SENKOUSPANB = iIchimoku(NULL, 0, e_tenkan_sen, e_kijun_sen, e_senkou_span_b, MODE_SENKOUSPANB, e_Ichimoku_shift);
   

   





if (Bid > v_SENKOUSPANA && Bid > v_SENKOUSPANB)
      for(i = 0; i <= e_breakout_distance; i++)
         if (Low[i] < iIchimoku(NULL, 0, e_tenkan_sen, e_kijun_sen, e_senkou_span_b, MODE_SENKOUSPANA, i) && Low[i] < iIchimoku(NULL, 0, e_tenkan_sen, e_kijun_sen, e_senkou_span_b, MODE_SENKOUSPANB, i)) 
            return (1);
   
   //segnale SHORT?
   if (Bid < v_SENKOUSPANA && Bid < v_SENKOUSPANB)
      for(i = 0; i <= e_breakout_distance; i++)
         if (High[i] > iIchimoku(NULL, 0, e_tenkan_sen, e_kijun_sen, e_senkou_span_b, MODE_SENKOUSPANA, i) && High[i] > iIchimoku(NULL, 0, e_tenkan_sen, e_kijun_sen, e_senkou_span_b, MODE_SENKOUSPANB, i)) 
            return (2);   
   return(v_kumoBreakout);
}






void TrailingStop(){
   RefreshRates();

   if (OrderType() == OP_BUY)
    if ((Bid - OrderOpenPrice()) > (e_TrailingStop * g_Point))
      if (OrderStopLoss() < Bid - (e_TrailingStop + e_TrailingStep - 1) * g_Point) {
         OrderModify(OrderTicket(), OrderOpenPrice(), Ask - e_TrailingStop * g_Point, OrderTakeProfit(), 0, Green);
         return;
      }
  if (OrderType()==OP_SELL)
    if ((OrderOpenPrice() - Ask) > (e_TrailingStop * g_Point))
      if (OrderStopLoss() > Ask + (e_TrailingStop + e_TrailingStep - 1) * g_Point || OrderStopLoss()==0) {
         OrderModify(OrderTicket(), OrderOpenPrice(), Ask + e_TrailingStop * g_Point, OrderTakeProfit(), 0, Red);
         return;
      }
      
}



 
 
Daniyar Nadyrshin:

Здравствуйте, в скриптах не силен и прошу помощи. Вроде простое условие но целый день не могу с этим разобраться.

Нужно закрыть существующий ордер при условии "if (v_kumoBreakoutSignal == 0 )"    спасибо



      
      Закрыть открытый ордер
    

Для удаления открытых ордеров нужна функция OrderClose(...) , для отложенных OrderDelete(...) .

 

Так подойдет?


Itog=false;

if(OrderType()==OP_BUY)  Itog=OrderClose(v_ticket,OrderLots(),Bid,10,Blue);

if(OrderType()==OP_SELL) Itog=OrderClose(v_ticket,OrderLots(),Ask,10,Red); 

If(Itog)Print("Ордер закрыт");

   else Print("Ошибка закрытия = ",GetLastError() );

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