А какой, например, индикатор не отображается на тестинге? Мне такие не попадались пока...
Только за эту неделю 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. Задаемся вопросом - что за на...???
А у меня все отображает. Необходимо только поправить уровень линий (что-бы он был в зоне видимой части графика, а не ноль, например, или на другом каком уровне.) и также цвет отображения линий чтобы не совпадал с фоном.
Проблема всей темы в кривизне таких индикаторов.
Так вот - может уже кто-нибудь привести список(функций? операторов? тонких моментов? не знаю...) тех факторов, что необходимо учитывать при написании иникаторов для их последующего отображения в обоих режимах?
Особо нет специальных функций для этого. Если используются функции iCose и т.п., номер бара надо определять через .
Еще, если Rates используется, надо определять номер бара с которого копировать.
Это только один момент. Есть еще одна фишка, которая в обычных условиях практически не встречается, а вот когда нужно данные с другого таймфрейма или по другому инструменту получить вылезает: TimeCurrent().... в индикаторах эта функция последнее серверное время выдает, а не моделируется, поэтому очень часто безупречный на реал-тайм графике индикатор, на визуализации молчит как "рыба об лед". Оно все бы ничего, когда со старших чего-то просишь (легко обходится через Time[i]), а вот когда с младших, то только два пути остается, либо с дискретностью равной периоду рабочего таймфрейма согласиться, либо через глобальную переменную это время получать, от работающего на том же графике эксперта....
to SamMan
{ if(dayHigh<High[0] || dayLow>Low[0] || TimeDayOfWeek(Time[0])!=TimeDayOfWeek(Time[1])) {/*just skip*/} pj_i--; // Расчёт индекса следующего }
а что вы от него хотите-то? :)
Необходимо только поправить уровень линий (что-бы он был в зоне видимой части графика, а не ноль, например, или на другом каком уровне.)
Линии в тест-индюке, на минуточку, рисуются по Хай/Лоу последних баров. Как сами считаете - они могут быть НЕ "в зоне видимой части графика"?
О! Об чем и спрос!! В чем кривизна конкретно? Как выпрямить?
а что вы от него хотите-то? :)
Я хочу всего-лишь одного: идентичной работы идентичного кода в обоих условиях(что есть "условия" - см. первый пост). Это не слишком много я хочу? :)
Вы не замечаете разницы в работе?
а что вы от него хотите-то? :)
Я хочу всего-лишь одного: идентичной работы идентичного кода в обоих условиях(что есть "условия" - см. первый пост). Это не слишком много я хочу? :)
Вы не замечаете разницы в работе?
Еще раз.
Первое. Что у вас делается в этой строке?:
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-го бара старшего (даже правильно вычисленного), вы просто-напросто заглядываете в будущее.... оно вам надо? :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сразу поясню, что под "нормальным" я понимаю самы обычный график котировок, который показывает нам последние цены и на который мы обычно наносим линии трендов и всякое такое готовясь открыть позицию.
А "для визуализатора" - это, соотв., такой чарт, который выскакивает если мы запустили эксперта на тестирование и выбрали чек-бокс "Визуализация".
Так вот - может уже кто-нибудь привести список(функций? операторов? тонких моментов? не знаю...) тех факторов, что необходимо учитывать при написании иникаторов для их последующего отображения в обоих режимах?
Откуда вообще вопрос: неоднократно сталкивался с ситуациями, когда индик. совершенно без проблем работает в "нормальном" графике(что on-, что off-line - без разницы, везде хорошо) и даже не отображается(абсолютно) в графике визуализатора. Пару раз тут спрашивал - все молчат. :( Можно уже внести ясность в этот системообразующий вопрос-то? >:|
P.S. Если уже обсуждалось - мой Гранд-пардон, но поиск ничего не дал. Тогда просто линк, плиз.