В документации сказано что к индикатору возможно прикрутить событие Timer
по средствам
Далее в функции выполнить "что то". (примера нет)
Как можно либо с генерировать событие Calculate либо вызвать функцию OnCalculate(............) по таймеру (интересует полная версия вызова этой функции).
Вопрос как это сделать правильно ?
Почитай статью "Изменяем период мувинга «на лету» " там автор делал вызов OnCalculate из события, правда не таймера, но если захочеш разберешся.
Почитай статью "Изменяем период мувинга «на лету» " там автор делал вызов OnCalculate из события, правда не таймера, но если захочеш разберешся.
Попробовал вот такой код для запуска OnCalculate (т.к.) напрямую к массивам что получает по указателю эта функция не обращаюсь то по идее так должно было прокатить.
void OnTimer() { //Comment("yy=",yy); //yy++; datetime T[1]; double O[1],H[1],L[1],C[1]; long TV[1],V[1]; int S[1]; OnCalculate(shiftbars,0,T,O,H,L,C,TV,V,S); }
Но индикатор не отображается хотя комментарий отрабатывает, тоесть
таймер работает исправно. (если раскомментировать две строчки)
Также верно работает и комментарий расположенный в конце функции OnCalculate(перед return`ом)
ChartRedraw();
Не помог.
Хотя индикаторные буферы заполнены верно. (проверял через вывод
комментариев значений нулевого бара всех индикаторных буферов)
Цель - индикатор использует 7 валютных пар и после построения нужных тф из минуток, получить к ним в последующем доступ.
все работает если терминал онлайн и если на текущем тике построение ТФ не успело завершиться то на следующем уже ок и индикатор отрисовывается
но если терминал оффлайн и следующего тика не будет то выход либо перенакинуть индикатор на график после построения всех пар нужного тф - работает этот метод но не удобен
либо таймером дергать функцию OnCalculate до тех пор пока не
отобразится индикатор
после чего таймер отключать в любом случае (терминал онлайн или офлайн). он уже не нужен и свою миссию выполнил
... но что то с отрисовкой не заладилось
Что это? Ошибка? Или архитектурная особенность функции? Если второе, то пожалуйста, укажите этот момент в документации.
- www.mql5.com
Разработчикам, просьба пояснить следующую ситуацию - после старта терминала не срабатывает функция EventSetTimer();
Что это? Ошибка? Или архитектурная особенность функции? Если второе, то пожалуйста, укажите этот момент в документации.
Скорее архитектурная особенность.
Когда поднимается клиентский терминал, индикаторы могут стартовать раньше, чем окончательно сформируются окна соответствующих графиков. EventSetTimer работает с хэндлом окна, которому таймер будет посылать события. Поэтому в данном случае прежде чем стартовать таймер, необходимо убедиться, что окно создано. Например так
int g_limit_attempts=10; bool g_timer=false; ... void OnInit() { int attempts=0; while(attempts++<g_limit_attempts) { if(ChartGetInteger(0,CHART_VISIBLE_BARS)>0) { g_timer=true; break; } Sleep(10); } if(g_timer) EventSetTimer(5); } ... int OnCalculate(...) { if(!g_timer) { if(ChartGetInteger(0,CHART_VISIBLE_BARS)>0) { g_timer=true; EventSetTimer(5); } } ... }
Мы будем думать, как этого избежать. Чтобы не наворачивать такой код
Скорее архитектурная особенность.
Когда поднимается клиентский терминал, индикаторы могут стартовать раньше, чем окончательно сформируются окна соответствующих графиков. EventSetTimer работает с хэндлом окна, которому таймер будет посылать события. Поэтому в данном случае прежде чем стартовать таймер, необходимо убедиться, что окно создано. Например так
У вас используется
Sleep(10);
Да, Вы правы. Sleep в индикаторах не работает.
В любом случае мы сейчас ищем решение, чтобы в индикаторе можно было запускать таймер в любой момент
скажите это тоже не возможно? Хочу ограничить глубину расчета индикатора, только видимыми барами. (зачем считать лишнее если их не видно)
//--- если размер массива слишком мал if(rates_total<N) return(0); // ничего не считаем и ничего не рисуем выходим int kol_Bars=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); if(kol_Bars==0){ Print("Нет баров, kol_Bars=",kol_Bars," ошибка №",_LastError); return(0); } int limit; if(prev_calculated>0){ limit=prev_calculated-1; } else{ limit=rates_total-kol_Bars-1; } for(int i=limit;i<rates_total;i++){ //if(i>rates_total-10) Print(i," ",time[i]); } //--- return value of prev_calculated for next call return(rates_total); }
приходиться ждать первого тика ((, т.к выдается при первом запуске
2010.05.22 00:38:38 Шаблон (USDJPY,M5) Нет баров, kol_Bars= 0 ошибка № 4109
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В документации сказано что к индикатору возможно прикрутить событие Timer
по средствам
Далее в функции выполнить "что то". (примера нет)
Как можно либо с генерировать событие Calculate либо вызвать функцию OnCalculate(............) по таймеру (интересует полная версия вызова этой функции).
Вопрос как это сделать правильно ?