//+---------------------------------------------------------------------+ //| #_i_3D_ADX.mq4 | //| Copyright © 2009, TigraVK | //| | //|Индикатор текущий тренд на основе ADX в | //|трехмерной диаграмме в основном окне графика торгового | //|инструмента. Построчно отбражаются направления тренда с пошагово | //|увеличивающимися периодами. | //|В результате получается трехмерная картинка веера ADX | //|В данной версии индикатора возможны режимы отображения | //| - направления тренда по уровням +DI и -DI; | //| - абсолютного значения кривой MAIN; | //| - скорости роста или снижения +DI отнисительно -DI. | //| | //|Координата Х на диаграмме - время в формате графика торгового | //|инструмента | //|Координата Y на диаграмме - сверху вниз последовательное отображение | //|ADX с различными параметрами | //|Координата Z отражена различными цветами в зависимости от ситуации | //|и положения кривых ADX в данной временнОй точке | //+---------------------------------------------------------------------+ #property copyright "Copyright © 2009, TigraVK" #property link "tigravk@yandex.ru" #property indicator_chart_window #include #define ELEMENTS 80 //количество отображаемых строк в диаграмме extern int IndMode = 0; //один из трех режимов отрисовки диаграмм: 0-Направление;1-абсолютное значение;2-баровая скорость изменения extern int Columns=600; //Количество отображаемых столбцов диаграммы extern int Width = 1; //Ширина столбца, в барах extern int DrawShift = 0; //Смещение нулевого столбца (в барах) относительно правой границы окна графика //применяется в случае вывода двух копий индикатора с разными параметрами в одно окно //для исключения визуальных пересечений диаграмм //Например, для вывода второй диаграммы корректно будет установить DrawShift=Columns+4 //-- Начальные параметры iADX и приращение периода ----------- extern int ADXperiod=3; extern int ADXperiod_step=5; extern int Method=MODE_SMA; extern int ADXappliedPrice = 0; //PRICE_CLOSE 0 Цена закрытия //PRICE_OPEN 1 Цена открытия //PRICE_HIGH 2 Максимальная цена //PRICE_LOW 3 Минимальная цена //PRICE_MEDIAN 4 Средняя цена, (high+low)/2 //PRICE_TYPICAL 5 Типичная цена, (high+low+close)/3 //PRICE_WEIGHTED 6 Взвешенная цена закрытия, (high+low+close+close)/4 //------------------------------- #define COLUMNS_DOP 3 //кол-во дополнительных колонок в массиве ADX[][] (типа, вычислительный запас) #define HEADER 6 //место под заголовок (измеряется высотой элемета диаграммы) #define GAP 0 //пробел (в барах) между элементами диаграммы в горизонтали #define GAP_PERCENT 20 //пробел (в процентах от высоты элемента диаграммы) между элементами диаграммы в вертикали double ADXMAIN[][ELEMENTS];//массив карта кривой MAIN double ADXPLUS[][ELEMENTS];//массив карта кривой +DI double ADXMINUS[][ELEMENTS];//массив карта кривой -DI double Top; double Bottom; int FreeBars; string el_name; string indname="#_i_3D_ADX"; datetime tm; int shift; bool flag_OK; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void prepare_time() { if(flag_OK==true) return; if (Time[Width]==0) return; tm=Time[0]; ArrayResize(ADXMAIN,Columns+COLUMNS_DOP); ArrayInitialize(ADXMAIN,0.0); ArrayResize(ADXPLUS,Columns+COLUMNS_DOP); ArrayInitialize(ADXPLUS,0.0); ArrayResize(ADXMINUS,Columns+COLUMNS_DOP); ArrayInitialize(ADXMINUS,0.0); //создаем квадратики for(int i=0; i0) counted_bars--; limit=Bars-counted_bars; if(counted_bars==0) limit--; if(limit>Columns+COLUMNS_DOP) limit=Columns+COLUMNS_DOP; //Процедура перерисовки диаграммы при смене текущего бара или размеров экранной области графика if(Top!=top || Bottom!=bottom || FreeBars!=free_bars || tm!=Time[0]) { Top=top; Bottom=bottom; FreeBars=free_bars; tm=Time[0]; for(i=0; i=Columns+COLUMNS_DOP) //полная отрисовка при запуске индикатора { AdxDATA_fill(ADXMAIN,ADXPLUS,ADXMINUS,limit,0,0); if(IndMode==0) AdxWeerDirection(ADXPLUS,ADXMINUS,Columns); else if(IndMode==1) AdxWeerAbsolute(ADXMAIN, Columns); else if(IndMode==2) AdxWeerAcceleration(ADXPLUS, ADXMINUS, Columns); } else if(limit>1 && limit0; j--) { for(i=0; i=0; j--) { for(i=0; i=0.0) ObjectSet(el_name+DoubleToStr(j,0)+"_"+i,OBJPROP_COLOR,LightGreen); else ObjectSet(el_name+DoubleToStr(j,0)+"_"+i,OBJPROP_COLOR,Red); } } } //+------------------------------------------------------------------+ // абсолютное значение выводится в градации от белого (минимум) до зеленого(максимум) // Максимум нормируется к максимальному значению кривой за исследуемый период истории void AdxWeerAbsolute(double &DATA[][],int columns) { int i,j; color clr; double min,max; for(i=0; i=0; j--) for(i=0; i=0) { clr=ColorGradient(VEL[j][i],0,max_vel,1); //зеленый ObjectSet(el_name+j+"_"+i,OBJPROP_COLOR,clr); } else { clr=ColorGradient(-VEL[j][i],0,max_vel,0); //красный ObjectSet(el_name+j+"_"+i,OBJPROP_COLOR,clr); } } } } //+------------------------------------------------------------------+ color ColorGradient(double current_vol,double min_vol,double max_vol,int maincolor) { int R,G,B; int cur; if(current_volmax_vol) current_vol=max_vol; cur=255-255*(current_vol-min_vol)/(max_vol-min_vol); if(maincolor==0) //RED { R=255; G=cur; B=cur; } else if(maincolor==1) //GREEN { R=cur; G=255; B=cur; } else if(maincolor==2) //BLUE { R=cur; G=cur; B=255; } else {R=0;G=0;B=0;} G<<=8; B<<=16; return(R+G+B); } //+------------------------------------------------------------------+ void CreateShield(string name_mask,double top,double bottom,int width,int freebars,color clr) { double high,gap,y1,y2; datetime fut0,fut1; high=(top-bottom)/(ELEMENTS*1.0); gap=high*GAP_PERCENT/100.0; bottom=bottom+gap; top=top-HEADER*high; high=(top-bottom)/(ELEMENTS*1.0); gap=high*GAP_PERCENT/100.0; high=high-gap; if(freebars>0) { fut0=Time[0]+Period()*freebars*60; fut1=Time[width]+Period()*freebars*60; } else { fut0=iTime(NULL,0,-freebars); fut1=iTime(NULL,0,-freebars+width); } y2=top; for(int i=0; i0) { fut0=Time[0]+Period()*freebars*60; fut1=Time[width]+Period()*freebars*60; } else { fut0=iTime(NULL,0,-freebars); fut1=iTime(NULL,0,-freebars+width); } y2=top; for(int i=0; i0) { obj_total=ObjectsTotal(); out=0; for(i=0;i=0) { ObjectDelete(name); out++; } } } } //+------------------------------------------------------------------+ void err(string name) { int err=GetLastError(); if(err!=0) Print(name," ERROR(",err,"): ",ErrorDescription(err)); } //+------------------------------------------------------------------+