Индикатор для "нормального" чарта и индикатор для визуализатора. В чем разница?

 

Сразу поясню, что под "нормальным" я понимаю самы обычный график котировок, который показывает нам последние цены и на который мы обычно наносим линии трендов и всякое такое готовясь открыть позицию.

А "для визуализатора" - это, соотв., такой чарт, который выскакивает если мы запустили эксперта на тестирование и выбрали чек-бокс "Визуализация".

Так вот - может уже кто-нибудь привести список(функций? операторов? тонких моментов? не знаю...) тех факторов, что необходимо учитывать при написании иникаторов для их последующего отображения в обоих режимах?

Откуда вообще вопрос: неоднократно сталкивался с ситуациями, когда индик. совершенно без проблем работает в "нормальном" графике(что on-, что off-line - без разницы, везде хорошо) и даже не отображается(абсолютно) в графике визуализатора. Пару раз тут спрашивал - все молчат. :( Можно уже внести ясность в этот системообразующий вопрос-то? >:|

P.S. Если уже обсуждалось - мой Гранд-пардон, но поиск ничего не дал. Тогда просто линк, плиз.

 
А какой, например, индикатор не отображается на тестинге? Мне такие не попадались пока...
 
DrShumiloff:
А какой, например, индикатор не отображается на тестинге? Мне такие не попадались пока...

Только за эту неделю 3 штуки видел. Сейчас под рукой есть один из них, но он здоровый ~500 строк кода. Попробую оставить в нем лишь граф. часть для удобства воспроизведения проблемы и тогда выложу сюда.

 

Так вот - может уже кто-нибудь привести список(функций? операторов? тонких моментов? не знаю...) тех факторов, что необходимо учитывать при написании иникаторов для их последующего отображения в обоих режимах?

Особо нет специальных функций для этого. Если используются функции iCose и т.п., номер бара надо определять через iBarShift.

Еще, если ArrayCopyRates используется, надо определять номер бара с которого копировать.

 

Вот-с, извольте видеть. Инструкция:

1. Скомпилить идник:

#property indicator_chart_window
double dayHigh=-1, dayLow=-1; //High/Low текущего дня
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   CreateAllLines();
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit(){return(0);}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int pj_i, counted_bars=IndicatorCounted();
   pj_i=Bars-counted_bars-1; // Индекс первого непосчитанного
   while(pj_i>=0) // Цикл по непосчитанным барам
   {
     if(dayHigh<High[0] || dayLow>Low[0] || TimeDayOfWeek(Time[0])!=TimeDayOfWeek(Time[1])) {/*just skip*/}
     pj_i--; // Расчёт индекса следующего 
   }
   return(0);
  }
//+------------------------------------------------------------------+

