//+------------------------------------------------------------------+ //| Ozymandias_System_Alert.mq5 | //| Copyright © 2014, GoldnMoney | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2014, GoldnMoney" #property link "http://www.mql5.com" //--- номер версии индикатора #property version "1.01" //--- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буферов 9 #property indicator_buffers 9 //---- использовано 4 графических построения #property indicator_plots 4 //+-----------------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------------+ //--- отрисовка индикатора в виде многоцветной линии #property indicator_type1 DRAW_COLOR_LINE //--- в качестве цветов двухцветной линии использованы #property indicator_color1 clrDeepPink,clrDodgerBlue //--- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //--- толщина линии индикатора равна 3 #property indicator_width1 3 //--- отображение метки индикатора #property indicator_label1 "Ozymandias" //+-----------------------------------------+ //| Параметры отрисовки индикатора уровней | //+-----------------------------------------+ //--- отрисовка уровней в виде линий #property indicator_type2 DRAW_LINE #property indicator_type3 DRAW_LINE //--- выбор цветов уровней #property indicator_color2 clrRosyBrown #property indicator_color3 clrRosyBrown //--- уровни - штрихпунктирные кривые #property indicator_style2 STYLE_SOLID #property indicator_style3 STYLE_SOLID //--- толщина уровней равна 2 #property indicator_width2 2 #property indicator_width3 2 //--- отображение метки уровней #property indicator_label2 "Upper Ozymandias" #property indicator_label3 "Lower Ozymandias" //+--------------------------------------------+ //| Параметры отрисовки свечей | //+--------------------------------------------+ //---- в качестве индикатора использованы цветные свечи #property indicator_type4 DRAW_COLOR_CANDLES #property indicator_color4 clrGold,clrBrown,clrGreen,clrLimeGreen //---- отображение метки индикатора #property indicator_label4 "OzymandiasOpen;OzymandiasHigh;OzymandiasLow;OzymandiasClose" //+-----------------------------------------+ //| объявление констант | //+-----------------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора //+-----------------------------------------+ //| Входные параметры индикатора | //+-----------------------------------------+ input uint Length=2; input ENUM_MA_METHOD MAType=MODE_SMA; input uint Shift=0; //Сдвиг канала по горизонтали в право в барах input uint NumberofBar=1;//Номер бара для подачи сигнала input bool SoundON=true; //Разрешение алерта input uint NumberofAlerts=2;//Количество алертов input bool EMailON=false; //Разрешение почтовой отправки сигнала input bool PushON=false; //Разрешение отправки сигнала на мобильный //+-----------------------------------------+ //--- объявление динамических массивов, которые в дальнейшем будут использованы в качестве индикаторных буферов double ExtOpenBuffer[],ExtHighBuffer[],ExtLowBuffer[],ExtCloseBuffer[],ExtColorBuffer[]; double IndBuffer[],ColorIndBuffer[]; double UpBuffer[],DnBuffer[]; //--- объявление целочисденных переменных начала отсчета данных int min_rates_total; int ATR_Handle,HMA_Handle,LMA_Handle; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- инициализация переменных начала отсчета данных min_rates_total=int(Length); //--- инициализация глобальных переменных int ATR_Period=100; min_rates_total=MathMax(min_rates_total,ATR_Period); //--- получение хендла индикатора ATR ATR_Handle=iATR(NULL,0,ATR_Period); if(ATR_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора ATR"); return(INIT_FAILED); } //--- получение хендла индикатора iMA HMA_Handle=iMA(NULL,0,Length,0,MAType,PRICE_HIGH); if(HMA_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора iMA"); return(INIT_FAILED); } //--- получение хендла индикатора iMA LMA_Handle=iMA(NULL,0,Length,0,MAType,PRICE_LOW); if(LMA_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора iMA"); return(INIT_FAILED); } //--- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(IndBuffer,true); //--- превращение динамического массива в цветовой, индексный буфер SetIndexBuffer(1,ColorIndBuffer,INDICATOR_COLOR_INDEX); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(ColorIndBuffer,true); //--- осуществление сдвига индикатора 1 по горизонтали PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //--- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,NULL); //--- превращение динамического массива в индикаторный буфер SetIndexBuffer(2,UpBuffer,INDICATOR_DATA); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(UpBuffer,true); //--- осуществление сдвига индикатора 1 по горизонтали PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //--- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,NULL); //--- превращение динамического массива в цветовой, индексный буфер SetIndexBuffer(3,DnBuffer,INDICATOR_DATA); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(DnBuffer,true); //--- осуществление сдвига индикатора 1 по горизонтали PlotIndexSetInteger(2,PLOT_SHIFT,Shift); //--- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,NULL); //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(4,ExtOpenBuffer,INDICATOR_DATA); SetIndexBuffer(5,ExtHighBuffer,INDICATOR_DATA); SetIndexBuffer(6,ExtLowBuffer,INDICATOR_DATA); SetIndexBuffer(7,ExtCloseBuffer,INDICATOR_DATA); //---- превращение динамического массива в цветовой, индексный буфер SetIndexBuffer(8,ExtColorBuffer,INDICATOR_COLOR_INDEX); //---- установка позиции, с которой начинается линий канала PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total); //---- запрет на отрисовку индикатором пустых значений PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,NULL); //---- осуществление сдвига индикатора по горизонтали //PlotIndexSetInteger(3,PLOT_SHIFT,Shift); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(ExtOpenBuffer,true); ArraySetAsSeries(ExtHighBuffer,true); ArraySetAsSeries(ExtLowBuffer,true); ArraySetAsSeries(ExtCloseBuffer,true); ArraySetAsSeries(ExtColorBuffer,true); //--- инициализации переменной для короткого имени индикатора string shortname="Ozymandias_System_Alert"; //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- завершение инициализации return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- проверка количества баров на достаточность для расчёта if(BarsCalculated(ATR_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора { limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров trend1=0; nexttrend1=0; maxl1=0; minh1=9999999; IndBuffer[limit+1]=close[limit+1]; } else limit=rates_total-prev_calculated; // стартовый номер для расчёта только новых баров to_copy=limit+1; //--- копируем вновь появившиеся данные в массивы if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(RESET); if(CopyBuffer(HMA_Handle,0,0,to_copy,HMA)<=0) return(RESET); if(CopyBuffer(LMA_Handle,0,0,to_copy,LMA)<=0) return(RESET); //--- nexttrend0=nexttrend1; maxl0=maxl1; minh0=minh1; //--- основной цикл расчёта индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { hh=high[ArrayMaximum(high,bar,Length)]; ll=low[ArrayMinimum(low,bar,Length)]; lma=LMA[bar]; hma=HMA[bar]; atr=ATR[bar]/2; trend0=trend1; //--- if(nexttrend0==1) { maxl0=MathMax(ll,maxl0); if(hmaminh0 && close[bar]>high[bar+1]) { trend0=0; nexttrend0=1; maxl0=ll; } } //--- if(trend0==0) { if(trend1!=0.0) { IndBuffer[bar]=IndBuffer[bar+1]; ColorIndBuffer[bar]=1; } else { IndBuffer[bar]=MathMax(maxl0,IndBuffer[bar+1]); ColorIndBuffer[bar]=1; } UpBuffer[bar]=IndBuffer[bar]+atr; DnBuffer[bar]=IndBuffer[bar]-atr; } else { if(trend1!=1) { IndBuffer[bar]=IndBuffer[bar+1]; ColorIndBuffer[bar]=0; } else { IndBuffer[bar]=MathMin(minh0,IndBuffer[bar+1]); ColorIndBuffer[bar]=0; } UpBuffer[bar]=IndBuffer[bar]+atr; DnBuffer[bar]=IndBuffer[bar]-atr; } //--- if(bar) { nexttrend1=nexttrend0; trend1=trend0; maxl1=maxl0; minh1=minh0; } } //---- основной цикл исправления и окрашивания свечей for(int bar=limit; bar>=0 && !IsStopped(); bar--) { ExtOpenBuffer[bar]=ExtCloseBuffer[bar]=ExtHighBuffer[bar]=ExtLowBuffer[bar]=ExtColorBuffer[bar]=NULL; ExtColorBuffer[bar]=4; //---- if(close[bar]>UpBuffer[bar+Shift]) { ExtOpenBuffer[bar]=open[bar]; ExtCloseBuffer[bar]=close[bar]; ExtHighBuffer[bar]=high[bar]; ExtLowBuffer[bar]=low[bar]; if(close[bar]>=open[bar]) ExtColorBuffer[bar]=3; else ExtColorBuffer[bar]=2; } //---- if(close[bar]