//+---------------------------------------------------------------------+ //| BinaryWave_StDev.mq5 | //| Copyright © 2009, LeMan | //| b-market@mail.ru | //+---------------------------------------------------------------------+ //| Для работы индикатора следует положить файл SmoothAlgorithms.mqh | //| в папку (директорию): каталог_данных_терминала\\MQL5\Include | //+---------------------------------------------------------------------+ #property copyright "Copyright © 2009, LeMan" #property link "b-market@mail.ru" //---- номер версии индикатора #property version "1.01" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- для расчёта и отрисовки индикатора использовано шесть буферов #property indicator_buffers 6 //---- использовано всего пять графических построений #property indicator_plots 5 //+----------------------------------------------+ //| Параметры отрисовки линии индикатора | //+----------------------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type1 DRAW_COLOR_LINE //---- в качестве цветов трёхцветной линии использованы #property indicator_color1 clrOrange,clrGray,clrDodgerBlue //---- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 2 #property indicator_width1 2 //---- отображение метки индикатора #property indicator_label1 "BinaryWave" //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 2 в виде символа #property indicator_type2 DRAW_ARROW //---- в качестве цвета медвежьего индикатора использован красный цвет #property indicator_color2 clrRed //---- толщина линии индикатора 2 равна 2 #property indicator_width2 2 //---- отображение медвежьей метки индикатора #property indicator_label2 "Dn_Signal 1" //+----------------------------------------------+ //| Параметры отрисовки бычьго индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 3 в виде символа #property indicator_type3 DRAW_ARROW //---- в качестве цвета бычьего индикатора использован аквамариновый цвет #property indicator_color3 clrAqua //---- толщина линии индикатора 3 равна 2 #property indicator_width3 2 //---- отображение бычей метки индикатора #property indicator_label3 "Up_Signal 1" //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 4 в виде символа #property indicator_type4 DRAW_ARROW //---- в качестве цвета медвежьего индикатора использован красный цвет #property indicator_color4 clrRed //---- толщина линии индикатора 4 равна 4 #property indicator_width4 4 //---- отображение медвежьей метки индикатора #property indicator_label4 "Dn_Signal 2" //+----------------------------------------------+ //| Параметры отрисовки бычьго индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 5 в виде символа #property indicator_type5 DRAW_ARROW //---- в качестве цвета бычьего индикатора использован аквамариновый цвет #property indicator_color5 clrAqua //---- толщина линии индикатора 5 равна 4 #property indicator_width5 4 //---- отображение бычей метки индикатора #property indicator_label5 "Up_Signal 2" //+-----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+-----------------------------------------------+ #property indicator_level1 0 #property indicator_levelcolor clrRed #property indicator_levelstyle STYLE_SOLID //+-----------------------------------------------+ //| объявление констант | //+-----------------------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора //+-----------------------------------------------+ //| Описание класса CXMA | //+-----------------------------------------------+ #include //+-----------------------------------------------+ //---- объявление переменных класса CXMA из файла SmoothAlgorithms.mqh CXMA XMA1; //+-----------------------------------------------+ //| объявление перечислений | //+-----------------------------------------------+ /*enum Smooth_Method - перечисление объявлено в файле SmoothAlgorithms.mqh { MODE_SMA_, //SMA MODE_EMA_, //EMA MODE_SMMA_, //SMMA MODE_LWMA_, //LWMA MODE_JJMA, //JJMA MODE_JurX, //JurX MODE_ParMA, //ParMA MODE_T3, //T3 MODE_VIDYA, //VIDYA MODE_AMA, //AMA }; */ //+-----------------------------------------------+ //| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА | //+-----------------------------------------------+ //--- Вес индикаторов. Если ноль, индикатор не участвует в расчете волны input double WeightMA = 1.0; input double WeightMACD = 1.0; input double WeightOsMA = 1.0; input double WeightCCI = 1.0; input double WeightMOM = 1.0; input double WeightRSI = 1.0; input double WeightADX = 1.0; //---- Параметры скользящего среднего input int MAPeriod=13; input ENUM_MA_METHOD MAType=MODE_EMA; input ENUM_APPLIED_PRICE MAPrice=PRICE_CLOSE; //---- Параметры MACD input int FastMACD = 12; input int SlowMACD = 26; input int SignalMACD = 9; input ENUM_APPLIED_PRICE PriceMACD=PRICE_CLOSE; //---- Параметры OsMA input int FastPeriod = 12; input int SlowPeriod = 26; input int SignalPeriod = 9; input ENUM_APPLIED_PRICE OsMAPrice=PRICE_CLOSE; //---- Параметры CCI input int CCIPeriod=14; input ENUM_APPLIED_PRICE CCIPrice=PRICE_MEDIAN; //---- Параметры Момента input int MOMPeriod=14; input ENUM_APPLIED_PRICE MOMPrice=PRICE_CLOSE; //---- Параметры RSI input int RSIPeriod=14; input ENUM_APPLIED_PRICE RSIPrice=PRICE_CLOSE; //---- Параметры ADX input int ADXPeriod=14; //---- Включение сглаживания волны input Smooth_Method bMA_Method=MODE_JJMA; //метод усреднения input int bLength=5; //глубина сглаживания input int bPhase=100; //параметр сглаживания, //для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; // Для VIDIA это период CMO, для AMA это период медленной скользящей input double dK1=1.5; //коэффициент 1 для квадратичного фильтра input double dK2=2.5; //коэффициент 2 для квадратичного фильтра input uint std_period=9; //период квадратичного фильтра input int Shift=0; //сдвиг индикатора по горизонтали в барах //+-----------------------------------------------+ //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double ExtLineBuffer[],ColorExtLineBuffer[]; double BearsBuffer1[],BullsBuffer1[]; double BearsBuffer2[],BullsBuffer2[]; //---- double dWave[]; //---- Объявление целых переменных начала отсчёта данных int min_rates_total,min_rates_total_1; //---- Объявление целых переменных для хендлов индикаторов int MA_Handle,MACD_Handle,OsMA_Handle,CCI_Handle,MOM_Handle,RSI_Handle,ADX_Handle; //+------------------------------------------------------------------+ //| Определяем положение цены закрытия относительно среднего | //+------------------------------------------------------------------+ double MAClose(int bar,double &MaArray[],const double &Close[]) { //---- if(WeightMA>0) { if(Close[bar]-MaArray[bar]>0) return(+WeightMA); if(Close[bar]-MaArray[bar]<0) return(-WeightMA); //if(Close[bar]-MaArray[bar]==0) return(0); } //---- return(0); } //+------------------------------------------------------------------+ //| Определяем наклон MACD | //+------------------------------------------------------------------+ double MACD(int bar,double &MacdArray[]) { //---- if(WeightMACD>0) { if(MacdArray[bar]-MacdArray[bar+1]>0) return(+WeightMACD); if(MacdArray[bar]-MacdArray[bar+1]<0) return(-WeightMACD); //if(MacdArray[bar]-MacdArray[bar+1]==0) return(0); } //---- return(0); } //+------------------------------------------------------------------+ //| Определяем положение OsMa относительно нуля | //+------------------------------------------------------------------+ double OsMA(int bar,double &OsMAArray[]) { //---- if(WeightOsMA>0) { if(OsMAArray[bar]>0) return(+WeightOsMA); if(OsMAArray[bar]<0) return(-WeightOsMA); //if(OsMAArray[bar]==0) return(0); } //---- return(0); } //+------------------------------------------------------------------+ //| Определяем положение CCI относительно нуля | //+------------------------------------------------------------------+ double CCI(int bar,double &CCIArray[]) { //---- if(WeightCCI>0) { if(CCIArray[bar]>0) return(+WeightCCI); if(CCIArray[bar]<0) return(-WeightCCI); //if(CCIArray[bar]==0) return(0); } //---- return(0); } //+------------------------------------------------------------------+ //| Определяем положение Momentum относительно 100 | //+------------------------------------------------------------------+ double MOM(int bar,double &MOMArray[]) { //---- if(WeightMOM>0) { if(MOMArray[bar]>100) return(+WeightMOM); if(MOMArray[bar]<100) return(-WeightMOM); //if(MOMArray[bar]==100) return(0); } //---- return(0); } //+------------------------------------------------------------------+ //| Определяем положение RSI относительно 50 | //+------------------------------------------------------------------+ double RSI(int bar,double &RSIArray[]) { //---- if(WeightRSI>0) { if(RSIArray[bar]>50) return(+WeightRSI); if(RSIArray[bar]<50) return(-WeightRSI); //if(RSIArray[bar]==100) return(0); } //---- return(0); } //+------------------------------------------------------------------+ //| Определяем положение DMI | //+------------------------------------------------------------------+ double ADX(int bar,double &DMIPArray[],double &DMIMArray[]) { //---- if(WeightADX>0) { if(DMIPArray[bar]>DMIMArray[bar]) return(+WeightADX); if(DMIPArray[bar]rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора { to_copy=rates_total; // расчётное количество всех баров limit=rates_total-2; // стартовый номер для расчёта всех баров } else { to_copy=rates_total-prev_calculated+1; // расчётное количество только новых баров limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров } //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(MA_Handle,0,0,to_copy,MA_)<=0) return(RESET); if(CopyBuffer(MACD_Handle,0,0,to_copy+1,MACD_)<=0) return(RESET); if(CopyBuffer(OsMA_Handle,0,0,to_copy,OsMA_)<=0) return(RESET); if(CopyBuffer(CCI_Handle,0,0,to_copy,CCI_)<=0) return(RESET); if(CopyBuffer(MOM_Handle,0,0,to_copy,MOM_)<=0) return(RESET); if(CopyBuffer(RSI_Handle,0,0,to_copy,RSI_)<=0) return(RESET); if(CopyBuffer(ADX_Handle,1,0,to_copy,DMIP_)<=0) return(RESET); if(CopyBuffer(ADX_Handle,2,0,to_copy,DMIM_)<=0) return(RESET); //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(MA_,true); ArraySetAsSeries(MACD_,true); ArraySetAsSeries(OsMA_,true); ArraySetAsSeries(CCI_,true); ArraySetAsSeries(MOM_,true); ArraySetAsSeries(RSI_,true); ArraySetAsSeries(DMIP_,true); ArraySetAsSeries(DMIM_,true); ArraySetAsSeries(close,true); //---- maxbar=rates_total-min_rates_total_1-1; //---- основной цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { tmp=MAClose(bar,MA_,close)+MACD(bar,MACD_)+OsMA(bar,OsMA_)+CCI(bar,CCI_)+MOM(bar,MOM_)+RSI(bar,RSI_)+ADX(bar,DMIP_,DMIM_); ExtLineBuffer[bar]=XMA1.XMASeries(maxbar,prev_calculated,rates_total,bMA_Method,bPhase,bLength,tmp,bar,true); } //---- пересчёт стартового номера first для цикла пересчёта баров if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчёта индикатора limit--; //---- Основной цикл раскраски сигнальной линии for(bar=limit; bar>=0 && !IsStopped(); bar--) { int clr=1; if(ExtLineBuffer[bar+1]ExtLineBuffer[bar]) clr=0; ColorExtLineBuffer[bar]=clr; } //---- пересчёт стартового номера first для цикла пересчёта баров if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчёта индикатора limit=rates_total-min_rates_total+1; //---- основной цикл расчёта индикатора стандартных отклонений for(bar=limit; bar>=0 && !IsStopped(); bar--) { //---- загружаем приращения индикатора в массив для промежуточных вычислений for(int iii=0; iii=-Filter2) BEARS1=wave; //есть нисходящий тренд if(dstd<-Filter2) BEARS2=wave; //есть нисходящий тренд if(dstd>+Filter1 && dstd<=+Filter2) BULLS1=wave; //есть восходящий тренд if(dstd>+Filter2) BULLS2=wave; //есть восходящий тренд //---- инициализация ячеек индикаторных буферов полученными значениями BullsBuffer1[bar]=BULLS1; BearsBuffer1[bar]=BEARS1; BullsBuffer2[bar]=BULLS2; BearsBuffer2[bar]=BEARS2; } //---- return(rates_total); } //+------------------------------------------------------------------+