Код Индикатора "Fx10" - Создать свой индикатор.

 
Для новичков(кто вообще не умеет кодировать) - кто желает создать сигнал от своих идей, с помощью индикаторов.
Хорошо подойдёт этот код. https://www.mql5.com/ru/code/772
Попробую по простому на пальцах разложить, как это сделать.
Fx10
Fx10
  • www.mql5.com
Семафорный сигнальный индикатор, формирующий свои значения на основании данных пяти технических индикаторов: LWMA, SMA, RSI, Stochastic, MACD.
 

Здесь можно добавлять Индикаторы или менять другие индикаторы.

//---- получение хендла индикатора MA5
   MA5_Handle=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE);
   if(MA5_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iMA5");
//---- получение хендла индикатора MA10
   MA10_Handle=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW);
   if(MA10_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iMA10");
//---- получение хендла индикатора MA15
   MA15_Handle=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW);
   if(MA15_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iMA15");
//---- получение хендла индикатора RSI
   RSI_Handle=iRSI(NULL,0,int(ParmMult*9),PRICE_CLOSE);
   if(RSI_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iRSI");
//---- получение хендла индикатора Stochastic
   STO_Handle=iStochastic(NULL,0,int(5*ParmMult),int(3*ParmMult),int(3*ParmMult),MODE_SMA,STO_LOWHIGH);
   if(STO_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iStochastic");
//---- получение хендла индикатора MACD
   MACD_Handle=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE);
   if(MACD_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iMACD");
//---- получение хендла индикатора ATR
   ATR_Handle=iATR(NULL,0,15);
   if(ATR_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора ATR");
//---- получение хендлов индикаторов
   RVI_Handle=iRVI(NULL,0,RVI_Period);
   if(RVI_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора RVI");
 

в этом месте, будем получать сигнал от выбранных индикаторов

//---- основной цикл расчета индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      BuyBuffer[bar]=0.0;
      SellBuffer[bar]=0.0;
      //----
      if(MA5[bar]>MA10[bar] && MA5[bar]>MA15[bar])
        {
         RsiUp=RSI[bar]>=55.0;
         StochUp=STO[bar]>STOS[bar];
         MacdUp=MACD[bar]>0;
         RVIUp=RVI[bar]>RVIS[bar];
         if(MacdUp && RVIUp)
           {
            if(OldTrend<0)
               BuyBuffer[bar]=low[bar]-ATR[bar]*3/8;
            if(bar!=0)
               OldTrend=+1;
           }
        }
      if(MA5[bar]<MA10[bar] && MA5[bar]<MA15[bar])
        {
         RsiDn=RSI[bar]<=45.0;
         StochDn=STO[bar]<STOS[bar];
         MacdDn=MACD[bar]<0;
         RVIDn=RVI[bar]<RVIS[bar];
         if(MacdDn && RVIDn)
           {
            if(OldTrend>0)
               SellBuffer[bar]=high[bar]+ATR[bar]*3/8;
            if(bar!=0)
               OldTrend=-1;
           }
        }
     }
//----
 

типа, вот такого сигнального индикатора мы должны получить в итоге

EURUSDH1 

Файлы:
Fx10_artem.mq5  22 kb
 

Давайте теперь выберем Индикаторы и создадим сигнальный Индикатор.

Предлагайте индикаторы - будем создавать! 

 
SanAlex #:

Давайте теперь выберем Индикаторы и создадим сигнальный Индикатор.

Предлагайте индикаторы - будем создавать! 

Возьмём к примеру MACD - можно несколько способов получить сигнал - вот один из них.(где жёлтым - там как раз и создаётся сигнал)

//+------------------------------------------------------------------+
//|                                                         Fx10.mq5 |
//|                                   Copyright © 2000-2007, palanka |
//|                                         http://www.metaquotes.ru |
//+------------------------------------------------------------------+
//---- авторство индикатора
#property copyright "Copyright © 2000-2007, palanka"
//---- ссылка на сайт автора
#property link      ""
//---- номер версии индикатора
#property version   "1.02"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- для расчета и отрисовки индикатора использовано два буфера
#property indicator_buffers 2
//---- использовано всего два графических построения
#property indicator_plots   2
//+----------------------------------------------+
//|  Объявление констант                         |
//+----------------------------------------------+
#define RESET  0 // константа для возврата терминалу команды на пересчет индикатора
//+----------------------------------------------+
//|  Параметры отрисовки медвежьего индикатора   |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде символа
#property indicator_type1   DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Magenta
#property indicator_color1  Red
//---- толщина линии индикатора 1 равна 4
#property indicator_width1  4
//---- отображение метки индикатора
#property indicator_label1  "Fx10 Sell"
//+----------------------------------------------+
//|  Параметры отрисовки бычьего индикатора      |
//+----------------------------------------------+
//---- отрисовка индикатора 2 в виде символа
#property indicator_type2   DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Lime
#property indicator_color2  Blue
//---- толщина линии индикатора 2 равна 4
#property indicator_width2  4
//---- отображение метки индикатора
#property indicator_label2 "Fx10 Buy"
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input string s2 = "Индикатор MACD";    // 2
input int    InpFastEMA     = 12;      // Fast EMA Period
input int    InpSlowEMA     = 26;      // Slow EMA Period
input int    InpSignalSMA   = 9;       // Signal SMA Period
//+----------------------------------------------+
//---- объявление динамических массивов, которые в дальнейшем
//---- будут использованы в качестве индикаторных буферов
double SellBuffer[];
double BuyBuffer[];
//---- объявление целочисленных переменных начала отсчета данных
int min_rates_total;
//---- объявление целочисленных переменных для хендлов индикаторов
int MACD_Handle;
int OldTrend;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- инициализация глобальных переменных
   min_rates_total=int(InpSlowEMA+1);
//---- получение хендла индикатора MACD
   MACD_Handle=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE);
   if(MACD_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iMACD");
//---- превращение динамического массива SellBuffer[] в индикаторный буфер
   SetIndexBuffer(0,SellBuffer,INDICATOR_DATA);
//---- осуществление сдвига начала отсчета отрисовки индикатора 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,234);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries(SellBuffer,true);
//---- превращение динамического массива BuyBuffer[] в индикаторный буфер
   SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA);
//---- осуществление сдвига начала отсчета отрисовки индикатора 2
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger(1,PLOT_ARROW,233);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries(BuyBuffer,true);
//---- установка формата точности отображения индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- имя для окон данных и метка для подокон
   string short_name="Fx10";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//----
  }
//+------------------------------------------------------------------+
//| 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(MACD_Handle)<rates_total
      || rates_total<min_rates_total)
      return(RESET);
//---- объявления локальных переменных
   int to_copy,limit,bar;
   double MACD[],MACDS[];
   bool MacdUp,MacdDn;
//---- расчеты необходимого количества копируемых данных и
//---- и стартового номера limit для цикла пересчета баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
      limit=rates_total-min_rates_total;   // стартовый номер для расчета всех баров
   else
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
   to_copy=limit+1;
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(MACD_Handle,0,0,to_copy,MACD)<=0)
      return(RESET);
   if(CopyBuffer(MACD_Handle,1,0,to_copy,MACDS)<=0)
      return(RESET);
//---- индексация элементов в массивах, как в таймсериях
   ArraySetAsSeries(MACD,true);
   ArraySetAsSeries(MACDS,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
//---- основной цикл расчета индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      BuyBuffer[bar]=0.0;
      SellBuffer[bar]=0.0;
      //----
      MacdUp=MACD[bar]>0;
      if(MacdUp)
        {
         if(OldTrend<0)
            BuyBuffer[bar]=low[bar];
         if(bar!=0)
            OldTrend=+1;
        }
      MacdDn=MACD[bar]<0;
      if(MacdDn)
        {
         if(OldTrend>0)
            SellBuffer[bar]=high[bar];
         if(bar!=0)
            OldTrend=-1;
        }
     }
//----
   return(rates_total);
  }
//+------------------------------------------------------------------+

EURUSDH1 MACD

Файлы:
Fx10_MACD.mq5  14 kb
 
SanAlex #:

Возьмём к примеру MACD - можно несколько способов получить сигнал - вот один из них.(где жёлтым - там как раз и создаётся сигнал)

А теперь давайте добавим ещё фильтр и добавим ещё один Индикатор Stochastic ( жёлтым -  где я добавлял его)

//+------------------------------------------------------------------+
//|                                                         Fx10.mq5 |
//|                                   Copyright © 2000-2007, palanka |
//|                                         http://www.metaquotes.ru |
//+------------------------------------------------------------------+
//---- авторство индикатора
#property copyright "Copyright © 2000-2007, palanka"
//---- ссылка на сайт автора
#property link      ""
//---- номер версии индикатора
#property version   "1.02"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- для расчета и отрисовки индикатора использовано два буфера
#property indicator_buffers 2
//---- использовано всего два графических построения
#property indicator_plots   2
//+----------------------------------------------+
//|  Объявление констант                         |
//+----------------------------------------------+
#define RESET  0 // константа для возврата терминалу команды на пересчет индикатора
//+----------------------------------------------+
//|  Параметры отрисовки медвежьего индикатора   |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде символа
#property indicator_type1   DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Magenta
#property indicator_color1  Red
//---- толщина линии индикатора 1 равна 4
#property indicator_width1  4
//---- отображение метки индикатора
#property indicator_label1  "Fx10 Sell"
//+----------------------------------------------+
//|  Параметры отрисовки бычьего индикатора      |
//+----------------------------------------------+
//---- отрисовка индикатора 2 в виде символа
#property indicator_type2   DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Lime
#property indicator_color2  Blue
//---- толщина линии индикатора 2 равна 4
#property indicator_width2  4
//---- отображение метки индикатора
#property indicator_label2 "Fx10 Buy"
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input string s2 = "Индикатор MACD";       // MACD
input int    InpFastEMA     = 12;         // Fast EMA Period
input int    InpSlowEMA     = 26;         // Slow EMA Period
input int    InpSignalSMA   = 9;          // Signal SMA Period
input string s3 = "Индикатор Stochastic"; // Stochastic
input int    InpKPeriod     = 5;          // K period
input int    InpDPeriod     = 3;          // D period
input int    InpSlowing     = 3;          // Slowing
//+----------------------------------------------+
//---- объявление динамических массивов, которые в дальнейшем
//---- будут использованы в качестве индикаторных буферов
double SellBuffer[];
double BuyBuffer[];
//---- объявление целочисленных переменных начала отсчета данных
int min_rates_total;
//---- объявление целочисленных переменных для хендлов индикаторов
int MACD_Handle,STO_Handle;
int OldTrend;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- инициализация глобальных переменных
   min_rates_total=int(InpSlowEMA+1);
//---- получение хендла индикатора MACD
   MACD_Handle=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE);
   if(MACD_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iMACD");
//---- получение хендла индикатора Stochastic
   STO_Handle=iStochastic(NULL,0,InpKPeriod,InpDPeriod,InpSlowing,MODE_SMA,STO_LOWHIGH);
   if(STO_Handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iStochastic");
//---- превращение динамического массива SellBuffer[] в индикаторный буфер
   SetIndexBuffer(0,SellBuffer,INDICATOR_DATA);
//---- осуществление сдвига начала отсчета отрисовки индикатора 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,234);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries(SellBuffer,true);
//---- превращение динамического массива BuyBuffer[] в индикаторный буфер
   SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA);
//---- осуществление сдвига начала отсчета отрисовки индикатора 2
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger(1,PLOT_ARROW,233);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries(BuyBuffer,true);
//---- установка формата точности отображения индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- имя для окон данных и метка для подокон
   string short_name="Fx10";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//----
  }
//+------------------------------------------------------------------+
//| 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(MACD_Handle)<rates_total
      || BarsCalculated(STO_Handle)<rates_total
      || rates_total<min_rates_total)
      return(RESET);
//---- объявления локальных переменных
   int to_copy,limit,bar;
   double MACD[],MACDS[],STO[],STOS[];
   bool MacdUp,MacdDn,StochUp,StochDn;
//---- расчеты необходимого количества копируемых данных и
//---- и стартового номера limit для цикла пересчета баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
      limit=rates_total-min_rates_total;   // стартовый номер для расчета всех баров
   else
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
   to_copy=limit+1;
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(MACD_Handle,0,0,to_copy,MACD)<=0)
      return(RESET);
   if(CopyBuffer(MACD_Handle,1,0,to_copy,MACDS)<=0)
      return(RESET);
   if(CopyBuffer(STO_Handle,0,0,to_copy,STO)<=0)
      return(RESET);
   if(CopyBuffer(STO_Handle,1,0,to_copy,STOS)<=0)
      return(RESET);
//---- индексация элементов в массивах, как в таймсериях
   ArraySetAsSeries(MACD,true);
   ArraySetAsSeries(MACDS,true);
   ArraySetAsSeries(STO,true);
   ArraySetAsSeries(STOS,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
//---- основной цикл расчета индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      BuyBuffer[bar]=0.0;
      SellBuffer[bar]=0.0;
      //----
      MacdUp=MACD[bar]>0;
      StochUp=STO[bar]>STOS[bar];
      if(MacdUp && StochUp)
        {
         if(OldTrend<0)
            BuyBuffer[bar]=low[bar];
         if(bar!=0)
            OldTrend=+1;
        }
      MacdDn=MACD[bar]<0;
      StochDn=STO[bar]<STOS[bar];
      if(MacdDn && StochDn)
        {
         if(OldTrend>0)
            SellBuffer[bar]=high[bar];
         if(bar!=0)
            OldTrend=-1;
        }
     }
//----
   return(rates_total);
  }
//+------------------------------------------------------------------+

EURUSDH1 Fx10 MACD Stochastic

Файлы:
 
SanAlex #:

А теперь давайте добавим ещё фильтр и добавим ещё один Индикатор Stochastic ( жёлтым -  где я добавлял его)

есть несколько способов получения сигнала от этих двух индикаторов - вот маленькое изменение и мы получаем другие сигналы.( вместо нуля заменил на MACDS[bar] )

//---- основной цикл расчета индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      BuyBuffer[bar]=0.0;
      SellBuffer[bar]=0.0;
      //----
      MacdUp=MACD[bar]>MACDS[bar];
      StochUp=STO[bar]>STOS[bar];
      if(MacdUp && StochUp)
        {
         if(OldTrend<0)
            BuyBuffer[bar]=low[bar];
         if(bar!=0)
            OldTrend=+1;
        }
      MacdDn=MACD[bar]<MACDS[bar];
      StochDn=STO[bar]<STOS[bar];
      if(MacdDn && StochDn)
        {
         if(OldTrend>0)
            SellBuffer[bar]=high[bar];
         if(bar!=0)
            OldTrend=-1;
        }
     }
//----
   return(rates_total);
  }
//+------------------------------------------------------------------+

EURUSDH1 MACD Stochastic

 

Вот ещё один вариант от MACD - взял я его от эксперта из терминала 

Снимок экрана 2021-11-13 101955

в одно месте в индикаторе нужно ещё, вместо 1 поставить 2 (жёлтая метка)

//---- расчеты необходимого количества копируемых данных и
//---- и стартового номера limit для цикла пересчета баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
      limit=rates_total-min_rates_total;   // стартовый номер для расчета всех баров
   else
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
   to_copy=limit+2;
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(MACD_Handle,0,0,to_copy,MACD)<=0)
      return(RESET);
   if(CopyBuffer(MACD_Handle,1,0,to_copy,MACDS)<=0)
      return(RESET);
//---- индексация элементов в массивах, как в таймсериях

а также создать логику сигнала

//---- основной цикл расчета индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      BuyBuffer[bar]=0.0;
      SellBuffer[bar]=0.0;
      //----
      MacdUp=MACD[bar]<0 && MACD[bar]>MACDS[bar] && MACD[bar+1]<MACDS[bar+1];
      if(MacdUp)
        {
         if(OldTrend<0)
            BuyBuffer[bar]=low[bar];
         if(bar!=0)
            OldTrend=+1;
        }
      MacdDn=MACD[bar]>0 && MACD[bar]<MACDS[bar] && MACD[bar+1]>MACDS[bar+1];
      if(MacdDn)
        {
         if(OldTrend>0)
            SellBuffer[bar]=high[bar];
         if(bar!=0)
            OldTrend=-1;
        }
     }
//----

вот сигнал какой получается 

EURUSDH1 Fx10 MACD Sample

Файлы:
 

Теперь можно создать Эксперта и использовать его со всеми созданными вами " Сигнальными Индикаторами "

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Сейчас из этого Эксперта сделаем 

Снимок экрана 2021-11-13 113518

 
Такая ветка у тебя была, где сам с собой общался. Забанили на десять лет.