void CreateAllLines()
{
   if(dayHigh!=-1 || dayLow!=-1) return;
   dayHigh=iHigh(NULL,PERIOD_D1,0);
   dayLow=iLow(NULL,PERIOD_D1,0);
   ObjectCreate("dayHigh",OBJ_HLINE,0,D'2007.05.01 00:00:00',dayHigh);
   ObjectCreate("dayLow",OBJ_HLINE,0,D'2007.05.01 00:00:00',dayLow);
   ObjectSet("dayHigh",OBJPROP_COLOR,Aqua);
   ObjectSet("dayLow",OBJPROP_COLOR,Aqua);
   ObjectSet("dayHigh",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("dayLow",OBJPROP_STYLE,STYLE_DASH);
}

2. Открыть "нормальный" чарт, бросить на него скомпиленное и убедиться, что имеется 2 горизонтальных линии. Можно подождать пару тиков дабы убедиться что линии никуда не деваются(хоть это и так понятно).

3. Закрыть "нормальный" чарт, открыть тестер, выбрать "Визуализация", выбрать эксперта для тестирования(чистоты постановки испытаний для, я рекомендую эксперта из одной строки: void start(){}).

4. Стартуем тестер, ждем когда он отобразит свой граф, на него кидаем тоже что и ранее кидали на "нормальный" граф.

5. Наблюдаем полное отсутствие каких либо линий.

6. Задаемся вопросом - что за на...???

 

А у меня все отображает. Необходимо только поправить уровень линий (что-бы он был в зоне видимой части графика, а не ноль, например, или на другом каком уровне.) и также цвет отображения линий чтобы не совпадал с фоном.

Проблема всей темы в кривизне таких индикаторов.

 
Integer:

Так вот - может уже кто-нибудь привести список(функций? операторов? тонких моментов? не знаю...) тех факторов, что необходимо учитывать при написании иникаторов для их последующего отображения в обоих режимах?

Особо нет специальных функций для этого. Если используются функции iCose и т.п., номер бара надо определять через .

Еще, если Rates используется, надо определять номер бара с которого копировать.

Это только один момент.  Есть еще одна фишка, которая в обычных условиях практически не встречается, а вот когда нужно данные с другого таймфрейма или по другому инструменту получить вылезает: TimeCurrent().... в индикаторах эта функция последнее серверное время выдает, а не моделируется, поэтому очень часто безупречный на реал-тайм графике индикатор, на визуализации молчит как "рыба об лед". Оно все бы ничего, когда со старших чего-то просишь (легко обходится через Time[i]), а вот когда с младших, то только два пути остается, либо с дискретностью равной периоду рабочего таймфрейма согласиться, либо через глобальную переменную это время получать, от работающего на том же графике эксперта....

 

to SamMan

{
     if(dayHigh<High[0] || dayLow>Low[0] || TimeDayOfWeek(Time[0])!=TimeDayOfWeek(Time[1])) {/*just skip*/}
     pj_i--; // Расчёт индекса следующего 
}

а что вы от него хотите-то? :)

 
D500_Rised:

Необходимо только поправить уровень линий (что-бы он был в зоне видимой части графика, а не ноль, например, или на другом каком уровне.)

Линии в тест-индюке, на минуточку, рисуются по Хай/Лоу последних баров. Как сами считаете - они могут быть НЕ "в зоне видимой части графика"?

и также цвет отображения линий чтобы не совпадал с фоном.
Цвет черный, линии синие(бледные).
Проблема всей темы в кривизне таких индикаторов.

О! Об чем и спрос!! В чем кривизна конкретно? Как выпрямить?

 

а что вы от него хотите-то? :)

Я хочу всего-лишь одного: идентичной работы идентичного кода в обоих условиях(что есть "условия" - см. первый пост). Это не слишком много я хочу? :)

Вы не замечаете разницы в работе?

 
SamMan:

а что вы от него хотите-то? :)

Я хочу всего-лишь одного: идентичной работы идентичного кода в обоих условиях(что есть "условия" - см. первый пост). Это не слишком много я хочу? :)

Вы не замечаете разницы в работе?

Еще раз.

Первое. Что у вас делается в этой строке?:

if(dayHigh<High[0] || dayLow>Low[0] || TimeDayOfWeek(Time[0])!=TimeDayOfWeek(Time[1])) {/*just skip*/}

Второе. Эта часть кода выполняется только один раз, при инициализации и больше обращения к этой функции в коде не наблюдается:

int init()
  {
   CreateAllLines();
   return(0);
  }

Третье.

dayHigh=iHigh(NULL,PERIOD_D1,0);
dayLow=iLow(NULL,PERIOD_D1,0);

Я не знаю на каком таймфрейме вы этот индикатор запускаете, но если это не D1, то вы постоянно будете получать (если исправите ошибки) одно и то же значение с нулевого бара D1.... объясняю: моделирование происходит только на том ТФ, где работает эксперт,  все остальные таймфреймы - голая статическая история. 

Более того. Если вы пытаетесь с младшего ТФ получить значение 0-го бара старшего (даже правильно вычисленного), вы просто-напросто заглядываете в будущее.... оно вам надо? :) 

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