После внесения изменений в индикаторном буфере, что является спусковым механизмом для отрисовки этих изменений на графике:
- изменения рисуются на графике сразу (то есть внутри OnCalculate())?
- изменения рисуются на графике после выхода из OnCalculate()?
Владимир, это легко проверить. Сделайте в самом конце OnCalculate() бесконечный цикл на 5 сек. Только именно цикл, а не Sleep(). И посмотрите визуально, обновляется индикатор или нет.
Прекрасный совет ... чтобы повесить весь терминал.
Все индикаторы работают в одном потоке, один зацикленный поток ничего не повесит. В курсе, что существуют зацикленные советники и скрипты?
Может, хватит теоретизировать?
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); }
Все индикаторы работают в одном потоке, один зацикленный поток ничего не повесит. В курсе, что существуют зацикленные советники и скрипты?
Может, хватит теоретизировать?
Неа. Такая конструкция вообще не позволяет рисовать.
//+------------------------------------------------------------------+ //| 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
советники и скрипты выполняются в своем потоке
Каждый советник выполняется в своем отдельном потоке. А индикаторы все в одном общем.
Так что, если зациклить один индикатор, другие перестанут работать. Но для эксперимента это не критично.
Неа. Такая конструкция вообще не позволяет рисовать.
Ничего не отображает и только ругается на медленны индикатор.
Ну правильно, он все другие индикаторы тормознул, система и ругается. Поток-то один на всех, этакая кооперативная многозадачность времен Windows 3.1
Раз ничего не отображает, значит отрисовка происходит не после заполнения буфера, а после выхода из OnCalculate, что вообще-то логично. Откуда рантайм знает, заполнен буфер или нет? Может, с ним еще что-то будут делать. А вот раз вышли из функции - надо отрисовать
После внесения изменений в индикаторном буфере, что является спусковым механизмом для отрисовки этих изменений на графике:
- изменения рисуются на графике сразу (то есть внутри OnCalculate())?
- изменения рисуются на графике после выхода из OnCalculate()?
ChartRedraw рисует, даже OnCalculate не нужен.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
После внесения изменений в индикаторном буфере, что является спусковым механизмом для отрисовки этих изменений на графике: