Скачать MetaTrader 5

Запуск индикатора по таймеру

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Klenov
1882
Alexey Klenov  

В документации сказано что к индикатору возможно прикрутить событие Timer

по средствам

int OnInit(){EventSetTimer(1);}

Далее в функции выполнить "что то". (примера нет)

void OnTimer()
{
////.......
}

Как можно либо с генерировать событие  Calculate  либо вызвать функцию OnCalculate(............) по таймеру (интересует полная версия вызова этой функции).

Вопрос как это сделать правильно ?

Dmitry Voronkov
5859
Dmitry Voronkov  
olyakish писал(а)  :

В документации сказано что к индикатору возможно прикрутить событие Timer

по средствам

Далее в функции выполнить "что то". (примера нет)

Как можно либо с генерировать событие  Calculate  либо вызвать функцию OnCalculate(............) по таймеру (интересует полная версия вызова этой функции).

Вопрос как это сделать правильно ?


 

Почитай статью "Изменяем период мувинга «на лету» " там автор делал вызов OnCalculate из события, правда не таймера, но если захочеш разберешся. 

Alexey Klenov
1882
Alexey Klenov  
vdv2001:

 

Почитай статью "Изменяем период мувинга «на лету» " там автор делал вызов 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 до тех пор пока не отобразится индикатор

после чего таймер отключать в любом случае (терминал онлайн или офлайн). он уже не нужен и свою миссию выполнил

... но что то с отрисовкой не заладилось


Stanislav Korotky
18896
Stanislav Korotky  
Возможно, проблема связана с тем, какие значения возвращаются из OnCalculate в оффлайне - насколько я помню, если вернется 0, то терминал считает, что отрисовывать не надо.

Ruslan Khasanov
3057
Ruslan Khasanov  
Разработчикам, просьба пояснить следующую ситуацию - после старта терминала не срабатывает функция EventSetTimer();
Что это? Ошибка? Или архитектурная особенность функции? Если второе, то пожалуйста, укажите этот момент в документации.
Документация по MQL5: Работа с событиями / EventSetTimer
Документация по MQL5: Работа с событиями / EventSetTimer
  • www.mql5.com
Работа с событиями / EventSetTimer - Документация по MQL5
Slava
Модератор
6924
Slava  
Kos:
Разработчикам, просьба пояснить следующую ситуацию - после старта терминала не срабатывает функция 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);
        }
     }
...
  }

 

 

Slava
Модератор
6924
Slava  

Мы будем думать, как этого избежать. Чтобы не наворачивать такой код

Ruslan Khasanov
3057
Ruslan Khasanov  
ИМХО Было бы удобно, если отслеживать активность таймера какой-нибудь штатной функцией

Alexey Klenov
1882
Alexey Klenov  
stringo:

 

Скорее архитектурная особенность.

Когда поднимается клиентский терминал, индикаторы могут стартовать раньше, чем окончательно сформируются окна соответствующих графиков. EventSetTimer работает с хэндлом окна, которому таймер будет посылать события. Поэтому в данном случае прежде чем стартовать таймер, необходимо убедиться, что окно создано. Например так

 

 

У вас используется

Sleep(10);


Разве слип работает в индикаторах вроде только в скриптах и экспертах ?
Slava
Модератор
6924
Slava  
olyakish:

У вас используется


Разве слип работает в индикаторах вроде только в скриптах и экспертах ?

Да, Вы правы. Sleep в индикаторах не работает.

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

Prival
4573
Prival  
stringo  писал(а)  :

Да, Вы правы. 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



 

 

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий