Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Индикаторы

WeightOscillator_Alert - индикатор для MetaTrader 5

Просмотров:
2398
Рейтинг:
(19)
Опубликован:
2016.12.02 16:28
Обновлен:
2023.03.16 17:30
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Трендовый индикатор WeightOscillator с подачей алертов, с отправкой почтовых сообщений и push-сообщений на смартфон.

Для алертов, почтовых сообщений и push-сообщений на смартфон в коде индикатора были сделаны следующие изменения:

  1. До объявления входных переменных на глобальном уровне объявлено перечисление для вариантов транслируемых индикатором сигналов
    //+----------------------------------------------------+
    //| перечисление для вариантов транслируемых сигналов  |
    //+----------------------------------------------------+
    enum ENUM_SIGNAL_MODE
      {
       MODE_SIGNAL,  //Сигналы пробоя
       MODE_TREND    //Сигналы пробоя и тренда
      };
  2. Во входные параметры индикатора дописаны новые входные переменные
    //---- Входные переменные для алертов
    input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Вариант подачи сигнала
    input uint NumberofBar=1;                    //Номер бара для подачи сигнала
    input bool SoundON=true;                     //Разрешение алерта
    input uint NumberofAlerts=2;                 //Количество алертов
    input bool EMailON=false;                    //Разрешение почтовой отправки сигнала
    input bool PushON=false;                     //Разрешение отправки сигнала на мобильный
  3. Добавлены три новые функции BuySignal(), SellSignal() и GetStringTimeframe() в конец индикаторного кода
    //+------------------------------------------------------------------+
    //| Buy signal function                                              |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// текст имени индикатора для почтовых и пуш-сигналов
                   double &ColorArray[],// цветовой индексный буфер
                   int ColorIndex,// индекс цвета в цветовом индексном буфере для подачи сигнала
                   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(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }
       if(SignMode==MODE_SIGNAL)
         {
          if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
         }
       else
         {
          if(ColorArray[index]==ColorIndex) BuySignal=true;
         }
       if(BuySignal && counter<=NumberofAlerts)
         {
          counter++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SeriesTest=ArrayGetAsSeries(Close);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          double Ask=Close[index];
          double Bid=Close[index];
          SeriesTest=ArrayGetAsSeries(Spread);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          Bid+=_Point*Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
            {
             if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
            }
          else
            {
             if(SoundON) Alert("Up Trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Up Trend signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": Up Trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
            }
         }

    //---
      }
    //+------------------------------------------------------------------+
    //| Sell signal function                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// текст имени индикатора для почтовых и пуш-сигналов
                    double &ColorArray[],       // цветовой индексный буфер
                    int ColorIndex,             // индекс цвета в цветовом индексном буфере для подачи сигнала
                    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 SellSignal=false;
       bool SeriesTest=ArrayGetAsSeries(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }

       if(SignMode==MODE_SIGNAL)
         {
          if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
         }
       else
         {
          if(ColorArray[index]==ColorIndex) SellSignal=true;
         }
       if(SellSignal && counter<=NumberofAlerts)
         {
          counter++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SeriesTest=ArrayGetAsSeries(Close);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          double Ask=Close[index];
          double Bid=Close[index];
          SeriesTest=ArrayGetAsSeries(Spread);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          Bid+=_Point*Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
            {
             if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
            }
          else
            {
             if(SoundON) Alert("Down trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Down trend signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": Down trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
            }
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Получение таймфрейма в виде строки                              |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  4. В блоке OnCalculate() после циклов расчёта индикатора добавлена пара обращений к функциям BuySignal() и SellSignal()
    //---    
       BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
       SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
    //---  

Где ColorBuffer — это имя цветового индексного буфера для хранения цветов индикатора, а значения 0 и 4 — это номера цветов в этом буфере при которых осциллятор находится в зонах перекупленности и перепроданности соответственно. 

Предполагается, что в коде индикатора в блоке OnCalculate() будет использовано всего по одному обращению к функциям BuySignal() и SellSignal().

Индикатор использует классы библиотеки SmoothAlgorithms.mqh (нужно скопировать в <каталог_данных_терминала>\MQL5\Include), подробное описание работы с которыми было опубликовано в статье "Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов".

Рис.1. Индикатор WeightOscillator_Alert на графике

Рис.1. Индикатор WeightOscillator_Alert на графике

Рис.3. Индикатор WeightOscillator_Alert. Подача алерта для сигнала тренда

Рис.2. Индикатор WeightOscillator_Alert. Подача алерта для сигнала пробоя

Рис.3. Индикатор WeightOscillator_Alert. Подача алерта для сигнала тренда

Рис.3. Индикатор WeightOscillator_Alert. Подача алерта для сигнала тренда

Fractal_Keltner_x5_Cloud Fractal_Keltner_x5_Cloud

Два фрактальных канала Кёлтнера в облачном исполнении.

Fractional_Bands_HTF Fractional_Bands_HTF

Индикатор Fractional_Bands с возможностью изменения таймфрейма индикатора во входных параметрах.

Chart on Chart Chart on Chart

Индикатор Chart on Chart выводит график другого символа на текущем графике.

eur usd m5 eur usd m5

Советник работает в режиме мартингейла по сигналам индикатора iStochastic, Stochastic Oscillator.