//+------------------------------------------------------------------+ //| JMACandleTrend_HTF_Signal.mq5 | //| Copyright © 2018, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //---- номер версии индикатора #property version "1.70" #property indicator_buffers 0 #property indicator_plots 0 //+------------------------------------------------+ //| Параметры отрисовки индикатора | //+------------------------------------------------+ //---- отрисовка индикатора в главном окне #property indicator_chart_window //+------------------------------------------------+ //| Объявление констант | //+------------------------------------------------+ #define INDICATOR_NAME "JMACandleTrend" // Имя индикатора #define RESET 0 // Константа для возврата терминалу команды на пересчет индикатора #define NAMES_SYMBOLS_FONT "Georgia" // Шрифт для названия индикатора #define SIGNAL_SYMBOLS_FONT "Wingdings 2" // Шрифт для символа входа в позицию #define TREND_SYMBOLS_FONT "Wingdings 3" // Шрифт для символа тренда #define UP_SIGNAL_SYMBOL "в" // Символ для открывания long #define DN_SIGNAL_SYMBOL "в" // Символ для открывания short #define UP_TREND_SYMBOL "в" // Символ для растущего тренда #define DN_TREND_SYMBOL "в" // Символ для падающего тренда #define BUY_SOUND "alert.wav" // Звуковой файл для входа в long #define SELL_SOUND "alert.wav" // Звуковой файл для входа в short #define BUY_ALERT_TEXT "Сигнал на покупку" // Текст алерта для входа в long #define SELL_ALERT_TEXT "Сигнал на продажу" // Текст алерта для входа в short //+------------------------------------------------+ //| объявление перечислений | //+------------------------------------------------+ enum Smooth_Method { 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 }; //+------------------------------------------------+ //| Перечисление для индикации срабатывания уровня | //+------------------------------------------------+ enum ENUM_ALERT_MODE // Тип константы { OnlySound, // только звук OnlyAlert // только алерт }; //+------------------------------------------------+ //| Входные параметры индикатора | //+------------------------------------------------+ input string Symbol_=""; // Финансовый актив input ENUM_TIMEFRAMES Timeframe=PERIOD_H6; // Таймфрейм для расчета индикатора input Smooth_Method MA_Method1=MODE_JJMA; // метод усреднения input int Length1=30; // глубина усреднения input int Phase1=15; // параметр усреднения, //---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; //---- Для VIDIA это период CMO, для AMA это период медленной скользящей input uint Gap=10; // размер неучитываемого гэпа в пунктах //---- настройки визуального отображения индикатора input uint SignalBar=0; // Номер бара для получения сигнала (0 - текущий бар) input string Symbols_Sirname=INDICATOR_NAME"_Label_"; // Название меток индикатора input color UpSymbol_Color=clrDodgerBlue; // Цвет символа роста input color DnSymbol_Color=clrMagenta; // Цвет символа падения input color IndName_Color=clrDarkOrchid; // Цвет названия индикатора input uint Symbols_Size=60; // Размер символов сигнала input uint Font_Size=10; // Размер шрифта названия индикатора input int X_1=5; // Смещение названия по горизонтали input int Y_1=-15; // Смещение названия по вертикали input bool ShowIndName=true; // Отображение названия индикатора input ENUM_BASE_CORNER WhatCorner=CORNER_RIGHT_UPPER; // Угол расположения input uint X_=0; // Смещение по горизонтали input uint Y_=20; // Смещение по вертикали //---- настройки алертов input ENUM_ALERT_MODE alert_mode=OnlySound; // Вариант индикации срабатывания input uint AlertCount=0; // Количество подаваемых алертов input bool Push=true; // Разрешение на передачу push-сообщений //+-----------------------------------+ //---- объявление целочисленных переменных для хендлов индикаторов int JMACandleTrend_Handle; //---- объявление целочисленных переменных начала отсчета данных int min_rates_total; //---- объявление целочисленных переменных расположения индексов по горизонтали и вертикали uint X_0,Yn,X_1_,Y_1_; //---- объявление переменных для имен меток string name0,name1,IndName,Symb; //---- объявление переменных для текста алертов string BuySignal,SellSignal; //+------------------------------------------------------------------+ //| Получение таймфрейма в виде строки | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- } //+------------------------------------------------------------------+ //| Создание текстовой метки | //+------------------------------------------------------------------+ void CreateTLabel(long chart_id, // идентификатор графика string name, // имя объекта int nwin, // индекс окна ENUM_BASE_CORNER corner, // положение угла привязки ENUM_ANCHOR_POINT point, // положение точки привязки int X, // дистанция в пикселях по оси X от угла привязки int Y, // дистанция в пикселях по оси Y от угла привязки string text, // текст string textTT, // текст всплывающей подсказки color Color, // цвет текста string Font, // шрифт текста int Size) // размер шрифта { //---- ObjectCreate(chart_id,name,OBJ_LABEL,0,0,0); ObjectSetInteger(chart_id,name,OBJPROP_CORNER,corner); ObjectSetInteger(chart_id,name,OBJPROP_ANCHOR,point); ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,X); ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,Y); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetString(chart_id,name,OBJPROP_FONT,Font); ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,Size); ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,textTT); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); // объект на заднем плане //---- } //+------------------------------------------------------------------+ //| Переустановка текстовой метки | //+------------------------------------------------------------------+ void SetTLabel(long chart_id, // идентификатор графика string name, // имя объекта int nwin, // индекс окна ENUM_BASE_CORNER corner, // положение угла привязки ENUM_ANCHOR_POINT point, // положение точки привязки int X, // дистанция в пикселях по оси X от угла привязки int Y, // дистанция в пикселях по оси Y от угла привязки string text, // текст string textTT, // текст всплывающей подсказки color Color, // цвет текста string Font, // шрифт текста int Size) // размер шрифта { //---- if(ObjectFind(chart_id,name)==-1) { CreateTLabel(chart_id,name,nwin,corner,point,X,Y,text,textTT,Color,Font,Size); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,X); ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,Y); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,Size); ObjectSetString(chart_id,name,OBJPROP_FONT,Font); } //---- } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- инициализация переменных начала отсчета данных min_rates_total=int(Length1+15)+int(SignalBar); //---- инициализация переменных if(Symbol_!="") Symb=Symbol_; else Symb=Symbol(); X_0=X_; Yn=Y_+5; name0=Symbols_Sirname+"0"; if(ShowIndName) { Y_1_=Yn+Y_1; X_1_=X_0+X_1; name1=Symbols_Sirname+"1"; StringConcatenate(IndName,INDICATOR_NAME,"(",Symb," ",GetStringTimeframe(Timeframe),")"); } //---- получение хендла индикатора JMACandleTrend JMACandleTrend_Handle=iCustom(Symb,Timeframe,"JMACandleTrend",MA_Method1,Length1,Phase1,Gap,171,171); if(JMACandleTrend_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора JMACandleTrend"); return(INIT_FAILED); } BuySignal=IndName+": "+BUY_ALERT_TEXT; SellSignal=IndName+": "+SELL_ALERT_TEXT; //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,INDICATOR_NAME,"( ",GetStringTimeframe(Timeframe)," )"); //---- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //---- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //--- завершение инициализации return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void Deinit() { //---- if(ObjectFind(0,name0)!=-1) ObjectDelete(0,name0); if(ObjectFind(0,name1)!=-1) ObjectDelete(0,name1); //---- } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- Deinit(); //---- ChartRedraw(0); } //+------------------------------------------------------------------+ //| 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(JMACandleTrend_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора { prev_time=time[0]; trend_=0; } rates_time=TimeCurrent(); //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(JMACandleTrend_Handle,1,rates_time,prev_time,DnInd)<=0) return(RESET); if(CopyBuffer(JMACandleTrend_Handle,0,rates_time,prev_time,UpInd)<=0) return(RESET); //---- расчеты стартового номера limit для цикла пересчета баров limit=ArraySize(UpInd)-1; trend=trend_; //---- индексация элементов в массивах, как в таймсериях ArraySetAsSeries(DnInd,true); ArraySetAsSeries(UpInd,true); //---- ставим счетчики алертов в исходное положение if(TIME[0]!=prev_time && AlertCount) { buycount=AlertCount; sellcount=AlertCount; } //---- основной цикл расчета индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { if(UpInd[bar]&&UpInd[bar]!=EMPTY_VALUE) {trend=+1; if(!bar) signal=true;} if(DnInd[bar]&&DnInd[bar]!=EMPTY_VALUE) {trend=-1; if(!bar) signal=true;} if(bar|| SignalBar) trend_=trend; } if(trend>0) { Color0=UpSymbol_Color; if(signal) { SignSymbol=UP_SIGNAL_SYMBOL; if(Push && SignalBar && prev_calculated!=rates_total) RePush=true; if(RePush) if(SendNotification(BuySignal)) RePush=false; if(buycount>0) { switch(alert_mode) { case OnlyAlert: Alert(IndName+": "+BUY_ALERT_TEXT); break; case OnlySound: PlaySound(BUY_SOUND); break; } buycount--; } } else SignSymbol=UP_TREND_SYMBOL; } if(trend<0) { Color0=DnSymbol_Color; if(signal) { SignSymbol=DN_SIGNAL_SYMBOL; if(Push && SignalBar && prev_calculated!=rates_total) RePush=true; if(RePush) if(SendNotification(SellSignal)) RePush=false; if(sellcount>0) { switch(alert_mode) { case OnlyAlert: Alert(IndName+": "+SELL_ALERT_TEXT); break; case OnlySound: PlaySound(SELL_SOUND); break; } sellcount--; } } else SignSymbol=DN_TREND_SYMBOL; } if(trend) { if(ShowIndName) SetTLabel(0,name1,0,WhatCorner,ENUM_ANCHOR_POINT(2*WhatCorner),X_1_,Y_1_,IndName,IndName,IndName_Color,NAMES_SYMBOLS_FONT,Font_Size); if(signal)SetTLabel(0,name0,0,WhatCorner,ENUM_ANCHOR_POINT(2*WhatCorner),X_0,Yn,SignSymbol,IndName,Color0,SIGNAL_SYMBOLS_FONT,Symbols_Size); else SetTLabel(0,name0,0,WhatCorner,ENUM_ANCHOR_POINT(2*WhatCorner),X_0,Yn,SignSymbol,IndName,Color0,TREND_SYMBOLS_FONT,Symbols_Size); } else Deinit(); //---- ChartRedraw(0); prev_time=TIME[0]; //---- return(rates_total); } //+------------------------------------------------------------------+