Левые тики?

 

Отлаживая тиковый график наткнулся на некую особенность.

В конце текущей минуты на минутном графике (или наверно любого бара на другом ТФ) если прямо в эту секунду нет тика, терминал принудительно "закрывает" текущий бар и открывает новый. Но делает это очень "хитро": бар закрывается эмулированием прихода тика без цены!! (вместо него дает значение EMPTY_VALUE = 2147483647) и открывает новый бар с прошлым значением цены.

В результате имеем два лишних тика: вброшенная пустышка и дубликат. грустно както :((((

коментарии????

 
возможно я ошибаюсь, но думаю дело не в терминале, а в сервере - наверное он дает команду закрыть и перерисовать ТФ, у Вас кажется название ТФ совпадает со стандартным
 
Не надо отлаживать тиковые стратегии, они все грустные.
 

понятное дело что терминал только отображает то что ему дал сервер. ну уточним формулировку: действительно ли сервер посылает терминалу два левых тика? ведь мой start дернулся два раза отрабатывая эти несуществующие тики.

и тут еще одна вредность. я получаю эту пустую цену со значением 2147483647(!!!) прямо из предопределенной переменной Bid

  double CurPrice = Bid; 
  
  // если настоящий тик а не эмулированный тик или обновление...
  if ( PrevVolume != Volume[0] ) // сдвинем старые тики назад
  {     
    if ( PriceCnt > 0 ) for (i = PriceCnt-1; i >= 0; i--) { Price[i+1] = Price[i];  PriceTime[i+1] = PriceTime[i]; }
    Price[0] = CurPrice; PriceTime[0] = TimeCurrent(); // запомним новый тик
    if ( PriceCnt < Bars-2) PriceCnt++;           // увеличим счетчик
  }

  string dbg = ""; for ( i=0;i<30;i++) dbg = dbg + "\n" + DoubleToStr(Price[i],6)+" "+TimeToStr(PriceTime[i],TIME_SECONDS);
  Comment(dbg);
эт значит что любой эксперт или индикатор может в любой момент нарваться на это значение и сдуру решить по нему выставить сигнал на открытие ордера :(
 
splxgf:
Не надо отлаживать тиковые стратегии, они все грустные.
если вы не умеете плавать, это вовсе не означает что купание в море это пустая трата времени не приносящая ничего кроме грусти ;) :))
 

сорри - погорячился.

дело в том, что Price - это буферный массив индикатора. при приходе нового тика терминал сам сдвигает его элементы "на один назад". в появившийся новый элемент ессесно вписывается EMPTY_VALUE. после этого я его еще раз сдвигаю назад и загоняю эту пустышку как вродебы полученное от сервера значение. вот так - работает правильно:

  bool OldBar = false; if ( PrevTime == Time[0] ) OldBar = true; 

  // если настоящий тик а не эмулированный тик или обновление...
  if ( PrevVolume != Volume[0] ) // сдвинем старые тики назад
  {     
    if ( OldBar && PriceCnt > 0 ) for (i = PriceCnt-1; i >= 0; i--) { Price[i+1] = Price[i];  PriceTime[i+1] = PriceTime[i]; }
    Price[0] = CurPrice; PriceTime[0] = TimeCurrent(); // запомним новый тик
    if ( PriceCnt < Bars-2) PriceCnt++;           // увеличим счетчик
  }

 
Ага, у меня тоже сейчас на 5ке наверное под 70% претензий получаются из-за собственных ошибок и невнимательности.
 
TheXpert:
Ага, у меня тоже сейчас на 5ке наверное под 70% претензий получаются из-за собственных ошибок и невнимательности.

Это про библиотеку?
 
По большому счету да, но не только. В отличие от 4ки, на 5ке я серьезно вознамерился избавляться (если это не затратно) от любого дублирования кода, т.е. что-то типа библиотеки функций Игоря.
 
TheXpert:
По большому счету да, но не только. В отличие от 4ки, на 5ке я серьезно вознамерился избавляться (если это не затратно) от любого дублирования кода, т.е. что-то типа библиотеки функций Игоря.

Не всегда это нужно делать, и не всегда можно. Пятерка конечно по быстрее будет. Но ресурсы все равно надо беречь
Причина обращения: