Открытие ордера и почти мгновенное его закрытие

 

Я написал простенький советник. Принципы таковы:

1. Допускается только один открытый ордер.

2. Закрытие ордера происходит при открытии нового бара.

Проблема состоит в том, что при выполнении условия открытия ордера совершается открытие одного ордера и закрытие его же в пределах данного бара, а потом открытие другого ордера, закрытие которого, как и заложено в условиях, происходит при открытии нового бара.

Буду очень признателен если вы мне поможете найти ошибку и исключить открытие незапланированного ордера.

Спасибо.

Файлы:
 
Che:

Я написал простенький советник. Принципы таковы:

1. Допускается только один открытый ордер.

2. Закрытие ордера происходит при открытии нового бара.

Проблема состоит в том, что при выполнении условия открытия ордера совершается открытие одного ордера и закрытие его же в пределах данного бара, а потом открытие другого ордера, закрытие которого, как и заложено в условиях, происходит при открытии нового бара.

Буду очень признателен если вы мне поможете найти ошибку и исключить открытие незапланированного ордера.

Спасибо.

проблема в том, что вы проверяете новый бар или нет только тогда, когда есть ордер.

Соответственно (условно)

в 9 утра открылся ордер, в 10 утра закрылся.

Далее. В 14 дня открылся ордер

На следующем тике проверяем новый бар или нет. А он новый - последний раз новый бар или нет проверяли только в 10 утра...


Самое простое - измените эксперта так:

//+------------------------------------------------------------------+
//|                                                   iSAR_3bars.mq4 |
//|                                          Copyright 2012, Che           |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Che"
#property link      ""

extern double StopLoss   =50;     
extern double TakeProfit =50;      
extern double Lots       =0.01;
int i;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
  datetime Prev_Time=0; 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   double sl = NormalizeDouble(StopLoss * Point,Digits);
   double tp = NormalizeDouble(TakeProfit * Point,Digits);
   double Op0=Open[0];
   double Op1=Open[1];
   double Op2=Open[2];
   double Op3=Open[3];
   double A=NormalizeDouble(Ask,Digits);
   double B=NormalizeDouble(Bid,Digits);
   double iS0 = iSAR(NULL,0,2.71,6.41,0); // 0 bar
   double iS1 = iSAR(NULL,0,2.71,6.41,1); // 1 bar
   double iS2 = iSAR(NULL,0,2.71,6.41,2); // 2 bar
   double iS3 = iSAR(NULL,0,2.71,6.41,3); // 3 bar
   
//----
   if(OrdersTotal()>0)                                // Если уже совершена покупка или продажа.
      {
      if(Fun_New_Bar()==false)                        // Если нет нового бара выходим.
         {
         return(0);
         }
      OrderSelect(0,SELECT_BY_POS,MODE_TRADES);       // Если есть новый бар выбираем ордер (он у нас должен быть всего один).
      if(OrderType()==OP_BUY)                         // Если это Buy..
         {
         OrderClose(OrderTicket(),Lots,B,0);          // ..закрываем его.
         return(0);
         }
      if(OrderType()==OP_SELL)                        // Если это Sell..
         {
         OrderClose(OrderTicket(),Lots,A,0);          // ..закрываем его.
         return(0);
         }
      }
   //else
   {
      if(iS3<Op3 && iS2<Op2 && iS1<Op1 && iS0>Op0) // condition to sell
         {
         OrderSend(Symbol(),OP_SELL,Lots,B,0,A+sl,A-tp,"",0,0,Green);
         Prev_Time = Time[0];
         return(0);
         }
      if(iS3>Op3 && iS2>Op2 && iS1>Op1 && iS0<Op0) // condition to buy
         {OrderSend(Symbol(),OP_BUY,Lots,A,0,B-sl,B+tp,"",0,0,Green);
         Prev_Time = Time[0];
         return(0);
         }
   }
   return(0);
   }   
   //--
   bool Fun_New_Bar()                              // Ф-ия обнаружения ..
      {                                             // .. нового бара
      if(Prev_Time!=Time[0])                        
          {                      
             return(true);                            
          }
       return(false);
       }

//+------------------------------------------------------------------+
 
Спасибо, ilunga!