//+------------------------------------------------------------------+ //| NRatio_Signal.mq5 | //| Copyright © 2015, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2015, Nikolay Kositsin" #property link "farria@mail.redcom.ru" #property description "" //--- номер версии индикатора #property version "1.60" //--- отрисовка индикатора в отдельном окне #property indicator_separate_window //--- фиксированная высота подокна индикатора в пикселях #property indicator_height 20 //--- нижнее и верхнее ограничения шкалы отдельного окна индикатора #property indicator_maximum +1.9 #property indicator_minimum +0.3 //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчет индикатора #define INDTOTAL 1 // Константа для количества отображаемых индикаторов #define INDICATOR_NAME "NRatio" // Константа для имени индикатора //+----------------------------------------------+ //--- количество индикаторных буферов #property indicator_buffers 4 // INDTOTAL*4 //--- использовано всего графических построений #property indicator_plots 2 // INDTOTAL*2 //+----------------------------------------------+ //| Параметры отрисовки индикатора 1 | //+----------------------------------------------+ //--- отрисовка индикатора 1 в виде линии #property indicator_type1 DRAW_COLOR_LINE //--- в качестве цвета линии индикатора использованы #property indicator_color1 clrDeepPink,clrDodgerBlue //--- линия индикатора - штрих #property indicator_style1 STYLE_SOLID //--- толщина линии индикатора равна 3 #property indicator_width1 3 //--- отображение метки индикатора #property indicator_label1 "Signal line" //+----------------------------------------------+ //| Параметры отрисовки индикатора 2 | //+----------------------------------------------+ //--- отрисовка индикатора в виде четырехцветных значков #property indicator_type2 DRAW_COLOR_ARROW //--- в качестве цветов пятицветной гистограммы использованы #property indicator_color2 clrDeepPink,clrDodgerBlue //--- линия индикатора - сплошная #property indicator_style2 STYLE_SOLID //--- толщина линии индикатора равна 2 #property indicator_width2 2 //--- отображение метки индикатора #property indicator_label2 "Signal Arrow" //+----------------------------------------------+ //| объявление перечислений | //+----------------------------------------------+ enum Alg_Method { MODE_IN, //Алгоритм на входе в зоны ПЗ и ПП MODE_OUT //Алгоритм на выходе в зоны ПЗ и ПП }; //+----------------------------------------------+ //| описание класса CXMA | //+----------------------------------------------+ #include //+----------------------------------------------+ //| объявление перечислений | //+----------------------------------------------+ enum Applied_price_ //Тип константы { PRICE_CLOSE_ = 1, // Close PRICE_OPEN_, // Open PRICE_HIGH_, // High PRICE_LOW_, // Low PRICE_MEDIAN_, // Median Price (HL/2) PRICE_TYPICAL_, // Typical Price (HLC/3) PRICE_WEIGHTED_, // Weighted Close (HLCC/4) PRICE_SIMPL_, // Simple Price (OC/2) PRICE_QUARTER_, // Quarted Price (HLOC/4) PRICE_TRENDFOLLOW0_, // TrendFollow_1 Price PRICE_TRENDFOLLOW1_, // TrendFollow_2 Price PRICE_DEMARK_ // Demark Price }; //+----------------------------------------------+ //| объявление перечислений | //+----------------------------------------------+ /*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 ENUM_TIMEFRAMES TimeFrame=PERIOD_H4; // Период графика input Smooth_Method XMA_Method=MODE_SMA; // Метод усреднения input int XLength=3; // Глубина сглаживания input int XPhase=15; // Параметр сглаживания //---XPhase: для JJMA изменяется в пределах -100 ... +100, влияет на качество переходного процесса; //---XPhase: для VIDIA это период CMO, для AMA это период медленной скользящей input Applied_price_ IPC=PRICE_CLOSE; // Ценовая константа input double Kf=1; input double Fast=2; input double Sharp=2; input Alg_Method Mode=MODE_OUT; // Пробойный алгоритм input uint NRatio_UpLevel=80; // Уровень перекупленности input uint NRatio_DnLevel=20; // Уровень перепроданности //+----------------------------------------------+ //--- объявление целочисленных переменных начала отсчета данных int min_rates_total; //+------------------------------------------------------------------+ //| Получение таймфрейма в виде строки | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) {return(StringSubstr(EnumToString(timeframe),7,-1));} //+------------------------------------------------------------------+ //| Класс индикаторных буферов | //+------------------------------------------------------------------+ class CIndBuffers { //--- public: double m_LineBuffer[]; double m_ColorLineBuffer[]; double m_ArrowBuffer[]; double m_ColorArrowBuffer[]; int m_Handle; ENUM_TIMEFRAMES m_TimeFrame; //--- }; //--- объявление динамических массивов, которые в дальнейшем //--- будут использованы в качестве индикаторных буферов CIndBuffers Ind[INDTOTAL]; //+------------------------------------------------------------------+ //| NRatio indicator initialization function | //+------------------------------------------------------------------+ bool IndInit(uint Number) { //--- проверка периодов графиков на корректность if(Ind[Number].m_TimeFrameRates_Total || Prev_Calculated<=0)// проверка на первый старт расчета индикатора { limit_=Limit; LastCountBar[Number]=limit_; } else limit_=int(MathMin(LastCountBar[Number]+Limit,Rates_Total-2)); // стартовый номер для расчета новых баров //--- основной цикл расчета индикатора for(int bar=int(limit_); bar>=0 && !IsStopped(); bar--) { //--- обнулим содержимое индикаторных буферов до расчета Ind[Number].m_LineBuffer[bar]=Number+1.0; Ind[Number].m_ArrowBuffer[bar]=EMPTY_VALUE; Ind[Number].m_ColorLineBuffer[bar]=EMPTY_VALUE; Time0=Time[bar]; //--- копируем вновь появившиеся данные в массив if(CopyTime(Symbol(),Ind[Number].m_TimeFrame,Time0,1,Time_)<=0) return(RESET); if(Time0>=Time_[0] && Time[bar+1]NRatio_UpLevel && Buff[0]<=NRatio_UpLevel) { Ind[Number].m_ArrowBuffer[bar]=Number+1.0; Ind[Number].m_ColorArrowBuffer[bar]=1; Ind[Number].m_ColorLineBuffer[bar]=1; } if(Buff[1]=NRatio_DnLevel) { Ind[Number].m_ArrowBuffer[bar]=Number+1.0; Ind[Number].m_ColorArrowBuffer[bar]=0; Ind[Number].m_ColorLineBuffer[bar]=0; } } else { if(Buff[1]=NRatio_UpLevel) { Ind[Number].m_ArrowBuffer[bar]=Number+1.0; Ind[Number].m_ColorArrowBuffer[bar]=0; Ind[Number].m_ColorLineBuffer[bar]=0; } if(Buff[1]>NRatio_DnLevel && Buff[0]<=NRatio_DnLevel) { Ind[Number].m_ArrowBuffer[bar]=Number+1.0; Ind[Number].m_ColorArrowBuffer[bar]=1; Ind[Number].m_ColorLineBuffer[bar]=1; } } } //--- if(Ind[Number].m_ColorLineBuffer[bar+1]!=EMPTY_VALUE && Ind[Number].m_ColorLineBuffer[bar]==EMPTY_VALUE) { Ind[Number].m_ColorLineBuffer[bar]=Ind[Number].m_ColorLineBuffer[bar+1]; } } //--- завершение расчета одного индикатора return(true); } //+------------------------------------------------------------------+ //| NRatio indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- инициализация переменных начала отсчета данных min_rates_total=3; //--- инициализация переменных Ind[0].m_TimeFrame=TimeFrame; //--- инициализация буферов индикаторов for(int count=0; countrates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора limit=rates_total-min_rates_total-1; // стартовый номер для расчета всех баров else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров //--- индексация элементов в массивах как в таймсериях ArraySetAsSeries(time,true); for(int count=0; count