/* Для работы индикатора следует положить файл JJMASeries.mqh в папку (директорию): MetaTrader\experts\include\ */ //+------------------------------------------------------------------+ //| JADX.mq4 | //| Copyright © 2006, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буферов #property indicator_buffers 1 //---- цвета индикатора #property indicator_color1 Magenta //---- параметры горизонтальных уровней индикатора #property indicator_level1 0.0 #property indicator_levelcolor SlateBlue #property indicator_levelstyle 4 //---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА --------------------------------------------------------------------------------------------------+ extern int Length = 15; // глубина сглаживания DX extern int Phase =-100; // параметр, изменяющийся в пределах -100 ... +100, влияет на качество переходныx процессов +DM и -DM extern int Smooth = 3; // глубина сглаживания готового индикатора extern int Smooth_Phase=-100; // параметр, изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса сглаживания extern int Ind_Shift = 0; // cдвиг индикатора вдоль оси времени //---- -------------------------------------------------------------------------------------------------------------------------------+ //---- индикаторные буферы double Ind_Buffer1[]; //+------------------------------------------------------------------+ //----+ Введение функции JJMASeries //----+ Введение функции JJMASeriesResize //----+ Введение функции JJMASeriesAlert //----+ Введение функции JMA_ErrDescr #include //+------------------------------------------------------------------+ //| JADX initialization function | //+------------------------------------------------------------------+ int init() { //---- 1 индикаторныq буфер использован для счёта. SetIndexBuffer(0,Ind_Buffer1); //---- установка значений индикатора, которые не будут видимы на графике SetIndexEmptyValue(0,0); //---- горизонтальный сдвиг индикаторных линий SetIndexShift (0, Ind_Shift); //---- Стиль исполнения графика виде точечной линии SetIndexStyle(0,DRAW_LINE); //---- имена для окон данных и лэйбы для субъокон IndicatorShortName ("JADX"); SetIndexLabel (0, "JADX"); //---- Установка формата точности (количество знаков после десятичной точки) для визуализации значений индикатора IndicatorDigits(0); //----+ Изменение размеров буферных переменных функции JJMASeries, nJMAnumber=3(Три обращения к функции JJMASeries) if (JJMASeriesResize(3)!=3)return(-1); //---- установка алертов на недопустимые значения внешних переменных JJMASeriesAlert (0,"Length",Length); JJMASeriesAlert (0,"Smooth",Smooth); JJMASeriesAlert (1,"Phase", Phase); JJMASeriesAlert (1,"Smooth_Phase", Smooth_Phase); //---- завершение инициализации return(0); } //+------------------------------------------------------------------+ //| JADX iteration function | //+------------------------------------------------------------------+ int start() { //----+ Введение переменных с плавающей точкой double pDM,mDM,TRJ,JpDM,JmDM,ADX,JADX; //----+ Введение целых переменных и получение уже подсчитанных баров int reset,MaxBar,MaxBarJ,counted_bars=IndicatorCounted(); //---- проверка на возможные ошибки if (counted_bars<0)return(-1); //---- последний подсчитанный бар должен быть пересчитан if (counted_bars>0) counted_bars--; //---- определение номера самого старого бара, начиная с которого будет произедён пересчёт новых баров int limit=Bars-counted_bars-1; MaxBar=Bars-2; MaxBarJ=MaxBar-30; if (limit==Bars-1){limit=Bars-2;Ind_Buffer1[Bars-1]=0.0;} //----+ ОСНОВНОЙ ЦИКЛ ВЫЧИСЛЕНИЯ ИНДИКАТОРА JADX for(int bar=limit;bar>=0;bar--) { TRJ=iATR(NULL,Period(),1,bar); pDM=High[bar]-High[bar+1];mDM=Low[bar+1]-Low[bar]; if (pDM<0)pDM=0.0; if (mDM<0)mDM=0.0; if (pDM==mDM) {pDM=0.0; mDM=0.0;} if((pDM> mDM)&&(pDM>0.0))mDM=0.0; if((pDM< mDM)&&(mDM>0.0))pDM=0.0; if((TRJ<0.00001)&&(bar0.00001) ADX=100*(JpDM-JmDM)/(JpDM+JmDM);else ADX=0.0; //----+ Сглаживание индикатора ADX //----+ Обращение к функции JJMASeries за номером 2 (В этом обращении параметр nJMA.MaxBar уменьшен на 30 т. к. это повторное JMA сглаживание) JADX=JJMASeries(2,0,MaxBarJ,limit,Smooth_Phase,Smooth,ADX,bar,reset); //----+ проверка на отсутствие ошибки в предыдущей операции if(reset!=0)return(-1); Ind_Buffer1[bar]=JADX; } //---- завершение вычислений значений индикатора return(0); } //+----------------------------------------------------------------------------+