Когда изменения в индикаторном буфере отображаются на графике?

 

После внесения изменений в индикаторном буфере, что является спусковым механизмом для отрисовки этих изменений на графике:

  1. изменения рисуются на графике сразу (то есть внутри OnCalculate())?
  2. изменения рисуются на графике после выхода из OnCalculate()?
 
Karputov Vladimir:

После внесения изменений в индикаторном буфере, что является спусковым механизмом для отрисовки этих изменений на графике:

  1. изменения рисуются на графике сразу (то есть внутри OnCalculate())?
  2. изменения рисуются на графике после выхода из OnCalculate()?
Владимир, это легко проверить. Сделайте в самом конце OnCalculate() бесконечный цикл на 5 сек. Только именно цикл, а не Sleep(). И посмотрите визуально, обновляется индикатор или нет.
 
Alexey Volchanskiy:
Владимир, это легко проверить. Сделайте в самом конце OnCalculate() бесконечный цикл на 5 сек. Только именно цикл, а не Sleep(). И посмотрите визуально, обновляется индикатор или нет.
Прекрасный совет ... чтобы повесить весь терминал.
 
Andrey Khatimlianskii:
Прекрасный совет ... чтобы повесить весь терминал.
Все индикаторы работают в одном потоке, один зацикленный поток ничего не повесит. В курсе, что существуют зацикленные советники и скрипты?
 
Alexey Volchanskiy:
Все индикаторы работают в одном потоке, один зацикленный поток ничего не повесит. В курсе, что существуют зацикленные советники и скрипты?

Может, хватит теоретизировать?

int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   uint start_ms = GetTickCount();
   
   while ( GetTickCount() - start_ms < 5000 ) { }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Alexey Volchanskiy:
Все индикаторы работают в одном потоке, один зацикленный поток ничего не повесит. В курсе, что существуют зацикленные советники и скрипты?
советники и скрипты выполняются в своем потоке
 
Andrey Khatimlianskii:

Может, хватит теоретизировать?

Неа. Такая конструкция вообще не позволяет рисовать. 

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
//---
   ArrayInitialize(Buffer,1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   uint start_ms=GetTickCount();
   for(int i=1;i<10;i++)
      Buffer[rates_total-i]=i;
   while(GetTickCount()-start_ms<5000) { }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 

Ничего не отображает и только ругается на медленны индикатор.

2016.06.03 17:47:44.859 test (EURUSD,M1)        indicator is too slow, 5000 ms. rewrite the indicator, please
 
Alexander Bereznyak:
советники и скрипты выполняются в своем потоке

Каждый советник выполняется в своем отдельном потоке. А индикаторы все в одном общем.

Так что, если зациклить один индикатор, другие перестанут работать. Но для эксперимента это не критично. 

 
Karputov Vladimir:

Неа. Такая конструкция вообще не позволяет рисовать. 

 

Ничего не отображает и только ругается на медленны индикатор.

Ну правильно, он все другие индикаторы тормознул, система и ругается. Поток-то один на всех, этакая кооперативная многозадачность времен Windows 3.1

Раз ничего не отображает, значит отрисовка происходит не после заполнения буфера, а после выхода из OnCalculate, что вообще-то логично. Откуда рантайм знает, заполнен буфер или нет? Может, с ним еще что-то будут делать. А вот раз вышли из функции - надо отрисовать 

 
Karputov Vladimir:

После внесения изменений в индикаторном буфере, что является спусковым механизмом для отрисовки этих изменений на графике:

  1. изменения рисуются на графике сразу (то есть внутри OnCalculate())?
  2. изменения рисуются на графике после выхода из OnCalculate()?
ChartRedraw  рисует, даже OnCalculate не нужен.
 
Sergey Chalyshev:
ChartRedraw  рисует, даже OnCalculate не нужен.
Не, не. Это понятно, вопрос был именно КОГДА отрисовка: сразу после внесения изменений в буфер и внутри OnCalculate() или отрисовка осуществляется по факту покидания OnCalculate().