//+------------------------------------------------------------------+ //| Trigger_Line.mq5 | //| Copyright © 2005 dwt5 and adoleh2000 | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ //---- авторство индикатора #property copyright "Copyright © 2005 dwt5 and adoleh2000 " //---- ссылка на сайт автора #property link "http://www.metaquotes.net/" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- для расчета и отрисовки индикатора использовано два буфера #property indicator_buffers 2 //---- использовано одно графическое построение #property indicator_plots 1 //+----------------------------------------------+ //| Параметры отрисовки индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 1 в виде цветного облака #property indicator_type1 DRAW_FILLING //---- в качестве цветjd индикатора использованы #property indicator_color1 clrDodgerBlue,clrRed //---- отображение метки линии индикатора #property indicator_label1 "Trigger_Line" //+----------------------------------------------+ //| Объявление констант | //+----------------------------------------------+ #define RESET 0 // константа для возврата терминалу команды на пересчет индикатора //+----------------------------------------------+ //| объявление перечислений | //+----------------------------------------------+ enum ENUM_APPLIED_PRICE_ //Тип константы { PRICE_CLOSE_ = 1, //PRICE_CLOSE PRICE_OPEN_, //PRICE_OPEN PRICE_HIGH_, //PRICE_HIGH PRICE_LOW_, //PRICE_LOW PRICE_MEDIAN_, //PRICE_MEDIAN PRICE_TYPICAL_, //PRICE_TYPICAL PRICE_WEIGHTED_, //PRICE_WEIGHTED PRICE_SIMPL_, //PRICE_SIMPL_ PRICE_QUARTER_, //PRICE_QUARTER_ PRICE_TRENDFOLLOW0_, //PRICE_TRENDFOLLOW0_ PRICE_TRENDFOLLOW1_, // TrendFollow_2 Price PRICE_DEMARK_ // Demark Price }; //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint Rperiod=24; input uint LSMA_Period=6; input ENUM_APPLIED_PRICE_ IPC=PRICE_CLOSE_; // ценовая константа input int Shift=0; // Сдвиг индикатора по горизонтали в барах input uint NumberofBar=1;//Номер бара для подачи сигнала input bool SoundON=true; //Разрешение алерта input uint NumberofAlerts=2;//Количество алертов input bool EMailON=false; //Разрешение почтовой отправки сигнала input bool PushON=false; //Разрешение отправки сигнала на мобильный //+----------------------------------------------+ //---- объявление динамических массивов, которые в дальнейшем //---- будут использованы в качестве индикаторных буферов double WTBuffer[]; double LSMABuffer[]; //---- объявление переменных начала отсчета данных int min_rates_total; double lengthvar,KRperiod,KLSMA_Period; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- инициализация переменных начала отсчета данных min_rates_total=int(Rperiod)+1; lengthvar=int(Rperiod)+1; lengthvar/=3.0; KRperiod=6.0/(Rperiod*(Rperiod+1.0)); KLSMA_Period=2.0/(LSMA_Period+1.0); //---- превращение динамического массива WTBuffer[] в индикаторный буфер SetIndexBuffer(0,WTBuffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчета отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- превращение динамического массива LSMABuffer[] в индикаторный буфер SetIndexBuffer(1,LSMABuffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 2 по горизонтали на Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчета отрисовки индикатора 2 на min_rates_total+1 PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total+1); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,"Trigger_Line(",Rperiod,", ",LSMA_Period,", ",EnumToString(IPC),", ",Shift,")"); //---- создание имени для отображения в отдельном подокне и во всплывающей подсказке 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(rates_totalrates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора first=min_rates_total; // стартовый номер для расчета всех баров else first=prev_calculated-1; // стартовый номер для расчета новых баров //---- основной цикл расчета индикатора for(bar=first; bar=1; iii--) { //---- Обращение к функции PriceSeries для получения входной цены Series double tmp=(iii-lengthvar)*PriceSeries(IPC,bar-Rperiod+iii,open,low,high,close); sum+=tmp; } WTBuffer[bar]=sum*KRperiod; LSMABuffer[bar]=WTBuffer[bar-1]+(WTBuffer[bar]-WTBuffer[bar-1]) *KLSMA_Period; } //--- BuySignal("Trigger_Line",WTBuffer,LSMABuffer,rates_total,prev_calculated,close,spread); SellSignal("Trigger_Line",WTBuffer,LSMABuffer,rates_total,prev_calculated,close,spread); //--- return(rates_total); } //+------------------------------------------------------------------+ //| Получение значения ценовой таймсерии | //+------------------------------------------------------------------+ double PriceSeries ( uint applied_price,// Ценовая константа uint bar,// Индекс сдвига относительно текущего бара на указанное количество периодов назад или вперёд). const double &Open[], const double &Low[], const double &High[], const double &Close[] ) //PriceSeries(applied_price, bar, open, low, high, close) //+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ { //---- switch(applied_price) { //---- Ценовые константы из перечисления ENUM_APPLIED_PRICE case PRICE_CLOSE: return(Close[bar]); case PRICE_OPEN: return(Open [bar]); case PRICE_HIGH: return(High [bar]); case PRICE_LOW: return(Low[bar]); case PRICE_MEDIAN: return((High[bar]+Low[bar])/2.0); case PRICE_TYPICAL: return((Close[bar]+High[bar]+Low[bar])/3.0); case PRICE_WEIGHTED: return((2*Close[bar]+High[bar]+Low[bar])/4.0); //---- case 8: return((Open[bar] + Close[bar])/2.0); case 9: return((Open[bar] + Close[bar] + High[bar] + Low[bar])/4.0); //---- case 10: { if(Close[bar]>Open[bar])return(High[bar]); else { if(Close[bar]Open[bar])return((High[bar]+Close[bar])/2.0); else { if(Close[bar]Open[bar]) res=(res+High[bar])/2; if(Close[bar]==Open[bar]) res=(res+Close[bar])/2; return(((res-Low[bar])+(res-High[bar]))/2); } //---- default: return(Close[bar]); } //---- //return(0); } //+------------------------------------------------------------------+ //| Buy signal function | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // текст имени индикатора для почтовых и пуш-сигналов double &IndArrow[], // индикаторный буфер с основной линией double &SignArrow[], // индикаторный буфер с сигнальной линией const int Rates_total, // текущее количество баров const int Prev_calculated, // количество баров на предыдущем тике const double &Close[], // цена закрытия const int &Spread[]) // спред { //--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool BuySignal=false; bool SeriesTest=ArrayGetAsSeries(IndArrow); int index,index1; if(SeriesTest) { index=int(NumberofBar); index1=index+1; } else { index=Rates_total-int(NumberofBar)-1; index1=index-1; } if(SignArrow[index1]>=IndArrow[index1] && SignArrow[index]