Никто так и не ответил. :((
Пришлось разбираться самому :)
Немного изменил индикатор.
Выяснил следующее.
При появлении нового бара на меньшем ТФ изменяются значения только в buffer1[]. В buffer2[] и buffer3[] значения меняются только на 0-м и 1-м барах. А т.к. отрисовываются как раз buffer2 и buffer3, то и картинка меняется только на 0-м и 1-м барах.
Вопрос к разработчикам: так и должно быть?
Код индикатора и лог прикладываю.
#property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_color2 Red #property indicator_level1 0 extern int TF = 1; extern int Depth = 3; extern string Symb = ""; datetime newbar; double buffer1[], buffer2[], buffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void init() { if(TF == 0) TF = Period(); if(Symb == "") Symb = Symbol(); IndicatorBuffers(3); SetIndexBuffer(0, buffer2); SetIndexBuffer(1, buffer3); SetIndexBuffer(2, buffer1); IndicatorShortName( "i-Example_"+TF); ArraySetAsSeries(buffer1, true); ArraySetAsSeries(buffer2, true); return; } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ void start() { int cbars, i, limit; cbars = IndicatorCounted(); if(cbars > 0) { cbars--; limit = Bars - cbars; } else limit = Bars - 2; Print(""); Print("Bars on TF", TF, ": ", iBars(Symb, TF)); Print("Time 0 bar on TF",TF,": ", TimeToStr(iTime(Symb, TF,0),TIME_DATE|TIME_MINUTES)); Print("Bars on used TF",Period(),": ", Bars); Print("Time 0 bar on used TF",Period(),": ", TimeToStr(Time[0],TIME_DATE|TIME_MINUTES)); Print("Time newbar before: ",TimeToStr(newbar,TIME_DATE|TIME_MINUTES)); // если таймфрейм мешьше текущего, то при появлении новой свечи на меньшем ТФ // устанавливаем limit = Bars - 2; и пытаемся сначала пересчитать индикатор if(TF < Period()) { if(newbar != iTime(Symb, TF,0)) { limit = Bars - 2; newbar = iTime(Symb, TF,0); } } if(TF > Period()) { if(newbar != Time[0]) { limit = Bars - 2; newbar = Time[0]; } } Print("Time newbar after: ",TimeToStr(newbar,TIME_DATE|TIME_MINUTES)); Print("limit=",limit); Print("************************"); for(i = limit; i >= 0; i--) { buffer1[i] = (iMA(Symb, TF, 1, 0, 0, 0, i) - iMA(Symb, TF, 1, 0, 0, 0, i+1))*10000; if((i >= Bars - 8) || (i <= 7 )) { Print("buffer1[",i,"]= ",buffer1[i]); } } Print("************************"); Print("limit=",limit); for(i = limit; i >= 0; i--) { if(i > (Bars - Depth -1)) continue; buffer2[i] = iMAOnArray(buffer1, 0, Depth, 0, 0, i); if((i >= Bars - Depth- 7) || (i <= 7 )) { Print("buffer2[",i,"]= ",buffer2[i]); } } Print("************************"); Print("limit=",limit); for(i = limit; i >= 0; i--) { if(i > (Bars - 2*Depth)) continue; buffer3[i] = iMAOnArray(buffer2, 0, Depth, 0, 0, i); if((i >= Bars - 2*Depth - 6) || (i <= 7 )) { Print("buffer3[",i,"]= ",buffer3[i]); } } Print("************************"); return; } //+------------------------------------------------------------------+
Пациент: "Доктор меня все игнорируют."
Доктор: "Следующий!!!"
Я старательно прочитал оба поста, понял о чем идет речь.
Но желания разбираться в себе не нашел.
Захотелось спросить: "а что сделал автор для того чтоб найти и решить проблему?".
Потому что если он ничего не сделал, то помочь ему нельзя - можно только сделать за него...
Захотелось спросить: "а что сделал автор для того чтоб найти и решить проблему?".
Потому что если он ничего не сделал, то помочь ему нельзя - можно только сделать за него...
+1
Андрюшка, жму твою волосатую мужественную руку :-)
Захотелось спросить: "а что сделал автор для того чтоб найти и решить проблему?".
Потому что если он ничего не сделал, то помочь ему нельзя - можно только сделать за него...
Андрей, я не понимаю в чем проблема. В первом посте написал: "Подскажите в чем проблема, а то в упор не вижу?"
Только намекните, а уж остальное сделаю сам.
Вижу, только что buffer1 меняется, а остальные буферы, которые используют его для расчета, нет. Видимо что-то делаю не так.
Только намекните, а уж остальное сделаю сам.
Да уж. По Вашему в последнем коде мало Print-ов? И имено из лога видно, то что писал выше. Не смею больше беспокоить.
Да уж. По Вашему в последнем коде мало Print-ов? И имено из лога видно, то что писал выше. Не смею больше беспокоить.
Просто попробуйте сами понять в чем ошибка, и, если не получится, покажите ход ваших мыслей.
Когда от кода останется 3 строки, иллюстрирующих ошибку, и будет видно что вы уже сделали для решения проблемы, помошники ломанутся гурьбой ;)
Просто попробуйте сами понять в чем ошибка, и, если не получится, покажите ход ваших мыслей.
Когда от кода останется 3 строки, иллюстрирующих ошибку, и будет видно что вы уже сделали для решения проблемы, помошники ломанутся гурьбой ;)
Вот, что получилось.
1 вариант. Имеем два индикаторных буфера. Один ( buffer1) только для расчета
#property indicator_separate_window #property indicator_buffers 1 // отображаемый буфер индикатора #property indicator_color1 Lime #property indicator_level1 0 extern int TF = 1; // ТФ на котором проверяется появление нового бара extern int Depth = 2; // Период усреднения datetime newbar; double buffer1[], buffer2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void init() { if(TF == 0) TF = Period(); IndicatorBuffers(2); // два буфера для вычислений пользовательского индикатора SetIndexBuffer(0, buffer2); // этот буфер отображается SetIndexBuffer(1, buffer1); // этот буфер используется для расчета IndicatorShortName( "i-Example2_"+TF); Print("TF=",TF); Print("Depth=",Depth); return; } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ void start() { int i, limit; // условие если newbar неравен нулевому бару с таймфрейма TF // то работает код if(newbar != iTime(NULL, TF, 0)) { limit = 10; // ограничиваем, т.к для демонстрации больше не надо Print("+++++++++++++++++++++++++++++"); // Расчитываем buffer1 for(i = limit; i >= 0; i--) { buffer1[i] = (iMA(NULL, TF, 1, 0, 0, 0, i) - iMA(NULL, TF, 1, 0, 0, 0, i+1))*10000; Print("buffer1[",i,"]= ",buffer1[i]); } Print("************************"); // Расчитываем buffer2 for(i = limit; i >= 0; i--) { if(i > (10 - Depth + 1)) continue; buffer2[i] = iMAOnArray(buffer1, 0, Depth, 0, 0, i); Print("buffer2[",i,"]= ",buffer2[i]); } newbar = iTime(NULL, TF, 0); // присваиваем newbar новое значение } return; } //+------------------------------------------------------------------+
Лог:
12:33:00 i-Example2 EURUSD,M5: TF=1
12:33:00 i-Example2 EURUSD,M5: Depth=2
12:33:00 i-Example2 EURUSD,M5: initialized
12:33:00 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
12:33:00 i-Example2 EURUSD,M5: buffer1[10]= -3
12:33:00 i-Example2 EURUSD,M5: buffer1[9]= 0
12:33:00 i-Example2 EURUSD,M5: buffer1[8]= -1
12:33:00 i-Example2 EURUSD,M5: buffer1[7]= 0
12:33:00 i-Example2 EURUSD,M5: buffer1[6]= 0
12:33:00 i-Example2 EURUSD,M5: buffer1[5]= 2
12:33:00 i-Example2 EURUSD,M5: buffer1[4]= 1
12:33:00 i-Example2 EURUSD,M5: buffer1[3]= -1
12:33:00 i-Example2 EURUSD,M5: buffer1[2]= 1
12:33:00 i-Example2 EURUSD,M5: buffer1[1]= 2
12:33:00 i-Example2 EURUSD,M5: buffer1[0]= 1
12:33:00 i-Example2 EURUSD,M5: ************************
12:33:00 i-Example2 EURUSD,M5: buffer2[9]= -1.5 при 1-ом проходе считает все верно.
12:33:00 i-Example2 EURUSD,M5: buffer2[8]= -0.5
12:33:00 i-Example2 EURUSD,M5: buffer2[7]= -0.5
12:33:00 i-Example2 EURUSD,M5: buffer2[6]= -0
12:33:00 i-Example2 EURUSD,M5: buffer2[5]= 1
12:33:00 i-Example2 EURUSD,M5: buffer2[4]= 1.5
12:33:00 i-Example2 EURUSD,M5: buffer2[3]= -0
12:33:00 i-Example2 EURUSD,M5: buffer2[2]= -0
12:33:00 i-Example2 EURUSD,M5: buffer2[1]= 1.5
12:33:00 i-Example2 EURUSD,M5: buffer2[0]= 1.5
12:33:06 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
12:33:06 i-Example2 EURUSD,M5: buffer1[10]= 0
12:33:06 i-Example2 EURUSD,M5: buffer1[9]= -1
12:33:06 i-Example2 EURUSD,M5: buffer1[8]= 0
12:33:06 i-Example2 EURUSD,M5: buffer1[7]= 0
12:33:06 i-Example2 EURUSD,M5: buffer1[6]= 2
12:33:06 i-Example2 EURUSD,M5: buffer1[5]= 1
12:33:06 i-Example2 EURUSD,M5: buffer1[4]= -1
12:33:06 i-Example2 EURUSD,M5: buffer1[3]= 1
12:33:06 i-Example2 EURUSD,M5: buffer1[2]= 2
12:33:06 i-Example2 EURUSD,M5: buffer1[1]= 2
12:33:06 i-Example2 EURUSD,M5: buffer1[0]= 1
12:33:06 i-Example2 EURUSD,M5: ************************
12:33:06 i-Example2 EURUSD,M5: buffer2[9]= -1.5 в buffer1 данные сместились, а в buffer2 все осталось как и было.
12:33:06 i-Example2 EURUSD,M5: buffer2[8]= -0.5
12:33:06 i-Example2 EURUSD,M5: buffer2[7]= -0.5
12:33:06 i-Example2 EURUSD,M5: buffer2[6]= -0
12:33:06 i-Example2 EURUSD,M5: buffer2[5]= 1
12:33:06 i-Example2 EURUSD,M5: buffer2[4]= 1.5
12:33:06 i-Example2 EURUSD,M5: buffer2[3]= -0
12:33:06 i-Example2 EURUSD,M5: buffer2[2]= -0
12:33:06 i-Example2 EURUSD,M5: buffer2[1]= 2
12:33:06 i-Example2 EURUSD,M5: buffer2[0]= 1.5
12:34:59 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
12:34:59 i-Example2 EURUSD,M5: buffer1[10]= -1
12:34:59 i-Example2 EURUSD,M5: buffer1[9]= 0
12:34:59 i-Example2 EURUSD,M5: buffer1[8]= 0
12:34:59 i-Example2 EURUSD,M5: buffer1[7]= 2
12:34:59 i-Example2 EURUSD,M5: buffer1[6]= 1
12:34:59 i-Example2 EURUSD,M5: buffer1[5]= -1
12:34:59 i-Example2 EURUSD,M5: buffer1[4]= 1
12:34:59 i-Example2 EURUSD,M5: buffer1[3]= 2
12:34:59 i-Example2 EURUSD,M5: buffer1[2]= 2
12:34:59 i-Example2 EURUSD,M5: buffer1[1]= 0
12:34:59 i-Example2 EURUSD,M5: buffer1[0]= -1
12:34:59 i-Example2 EURUSD,M5: ************************
12:34:59 i-Example2 EURUSD,M5: buffer2[9]= -0.5 теперь и в Buffer2 данные изменились, но все равно не соответствуют расчету
12:34:59 i-Example2 EURUSD,M5: buffer2[8]= -0.5 изменение связано с тем, что на старшем периоде появился новый бар
12:34:59 i-Example2 EURUSD,M5: buffer2[7]= -0
12:34:59 i-Example2 EURUSD,M5: buffer2[6]= 1
12:34:59 i-Example2 EURUSD,M5: buffer2[5]= 1.5
12:34:59 i-Example2 EURUSD,M5: buffer2[4]= -0
12:34:59 i-Example2 EURUSD,M5: buffer2[3]= -0
12:34:59 i-Example2 EURUSD,M5: buffer2[2]= 2
12:34:59 i-Example2 EURUSD,M5: buffer2[1]= 1
12:34:59 i-Example2 EURUSD,M5: buffer2[0]= -0.5
12:36:04 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
12:36:04 i-Example2 EURUSD,M5: buffer1[10]= 0
12:36:04 i-Example2 EURUSD,M5: buffer1[9]= 0
12:36:04 i-Example2 EURUSD,M5: buffer1[8]= 2
12:36:04 i-Example2 EURUSD,M5: buffer1[7]= 1
12:36:04 i-Example2 EURUSD,M5: buffer1[6]= -1
12:36:04 i-Example2 EURUSD,M5: buffer1[5]= 1
12:36:04 i-Example2 EURUSD,M5: buffer1[4]= 2
12:36:04 i-Example2 EURUSD,M5: buffer1[3]= 2
12:36:04 i-Example2 EURUSD,M5: buffer1[2]= 0
12:36:04 i-Example2 EURUSD,M5: buffer1[1]= -1
12:36:04 i-Example2 EURUSD,M5: buffer1[0]= 1
12:36:04 i-Example2 EURUSD,M5: ************************
12:36:04 i-Example2 EURUSD,M5: buffer2[9]= -0.5
12:36:04 i-Example2 EURUSD,M5: buffer2[8]= -0.5
12:36:04 i-Example2 EURUSD,M5: buffer2[7]= -0
12:36:04 i-Example2 EURUSD,M5: buffer2[6]= 1
12:36:04 i-Example2 EURUSD,M5: buffer2[5]= 1.5
12:36:04 i-Example2 EURUSD,M5: buffer2[4]= -0
12:36:04 i-Example2 EURUSD,M5: buffer2[3]= -0
12:36:04 i-Example2 EURUSD,M5: buffer2[2]= 2
12:36:04 i-Example2 EURUSD,M5: buffer2[1]= -0.5
12:36:04 i-Example2 EURUSD,M5: buffer2[0]= 0
12:37:19 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
2 вариант. Имеем один индикаторный буфер. И один (buffer1) пользовательский массив для расчета
#property indicator_separate_window #property indicator_buffers 1 // отображаемый буфер индикатора #property indicator_color1 Lime #property indicator_level1 0 extern int TF = 1; // ТФ на котором проверяется появление нового бара extern int Depth = 2; // Период усреднения datetime newbar; double buffer1[11], buffer2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void init() { if(TF == 0) TF = Period(); IndicatorBuffers(1); // два буфера для вычислений пользовательского индикатора SetIndexBuffer(0, buffer2); // этот буфер отображается ///SetIndexBuffer(1, buffer1); // этот буфер используется для расчета IndicatorShortName( "i-Example2_"+TF); ArraySetAsSeries(buffer1,true); Print("TF=",TF); Print("Depth=",Depth); return; } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ void start() { int i, limit; // условие если newbar неравен нулевому бару с таймфрейма TF // то работает код if(newbar != iTime(NULL, TF, 0)) { limit = 10; // ограничиваем, т.к для демонстрации больше не надо Print("+++++++++++++++++++++++++++++"); // Расчитываем buffer1 for(i = limit; i >= 0; i--) { buffer1[i] = (iMA(NULL, TF, 1, 0, 0, 0, i) - iMA(NULL, TF, 1, 0, 0, 0, i+1))*10000; Print("buffer1[",i,"]= ",buffer1[i]); } Print("************************"); // Расчитываем buffer2 for(i = limit; i >= 0; i--) { if(i > (10 - Depth + 1)) continue; buffer2[i] = iMAOnArray(buffer1, 0, Depth, 0, 0, i); Print("buffer2[",i,"]= ",buffer2[i]); } newbar = iTime(NULL, TF, 0); // присваиваем newbar новое значение } return; } //+------------------------------------------------------------------+
Теперь все работает как и хотелось.
Лог:
13:01:42 i-Example2 EURUSD,M5: loaded successfully
13:01:49 i-Example2 EURUSD,M5: TF=1
13:01:49 i-Example2 EURUSD,M5: Depth=2
13:01:49 i-Example2 EURUSD,M5: initialized
13:01:49 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
13:01:49 i-Example2 EURUSD,M5: buffer1[10]= -2
13:01:49 i-Example2 EURUSD,M5: buffer1[9]= 0
13:01:49 i-Example2 EURUSD,M5: buffer1[8]= -3
13:01:49 i-Example2 EURUSD,M5: buffer1[7]= 0
13:01:49 i-Example2 EURUSD,M5: buffer1[6]= -1
13:01:49 i-Example2 EURUSD,M5: buffer1[5]= 2
13:01:49 i-Example2 EURUSD,M5: buffer1[4]= 1
13:01:49 i-Example2 EURUSD,M5: buffer1[3]= -1
13:01:49 i-Example2 EURUSD,M5: buffer1[2]= -1
13:01:49 i-Example2 EURUSD,M5: buffer1[1]= 0
13:01:49 i-Example2 EURUSD,M5: buffer1[0]= -1
13:01:49 i-Example2 EURUSD,M5: ************************
13:01:49 i-Example2 EURUSD,M5: buffer2[9]= -1
13:01:49 i-Example2 EURUSD,M5: buffer2[8]= -1.5
13:01:49 i-Example2 EURUSD,M5: buffer2[7]= -1.5
13:01:49 i-Example2 EURUSD,M5: buffer2[6]= -0.5
13:01:49 i-Example2 EURUSD,M5: buffer2[5]= 0.5
13:01:49 i-Example2 EURUSD,M5: buffer2[4]= 1.5
13:01:49 i-Example2 EURUSD,M5: buffer2[3]= 0
13:01:49 i-Example2 EURUSD,M5: buffer2[2]= -1
13:01:49 i-Example2 EURUSD,M5: buffer2[1]= -0.5
13:01:49 i-Example2 EURUSD,M5: buffer2[0]= -0.5
13:01:50 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
13:01:50 i-Example2 EURUSD,M5: buffer1[10]= 0
13:01:50 i-Example2 EURUSD,M5: buffer1[9]= -3
13:01:50 i-Example2 EURUSD,M5: buffer1[8]= 0
13:01:50 i-Example2 EURUSD,M5: buffer1[7]= -1
13:01:50 i-Example2 EURUSD,M5: buffer1[6]= 2
13:01:50 i-Example2 EURUSD,M5: buffer1[5]= 1
13:01:50 i-Example2 EURUSD,M5: buffer1[4]= -1
13:01:50 i-Example2 EURUSD,M5: buffer1[3]= -1
13:01:50 i-Example2 EURUSD,M5: buffer1[2]= 0
13:01:50 i-Example2 EURUSD,M5: buffer1[1]= -2
13:01:50 i-Example2 EURUSD,M5: buffer1[0]= 1
13:01:50 i-Example2 EURUSD,M5: ************************
13:01:50 i-Example2 EURUSD,M5: buffer2[9]= -1.5
13:01:50 i-Example2 EURUSD,M5: buffer2[8]= -1.5
13:01:50 i-Example2 EURUSD,M5: buffer2[7]= -0.5
13:01:50 i-Example2 EURUSD,M5: buffer2[6]= 0.5
13:01:50 i-Example2 EURUSD,M5: buffer2[5]= 1.5
13:01:50 i-Example2 EURUSD,M5: buffer2[4]= 0
13:01:50 i-Example2 EURUSD,M5: buffer2[3]= -1
13:01:50 i-Example2 EURUSD,M5: buffer2[2]= -0.5
13:01:50 i-Example2 EURUSD,M5: buffer2[1]= -1
13:01:50 i-Example2 EURUSD,M5: buffer2[0]= -0.5
13:03:21 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
13:03:21 i-Example2 EURUSD,M5: buffer1[10]= -3
13:03:21 i-Example2 EURUSD,M5: buffer1[9]= 0
13:03:21 i-Example2 EURUSD,M5: buffer1[8]= -1
13:03:21 i-Example2 EURUSD,M5: buffer1[7]= 2
13:03:21 i-Example2 EURUSD,M5: buffer1[6]= 1
13:03:21 i-Example2 EURUSD,M5: buffer1[5]= -1
13:03:21 i-Example2 EURUSD,M5: buffer1[4]= -1
13:03:21 i-Example2 EURUSD,M5: buffer1[3]= 0
13:03:21 i-Example2 EURUSD,M5: buffer1[2]= -2
13:03:21 i-Example2 EURUSD,M5: buffer1[1]= 0
13:03:21 i-Example2 EURUSD,M5: buffer1[0]= -1
13:03:21 i-Example2 EURUSD,M5: ************************
13:03:21 i-Example2 EURUSD,M5: buffer2[9]= -1.5
13:03:21 i-Example2 EURUSD,M5: buffer2[8]= -0.5
13:03:21 i-Example2 EURUSD,M5: buffer2[7]= 0.5
13:03:21 i-Example2 EURUSD,M5: buffer2[6]= 1.5
13:03:21 i-Example2 EURUSD,M5: buffer2[5]= 0
13:03:21 i-Example2 EURUSD,M5: buffer2[4]= -1
13:03:21 i-Example2 EURUSD,M5: buffer2[3]= -0.5
13:03:21 i-Example2 EURUSD,M5: buffer2[2]= -1
13:03:21 i-Example2 EURUSD,M5: buffer2[1]= -1
13:03:21 i-Example2 EURUSD,M5: buffer2[0]= -0.5
13:04:00 i-Example2 EURUSD,M5: +++++++++++++++++++++++++++++
И всетаки мне не понятно почему в 1-м варианте buffer1 расчитывается нормально, а Buffer2
(расчитывается на основании buffer1) использует для расчета старый экземпляр buffer1.
Объясните, кто-нибудь!!!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сделал индикатор. Одна из возможностей которого показывать ситуацию с меньшего ТФ. Индикаторная линия, по идее, должна пересчитаться заново при появлении нового бара на меньшем ТФ, но этого не происходит, хотя переменная цикла limit получает корректные значения. Подскажите в чем проблема, а то в упор не вижу?
Код и картинку, демонстрирующие это прикладываю.
На картинке вверху индикатор показывающий ситуацию с ТФ = М1, внизу тоже самое, но принудительно перестроенный.