Странное поведение функций iBarShift, OrderCloseTime в тестере. Кто-нибудь сталкивался с подобным?

 
Была задача не открывать повторных ордеров в одном и том же таймфрейме. Для этого в условии открытия следующего ордера вычислялся номер бара закрытия предыдущего ордера с помощью OrderSelect(0, SELECT_BY_POS, MODE_HISTORY) && iBarShift(NULL,0,OrderCloseTime())!=0. Не помогло. Вывел значение iBarShift(NULL,0,OrderCloseTime()) в журнал через Print. Т.е., если предыдущий ордер был закрыт и в этом же таймфрейме есть сигнал на открытие нового ордера, то значение iBarShift(NULL,0,OrderCloseTime()) для последнего закрытого ордера должно быть равно 0. Но оно почему-то никогда не бывает равно 0. Решил для проверки сделать по-другому, чтобы новый ордер не открывался в течение 30 минут от закрытия предыдущего. Поставил условие: OrderSelect(0, SELECT_BY_POS, MODE_HISTORY) && TimeCurrent()-OrderCloseTime()>1800. Тоже не помогло. Вывел значение OrderCloseTime() в журнал через Print. Оказалось, что для всех закрытых ордеров это значение одно и то же. Не пойму, в чем дело. Кто-нибудь сталкивался с подобным?
 

Вам нужно искать время не OrderCloseTime(), а время бара ближайшего к OrderCloseTime().


Проверил, правда странно ведёт пример кода по функции iBarShift не работает а подправленный пожалуйста:

оригинал как в справке

datetime some_time=D'2009.03.21 12:00';
  int      shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
  Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);

после правки

datetime some_time=D'2009.03.21 12:00';
  int      shift=iBarShift(NULL,0,some_time);
  Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);

это уже к метаквотам.

 

Все намного проще - сначпла фильтруете ордера по времени закрытия - получаете время в абсолюте потом сравниваете его с временем открытия последнего бара, и так уже решаете что делать

и iBarShift() тут советшенно не причем ....

 
bool ifLastOrderCloseBar(int tf=0,int magic=0){int time;
  for(int i=0;i<OrdersHistoryTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==magic){
          if(OrderCloseTime()>time){
            time=OrderCloseTime();
          }
        }
      }
    }
  }
  if(time!=0){
    if(time>iTime(Symbol(),tf,0)){return(true);}
  }
  return(false);
}
 
как то криво правка работает....
 
xrust >>:
как то криво правка работает....

Угу право кривка :о)

 
Я столкнулся с такой проблемой. iBarShift в тестере работает неправильно. Решил проблему записью всех баров в файл в експерте и перенес их в папку тестера, теперь при тестировании советник берет номера баров из файла.
Причина обращения: