← К каталогу
Исходный код · ID 4051

Channel Sun Signals

channel sun signals eng.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Channel Sun Signals — индикатор анализа для MetaTrader 5, построенный на основе канала с треугольно-взвешенным средним и верхней/нижней границами. Индикатор отображает центральную линию, верхнюю и нижнюю полосы, а также стрелки BUY (синие, снизу) и SELL (красные, сверху) при развороте цены от границ канала.

Поддерживается работа на любом таймфрейме с возможностью интерполяции между барами мультитаймфреймного анализа. Для размещения стрелок используется смещение на основе ATR текущего графика.

Встроены три фильтра сигналов: фильтр волатильности (отключение сигналов при слишком узкой полосе), фильтр объёма (подтверждение сигнала повышенным объёмом) и cooldown между сигналами. Также реализована система оповещений с поддержкой popup-уведомлений, звука, email и push-уведомлений.

Настройки программы

НастройкаОписание
InpTimeFrame Таймфрейм для анализа (выбирается из выпадающего списка: текущий, M1...MN1). При выборе таймфрейма меньше графика автоматически используется таймфрейм графика.
InpHalfLength Половина длины канала, определяющая гладкость расчёта средней линии (число баров в окне усреднения).
InpPrice Тип цены для расчёта канала (выбирается из вариантов: Open, High, Low, Median, Typical, Weighted).
InpBandsDeviations Множитель отклонения полос от центральной линии канала.
InpInterpolate Включение интерполяции значений канала между барами мультитаймфреймного анализа.
InpColorMid Цвет центральной линии канала (выбирается из выпадающего списка доступных цветов).
InpColorUpper Цвет верхней полосы канала (выбирается из выпадающего списка доступных цветов).
InpColorLower Цвет нижней полосы канала (выбирается из выпадающего списка доступных цветов).
InpColorDownArrow Цвет стрелки SELL (выбирается из выпадающего списка доступных цветов).
InpColorUpArrow Цвет стрелки BUY (выбирается из выпадающего списка доступных цветов).
InpWidthMid Толщина центральной линии канала (значение от 1 до 5).
InpWidthUpper Толщина верхней полосы канала (значение от 1 до 5).
InpWidthLower Толщина нижней полосы канала (значение от 1 до 5).
InpArrowSizeDown Размер стрелки SELL (значение от 1 до 5).
InpArrowSizeUp Размер стрелки BUY (значение от 1 до 5).
InpSignalsClosedBarOnly При включении сигналы отображаются только после закрытия бара, что исключает перерисовку.
InpFilterVolatility Включение фильтра волатильности: сигналы игнорируются при слишком узкой полосе (безтрендовый рынок).
InpMinBandWidthPct Минимальная ширина полосы в процентах от цены, при которой сигнал считается допустимым (используется при включённом фильтре волатильности).
InpFilterVolume Включение фильтра объёма: сигнал подтверждается только при объёме на баре сигнала выше среднего.
InpVolumeAvgPeriod Период усреднения объёма (количество баров до бара сигнала) для фильтра объёма.
InpVolumeMultiplier Множитель объёма: объём на баре сигнала должен быть не менее среднего, умноженного на этот коэффициент (используется при включённом фильтре объёма).
InpSignalCooldownBars Минимальное количество баров между двумя последовательными сигналами (0 — без ограничений).
InpAlertsOn Включение или отключение всех оповещений индикатора.
InpAlertsOnCurrent При включении оповещения проверяются на текущей незакрытой баре, иначе — на закрытой.
InpAlertsOnHighLow При включении оповещения срабатывают по ценам High/Low, иначе — по цене Close.
InpAlertsMessage Включение всплывающего окна-уведомления при срабатывании оповещений индикатора.
InpAlertsSound Включение звукового оповещения при срабатывании индикатора.
InpAlertsEmail Включение email-уведомлений при срабатывании оповещений индикатора.
InpAlertsNotify Включение push-уведомлений при срабатывании оповещений индикатора.
Получить полный код

Поиск по коду файла

#property version   "2.00"

#property indicator_chart_window
#property indicator_buffers 7
#property indicator_plots   5

#property indicator_label1  "Mid"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrWhite
#property indicator_style1  STYLE_DOT
#property indicator_width1  1

#property indicator_label2  "Upper"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrOrange
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

#property indicator_label3  "Lower"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrange
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

#property indicator_label4  "Sell (above)"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrRed
#property indicator_width4  1

#property indicator_label5  "Buy (below)"
#property indicator_type5   DRAW_ARROW
#property indicator_color5  clrBlue
#property indicator_width5  1

enum ENUM_ColorChoice
  {
   Color_White,
   Color_Black,
   Color_DimGray,
   Color_Gray,
   Color_Silver,
   Color_Red,
   Color_Maroon,
   Color_OrangeRed,
   Color_Orange,
   Color_Gold,
   Color_Yellow,
   Color_YellowGreen,
   Color_LimeGreen,
   Color_Lime,
   Color_Green,
   Color_DarkGreen,
   Color_Teal,
   Color_Aqua,
   Color_Cyan,
   Color_DeepSkyBlue,
   Color_DodgerBlue,
   Color_Blue,
   Color_Navy,
   Color_SlateBlue,
   Color_Purple,
   Color_Magenta,
   Color_DeepPink,
   Color_Pink,
   Color_Brown,
   Color_Chocolate,
   Color_Turquoise,
   Color_Violet
  };

color ColorFromChoice(ENUM_ColorChoice c)
  {
   switch(c)
     {
      case Color_White:       return clrWhite;
      case Color_Black:       return clrBlack;
      case Color_DimGray:     return clrDimGray;
      case Color_Gray:        return clrGray;
      case Color_Silver:      return clrSilver;
      case Color_Red:         return clrRed;
      case Color_Maroon:      return clrMaroon;
      case Color_OrangeRed:   return clrOrangeRed;
      case Color_Orange:      return clrOrange;
      case Color_Gold:        return clrGold;
      case Color_Yellow:      return clrYellow;
      case Color_YellowGreen: return clrYellowGreen;
      case Color_LimeGreen:   return clrLimeGreen;
      case Color_Lime:        return clrLime;
      case Color_Green:       return clrGreen;
      case Color_DarkGreen:   return clrDarkGreen;
      case Color_Teal:        return clrTeal;
      case Color_Aqua:        return clrAqua;
      case Color_Cyan:        return clrCyan;
      case Color_DeepSkyBlue: return clrDeepSkyBlue;
      case Color_DodgerBlue:  return clrDodgerBlue;
      case Color_Blue:        return clrBlue;
      case Color_Navy:        return clrNavy;
      case Color_SlateBlue:   return clrSlateBlue;
      case Color_Purple:      return clrPurple;
      case Color_Magenta:     return clrMagenta;
      case Color_DeepPink:    return clrDeepPink;
      case Color_Pink:        return clrPink;
      case Color_Brown:       return clrBrown;
      case Color_Chocolate:   return clrChocolate;
      case Color_Turquoise:   return clrTurquoise;
      case Color_Violet:      return clrViolet;
      default:                return clrDimGray;
     }
  }

input ENUM_TIMEFRAMES InpTimeFrame = PERIOD_CURRENT;     // Timeframe (dropdown: current, M1...MN1)
input int    InpHalfLength      = 30;                    // Channel HalfLength (smoothness)
input ENUM_APPLIED_PRICE InpPrice = PRICE_WEIGHTED;       // Applied price
input double InpBandsDeviations = 2.0;                    // Bands deviation multiplier
input bool   InpInterpolate     = true;                   // Interpolate between MTF bars

input group "=== Colors (list, not palette) ==="
input ENUM_ColorChoice InpColorMid       = Color_White;       // Mid line color
input ENUM_ColorChoice InpColorUpper     = Color_Orange;      // Upper band color
input ENUM_ColorChoice InpColorLower     = Color_Orange;      // Lower band color
input ENUM_ColorChoice InpColorDownArrow = Color_Red;         // Sell arrow color
input ENUM_ColorChoice InpColorUpArrow   = Color_Blue;        // Buy arrow color

input group "=== Line width / Arrow size ==="
input int    InpWidthMid        = 1;                      // Mid line width (1-5)
input int    InpWidthUpper      = 2;                      // Upper band width (1-5)
input int    InpWidthLower      = 2;                      // Lower band width (1-5)
input int    InpArrowSizeDown   = 1;                       // Sell arrow size (1-5)
input int    InpArrowSizeUp     = 1;                       // Buy arrow size (1-5)

input group "=== Signals ==="
input bool   InpSignalsClosedBarOnly = false;             // Signal only after bar close (no repainting)

input group "=== Signal filters (optional) ==="
input bool   InpFilterVolatility  = false;                // 1) Filter signals when band is too narrow (no-trend market)
input double InpMinBandWidthPct   = 0.10;                 // Minimum band width (% of price) for a valid signal
input bool   InpFilterVolume      = false;                // 2) Confirm signal with above-average volume
input int    InpVolumeAvgPeriod   = 20;                   // Volume average period (bars prior to the signal bar)
input double InpVolumeMultiplier  = 1.2;                  // Signal bar volume must be >= average * this factor
input int    InpSignalCooldownBars= 0;                    // 3) Minimum bars between two signals (0 = disabled)

input group "=== Alerts ==="
input bool   InpAlertsOn        = false;                  // Enable alerts
input bool   InpAlertsOnCurrent = false;                  // Alerts on current (unclosed) bar
input bool   InpAlertsOnHighLow = true;                   // Alert on High/Low (otherwise on Close)
input bool   InpAlertsMessage   = true;                   // Popup alert
input bool   InpAlertsSound     = false;                  // Sound alert
input bool   InpAlertsEmail     = false;                  // Email alert
input bool   InpAlertsNotify    = false;                  // Push notification alert

double midBuffer[];
double upBuffer[];
double dnBuffer[];
double dnArrowBuf[];   // semnal SELL (sageata rosie, deasupra lumanarii)
double upArrowBuf[];   // semnal BUY  (sageata albastra, sub lumanare)
double wuBuffer[];   // buffer intermediar de calcul (deviatie superioara) - pt. timeframe-ul curent
double wdBuffer[];   // intermediate calculation buffer (lower deviation) - for the current timeframe

double atrArray[];
int    atrHandle = INVALID_HANDLE;

MqlRates htRates[];
double   htMid[];
double   htUpper[];
double   htLower[];
double   htWu[];
double   htWd[];
int      htCount=0;

double   htO[];
double   htH[];
double   htL[];
double   htC[];

datetime gHtLastBarTime=0;
int      gHtLastCopied=-1;

int               halfLength;
double            bandsDeviations;
ENUM_TIMEFRAMES   timeFrame;
bool              useMTF    = false;

double AppliedPriceOf(int i,const double &o[],const double &h[],const double &l[],const double &c[])
  {
   switch(InpPrice)
     {
      case PRICE_OPEN:     return o[i];
      case PRICE_HIGH:     return h[i];
      case PRICE_LOW:      return l[i];
      case PRICE_MEDIAN:   return (h[i]+l[i])/2.0;
      case PRICE_TYPICAL:  return (h[i]+l[i]+c[i])/3.0;
      case PRICE_WEIGHTED: return (h[i]+l[i]+2.0*c[i])/4.0;
      default:             return c[i];
     }
  }

bool IsValidLevel(double v)
  {
   return(v>-1000000.0 && v<1000000.0 && v!=0.0);
  }

string TimeframeToString(ENUM_TIMEFRAMES tf)
  {
   string s=EnumToString(tf);
   StringReplace(s,"PERIOD_","");
   return s;
  }

void CalculateChannelGeneric(int limit,int total,
                              const double &o[],const double &h[],const double &l[],const double &c[],
                              double &midOut[],double &upOut[],double &dnOut[],double &wuOut[],double &wdOut[])
  {
   double fullLength=2.0*halfLength+1.0;
   int seedIndex=total-halfLength-1;
   if(seedIndex<0) seedIndex=total-1;

   for(int i=limit; i>=0; i--)
     {
      double sum =(halfLength+1)*AppliedPriceOf(i,o,h,l,c);
      double sumw=(halfLength+1);

      for(int j=1,k=halfLength; j<=halfLength; j++,k--)
        {
         int idxNewer=i-j;
         int idxOlder=i+j;

         if(idxNewer>=0)
           {
            sum +=k*AppliedPriceOf(idxNewer,o,h,l,c);
            sumw+=k;
           }
         if(idxOlder<total)
           {
            sum +=k*AppliedPriceOf(idxOlder,o,h,l,c);
            sumw+=k;
           }
        }
      midOut[i]=sum/sumw;

      double diff=AppliedPriceOf(i,o,h,l,c)-midOut[i];

      if(i>seedIndex) continue;
      if(i==seedIndex)
        {
         upOut[i]=midOut[i];
         dnOut[i]=midOut[i];
         if(diff>=0) { wuOut[i]=diff*diff; wdOut[i]=0; }
         else        { wdOut[i]=diff*diff; wuOut[i]=0; }
         continue;
        }

      if(diff>=0)
        {
         wuOut[i]=(wuOut[i+1]*(fullLength-1)+diff*diff)/fullLength;
         wdOut[i]= wdOut[i+1]*(fullLength-1)/fullLength;
        }
      else
        {
         wdOut[i]=(wdOut[i+1]*(fullLength-1)+diff*diff)/fullLength;
         wuOut[i]= wuOut[i+1]*(fullLength-1)/fullLength;
        }

      upOut[i]=midOut[i]+bandsDeviations*MathSqrt(MathMax(wuOut[i],0.0));
      dnOut[i]=midOut[i]-bandsDeviations*MathSqrt(MathMax(wdOut[i],0.0));

      if(!MathIsValidNumber(midOut[i]) || !MathIsValidNumber(upOut[i]) || !MathIsValidNumber(dnOut[i]))
        {
         double fallback=AppliedPriceOf(i,o,h,l,c);
         midOut[i]=fallback; upOut[i]=fallback; dnOut[i]=fallback;
         wuOut[i]=0; wdOut[i]=0;
        }
     }
  }

void CalculateSignals(int limit,int rates_total,
                       const double &open[],const double &high[],const double &low[],const double &close[],
                       const long &tick_volume[])
  {
   int atrCount=limit+2;
   if(atrCount>rates_total) atrCount=rates_total;
   bool haveAtr=false;
   if(atrHandle!=INVALID_HANDLE && atrCount>0)
     {
      if(ArraySize(atrArray)<atrCount)
        {
         if(ArrayResize(atrArray,atrCount,1000)<atrCount) atrCount=0; // esec la resize -> renuntam sigur la offset ATR
        }
      if(atrCount>0)
        {
         ArraySetAsSeries(atrArray,true);
         haveAtr=(CopyBuffer(atrHandle,0,0,atrCount,atrArray)>0);
        }
     }

   int startIdx=(InpSignalsClosedBarOnly ? 1 : 0);
   for(int i=limit; i>=0; i--)
     {
      dnArrowBuf[i]=EMPTY_VALUE;
      upArrowBuf[i]=EMPTY_VALUE;

      if(i<startIdx) continue;            // bara 0 (in formare) - sarita daca vrem doar bare inchise
      if(i+1>=rates_total) continue;

      double atrVal=0;
      if(haveAtr && i<ArraySize(atrArray)) atrVal=atrArray[i];

      bool rawSell=(IsValidLevel(upBuffer[i+1]) && high[i+1]>upBuffer[i+1] && close[i+1]>open[i+1] && close[i]<open[i]);
      bool rawBuy =(IsValidLevel(dnBuffer[i+1]) && low[

Показано первые 50% кода (символов: 16684)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 668,40₽ ≈ $20.39