Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью и она попадет в MetaTrader 5!
GameOver
266
GameOver 2006.04.02 01:27 
столкнулся с такой фигней - на графике (и с #property indicator_chart_window и с #property indicator_separate_window) буфера индикаторов пустые, но при обработке в первых 3х барах откудато беруца гиганские числа

кстати, уже встречал в чужом коде чтото типа (после заполнения массивов индикатора)
ExtMapBuffer1[0]=0;
ExtMapBuffer2[0]=0;
ExtMapBuffer1[1]=0;
ExtMapBuffer2[1]=0;
ExtMapBuffer1[2]=0;
ExtMapBuffer2[2]=0;

получаеца, не я один с этим сталкиваюсь?

вот код, чтобы было понятно о чем речь
первая циферь в комменте должна соответствовать номеру бара
первому справа, отмеченному синим ромбом , а она почему то всегда равна 1 (или тому значею, которое передается процедуре)
замечу также, что со другим буфером все в порядке(!?)
//------------------------------------------------------------------/ // Индикатор-советник, основаный на теории Демарка с моими дополнениями // Часть кода взята из Kara-вского иникатора //------------------------------------------------------------------/ #property copyright "GreenDog" #property link "@inbox.ru" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue double Buf1[]; double Buf2[]; extern int qBars=200; // если = 0, то индюк отображается для всего графика extern int LevDP=3; // уровень точек демарка; 2 = центральный бар будет выше(ниже) 2х баров слева и 2х баров справа extern int qSteps=1; // количество отображаемых шагов, не более 3х int qLevDP; int qPoint=0; // переменная для нормализации цены int init() { qLevDP=MathMin(4,LevDP); qSteps=MathMin(3,qSteps); while (NormalizeDouble(Point,qPoint)==0)qPoint++; int code=114+qLevDP; // определяем код стрелки в зависимости от уровня IndicatorShortName("Demark Point"); SetIndexStyle(0,DRAW_ARROW); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(0,code); SetIndexArrow(1,code); SetIndexBuffer(0,Buf1); SetIndexBuffer(1,Buf2); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(0,0.0); SetIndexLabel(0,"Demark Point"); SetIndexLabel(1,"Demark Point"); return(0); } int deinit() { Comment(""); } int start() { // заполнили и отобразили точки демарка int q; if (qBars==0) qBars=Bars-LevDP; for (int cnt=qBars;cnt>LevDP;cnt--) { q=DemHigh(cnt,LevDP); if (q>0) Buf1[cnt]=High[q]; q=DemLow(cnt,LevDP); if (q>0) Buf2[cnt]=Low[q]; } int L1,L2; L1=GetTD(qSteps,Buf2); L2=GetNextLowTD(L1); Comment(L1+"/"+L2); return(0); } // код тупо взят из kara-вского индюка int GetTD(int P, double Arr[]){ int i=0,j=0; while(j<P){ i++; while(Arr[i]==0){i++;if(i>qBars-2)return(-1);} j++;} return (i); } int GetNextLowTD(int P){ int i=P+1; while(Buf2[i]>=Low[P] || Buf2[i]==EMPTY){i++;if(i>qBars-2)return(-1);} return (i); } // входные параметры - бар и проверяемое смещение // рекурсивная проверка на условия Демарка (хай), возвращает значение или 0 int DemHigh(int cnt, int sh) { if (High[cnt]>=High[cnt+sh] && High[cnt]>High[cnt-sh]) { if (sh>1) return(DemHigh(cnt,sh-1)); else return(cnt); } else return(0); } // рекурсивная проверка на условия Демарка (лоу), возвращает значение или 0 int DemLow(int cnt, int sh) { if (Low[cnt]<=Low[cnt+sh] && Low[cnt]<Low[cnt-sh]) { if (sh>1) return(DemLow(cnt,sh-1)); else return(cnt); } else return(0); }


и еще непонятный момент
q=DemHigh(cnt,LevDP); if (q>0) Buf1[cnt]=High[q]; q=DemLow(cnt,LevDP); if (q>0) Buf2[cnt]=Low[q];


раньше процедуры DemHigh и DemLow были типа double и возвращали 0 или готовое (нормализованное) значение для буфера High или Low соотв.
Однако при написании строк

Buf1[cnt]=DemHigh(cnt,LevDP);
Buf2[cnt]=DemLow(cnt,LevDP);

многие значения (нулевые!!) в буфере были заполнены мусором. (это наглядно видно, если поставить #property indicator_separate_window)
почему это происходит, я не понял - ведь возвращаемое значение весьма прозрачно.

и приходица делать проверку на 0 вместо того чтобы просто присвоить результат процедуры...
почему? можно побороть этот косяк (или это по другому называеца?). . ?
Dmitry Fedoseev
41211
Dmitry Fedoseev 2006.04.02 08:38  
Эти гигантские числа есть константа EMPTY_VALUE. "Побороть" это просто - использовать при инициализации функцию SetIndexEmptyValue...

В коде ошибочка имеется:

SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(0,0.0);


А надо бы

SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0);
GameOver
266
GameOver 2006.04.02 10:07  
Integer:
Эти гигантские числа есть константа EMPTY_VALUE. "Побороть" это просто - использовать при инициализации функцию SetIndexEmptyValue...

В коде ошибочка имеется:

SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(0,0.0);


А надо бы

SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0);
о, спасибо за поправочку (!) скосячил :-)

разобрался
Dmitry Fedoseev
41211
Dmitry Fedoseev 2006.04.02 10:39  
Отсоедини индикатор от графика и снова присоедини - все будет ОК.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий