Ошибка в коде или скорость тестера стратегий?

 

Добрый вечер!

Тестирую советник.

Делаю на тик проверку, открыт ли ордер в этом(Н4) баре, и не могу понять почему иногда проскакивает и не замечает сделку. Помогите разобраться.

void OnTick()
  {
//---
//определения fl......
//и на каждый тик проверка
   int copiedRates=CopyRates(SymbInfo[l].Name(),PERIOD_H4,0,1,rates);
   if(copiedRates>0)
     {

      SymbInfo[l].RefreshRates();

      T=rates[0].time;
      if(fl==-1)
        {
         //OP_BUY
         if(NoTradeThisBar(SymbInfo[l].Name(),PERIOD_H4,T,TimeCurrent(),DEAL_TYPE_BUY)==true)
           {
            OrderBUY(SymbInfo[l].Name());
           }
        }
      if(fl==1)
        {
         //OP_SELL
         if(NoTradeThisBar(SymbInfo[l].Name(),PERIOD_H4,T,TimeCurrent(),DEAL_TYPE_SELL)==true)
           {
            OrderSELL(SymbInfo[l].Name());
           }
        }

     }
  }
//---
}
//+------------------------------------------------------------------+
//ф-я возвращает true если в этом периоде/баре НЕ делалась сделка определенного типа или она уже закрылась,
//иначе если сделка определенного типа сделаная в этом периоде/баре еще открыта, то вернуть false
bool NoTradeThisBar(string m_symbol,ENUM_TIMEFRAMES m_period,datetime start_time,datetime finish_time,ENUM_DEAL_TYPE m_type)
  {

   HistorySelect(start_time,finish_time);
   uint     total=HistoryOrdersTotal();//HistoryDealsTotal();
   FileWrite(fileHandle,""+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" total="+total+" start_time="+TimeToString(start_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" finish_time="+TimeToString(finish_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));

   if(total==0)
     {
      return true;
     }

   string   name;
   ulong    ticket=0;
   double   price;
   double   profit;
   datetime time;
   string   symbol;
   long     type;
   long     entry;
   for(uint i=total;i>0;i--)

     {
      //if(ticket=HistoryOrderGetTicket(i))
      //  {
         ticket=HistoryOrderGetTicket(i);

         //--- получим свойства ордера
         price=HistoryOrderGetDouble(ticket,ORDER_PRICE_OPEN);
         time=HistoryOrderGetInteger(ticket,ORDER_TIME_SETUP);
         symbol=HistoryOrderGetString(ticket,ORDER_SYMBOL);
         type=HistoryOrderGetInteger(ticket,ORDER_TYPE);

         FileWrite(fileHandle,"ticket="+ticket+" price="+price+" symbol="+symbol);//+" profit="+profit
         if(price && time && symbol==m_symbol)
           {
            FileWrite(fileHandle,"m_type="+m_type+" type="+type);
            if(m_type==type)
              {
               datetime time_array[];
               if(CopyTime(m_symbol,m_period,start_time,1,time_array)==-1)
                 {
                  FileWrite(fileHandle,"Ошибка CopyTime! "+Err.ОписаниеОшибки(GetLastError()));
                  return(false);
                 }
               FileWrite(fileHandle,"time="+TimeToString(time,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" time_array[0]="+TimeToString(time_array[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
               if(time>=time_array[0])
                 {
                  FileWrite(fileHandle,""+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"ОТКАЗ на сделку т.к. делалась в этом баре, ее время = "+TimeToString(time,TIME_DATE|TIME_SECONDS));
                  return(false);
                 }

              }
           }
        //}
     }

   return true;
  }
//+------------------------------------------------------------------+

анализируя лог наблюдаю total....    странно....

проверка, ордеров нет
2010.10.12 10:36:57 total=0 start_time=2010.10.12 08:00:00 finish_time=2010.10.12 10:36:57
входим
2010.10.12 10:36:57 b-> Ордер BUY по EURUSD по цене 1.37926
теперь через 2 сек приходит новый тик
проверка 
2010.10.12 10:36:59 total=1 start_time=2010.10.12 08:00:00 finish_time=2010.10.12 10:36:59
ticket=0 price=0 symbol=
НЕПОЙМУ total=1 ПОЧЕМУ НЕ ВЫБРАЛСЯ ОРДЕР ??
входим ПО ОШИБКЕ!!!!!!!!!
2010.10.12 10:36:59 b-> Ордер BUY по EURUSD по цене 1.37924
далее почти все красиво....
2010.10.12 10:37:40 total=2 start_time=2010.10.12 08:00:00 finish_time=2010.10.12 10:37:40
ticket=0 price=0 symbol=          ПРАВДА ЭТО МНЕ НЕ ПОНЯТНО ПОЧЕМУ ВЫВЕЛОСЬ???
ticket=3 price=1.37924 symbol=EURUSD
m_type=0 type=0
time=2010.10.12 10:36:59 time_array[0]=2010.10.12 08:00:00
2010.10.12 10:37:40 ОТКАЗ на сделку т.к. делалась в этом баре, ее время = 2010.10.12 10:36:59

и все тики в этой 4х часовке  обрабатываются нормально ОТКАЗ на сделку, ну так и надо аж до

2010.10.12 11:08:15 total=2 start_time=2010.10.12 08:00:00 finish_time=2010.10.12 11:08:15
ticket=0 price=0 symbol=
ticket=3 price=1.37924 symbol=EURUSD
m_type=0 type=0
time=2010.10.12 10:36:59 time_array[0]=2010.10.12 08:00:00
2010.10.12 11:08:15 ОТКАЗ на сделку т.к. делалась в этом баре, ее время = 2010.10.12 10:36:59

потом ордер закрывается по тейку, и вот снова такая же ошибка позже...

2010.10.19 21:31:02 total=0 start_time=2010.10.19 20:00:00 finish_time=2010.10.19 21:31:02
2010.10.19 21:31:02 b-> Ордер BUY по EURUSD по цене 1.37164
2010.10.19 21:31:03 total=1 start_time=2010.10.19 20:00:00 finish_time=2010.10.19 21:31:03
ticket=0 price=0 symbol=
ОПЯТЬ входим ПО ОШИБКЕ!!!!!!!!!
2010.10.19 21:31:03 b-> Ордер BUY по EURUSD по цене 1.37161 
2010.10.19 21:31:04 total=2 start_time=2010.10.19 20:00:00 finish_time=2010.10.19 21:31:04
ticket=0 price=0 symbol=
ticket=6 price=1.37161 symbol=EURUSD
m_type=0 type=0
time=2010.10.19 21:31:03 time_array[0]=2010.10.19 20:00:00
2010.10.19 21:31:04 ОТКАЗ на сделку т.к. делалась в этом баре, ее время = 2010.10.19 21:31:03
2010.10.19 21:31:04 total=2 start_time=2010.10.19 20:00:00 finish_time=2010.10.19 21:31:04
ticket=0 price=0 symbol=
ticket=6 price=1.37161 symbol=EURUSD
m_type=0 type=0
time=2010.10.19 21:31:03 time_array[0]=2010.10.19 20:00:00
2010.10.19 21:31:04 ОТКАЗ на сделку т.к. делалась в этом баре, ее время = 2010.10.19 21:31:03
...

надеюсь на вашу помощь, я в тупике

 

 
snik_666:

Добрый вечер!

Тестирую советник.

Делаю на тик проверку, открыт ли ордер в этом(Н4) баре, и не могу понять почему иногда проскакивает и не замечает сделку. Помогите разобраться.

анализируя лог наблюдаю total....    странно....

надеюсь на вашу помощь, я в тупике

 

Замените
for(uint i=total;i>0;i--)

на

for(uint i=total-1;i>=0;i--)


 

да , верно!

или можно

....

    if(total==0)
     {
      return true;
     }
     
    if(total==1)
     {
      return false;
     } 

......

но total то есть, почему он не обрабатывается ?


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