//+------------------------------------------------------------------+ //| BinaryWave_HTF_Signal.mq5 | //| Copyright © 2015, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2015, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //---- номер версии индикатора #property version "1.60" //+------------------------------------------------+ //| Параметры отрисовки индикатора | //+------------------------------------------------+ //---- отрисовка индикатора в главном окне #property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 //+------------------------------------------------+ //| Объявление констант | //+------------------------------------------------+ #define INDICATOR_NAME "BinaryWave" // имя индикатора #define RESET 0 // константа для возврата терминалу команды на пересчет индикатора #define NAMES_SYMBOLS_FONT "Georgia" // шрифт для названия индикатора #define SIGNAL_SYMBOLS_FONT "Wingdings 3" // шрифт для символа входа в позицию #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 "Buy signal" // текст алерта для входа в long #define SELL_ALERT_TEXT "Sell signal" // текст алерта для входа в short //+------------------------------------------------+ //| Перечисление для индикации срабатывания уровня | //+------------------------------------------------+ enum ENUM_ALERT_MODE // тип константы { OnlySound, // только звук OnlyAlert // только алерт }; //+-----------------------------------------------+ //| Описание класса CXMA | //+-----------------------------------------------+ #include //+-----------------------------------------------+ //| Объявление перечислений | //+-----------------------------------------------+ /*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 string Symbol_=""; // Финансовый актив input ENUM_TIMEFRAMES Timeframe=PERIOD_H6; // Таймфрейм для расчета индикатора //--- вес индикаторов. Если ноль, индикатор не участвует в расчете волны 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 uint SignalBar=0; // Номер бара для получения сигнала (0 - текущий бар) input string Symbols_Sirname=INDICATOR_NAME"_Label_"; // Название для меток индикатора input color Upsymbol_Color=clrLimeGreen; // Цвет символа роста 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; // Количество подаваемых алертов //+-----------------------------------+ //---- объявление целочисленных переменных для хендлов индикаторов int Ind_Handle; //---- объявление целочисленных переменных начала отсчета данных int min_rates_total; //---- объявление целочисленных переменных расположения индексов по горизонтали и вертикали uint X_0,Yn,X_1_,Y_1_; //---- объявление переменных для имен меток string name0,name1,IndName,Symb; //+------------------------------------------------------------------+ //| Получение таймфрейма в виде строки | //+------------------------------------------------------------------+ 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); } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- инициализация переменных начала отсчета данных int ATR_Period=15; int min_rates_total_1=MathMax(MAPeriod,MathMax(SlowPeriod,MathMax(CCIPeriod,MathMax(SlowMACD,MOMPeriod))))+1; min_rates_total=min_rates_total_1+GetStartBars(bMA_Method,bLength,bPhase); min_rates_total=MathMax(min_rates_total,ATR_Period)+3+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),")"); } //---- получение хендла индикатора BinaryWaveSign Ind_Handle=iCustom(Symb,Timeframe,"BinaryWaveSign", WeightMA,WeightMACD,WeightOsMA,WeightCCI,WeightMOM,WeightRSI,WeightADX, MAPeriod,MAType,MAPrice,FastMACD,SlowMACD,SignalMACD,PriceMACD,FastPeriod,SlowPeriod,SignalPeriod, OsMAPrice,CCIPeriod,CCIPrice,MOMPeriod,MOMPrice,RSIPeriod,RSIPrice,ADXPeriod,bMA_Method,bLength,bPhase,0); if(Ind_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора BinaryWaveSign"); //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,INDICATOR_NAME,"( ",GetStringTimeframe(Timeframe)," )"); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //---- завершение инициализации } //+------------------------------------------------------------------+ //| 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(Ind_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора { prev_time=time[0]; trend_=0; } rates_time=TimeCurrent(); //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(Ind_Handle,0,rates_time,prev_time,DnBTR)<=0) return(RESET); if(CopyBuffer(Ind_Handle,1,rates_time,prev_time,UpBTR)<=0) return(RESET); //---- расчеты стартового номера limit для цикла пересчета баров limit=ArraySize(UpBTR)-1; trend=trend_; //---- индексация элементов в массивах, как в таймсериях ArraySetAsSeries(DnBTR,true); ArraySetAsSeries(UpBTR,true); //---- ставим счетчики алертов в исходное положение if(TIME[0]!=prev_time && AlertCount) { buycount=AlertCount; sellcount=AlertCount; } //---- основной цикл расчета индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { if(UpBTR[bar]&&UpBTR[bar]!=EMPTY_VALUE) {trend=+1; if(!bar) signal=true;} if(DnBTR[bar]&&DnBTR[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(buycount) { 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(sellcount) { 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); } //+------------------------------------------------------------------+