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

Triangular Moving Average with CG bands

tma+cg.mq5
Вы автор или правообладатель?

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

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

О программе

Индикатор рассчитывает треугольную скользящую среднюю (TMA) с полосами отклонений и отображает результат на графике в виде линий и стрелок. Поддерживается работа как на текущем таймфрейме, так и на более высоком, с возможностью интерполяции данных обратно на график текущего периода. Полосы строятся вокруг TMA с использованием отклонений цены, а стрелки сигнализируют о пробое верхней или нижней границы полос. Индикатор предоставляет систему уведомлений через всплывающие сообщения, звуковые сигналы и email.

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

НастройкаОписание
InpTimeFrame Таймфрейм — Строковый параметр для выбора таймфрейма расчёта; поддерживаются стандартные периоды M1–MN1 и CURRENT TIME FRAME
InpHalfLength Длина половины — Целочисленный параметр, задающий половину периода расчёта треугольной скользящей средней
InpPrice Применяемая цена — Выбор цены для расчёта: Close, Open, High, Low, Median, Typical или Weighted
InpBandsDeviations Отклонения полос — Числовой множитель отклонений для построения верхней и нижней полос вокруг TMA
InpInterpolate Интерполяция — Переключатель, включающий линейную интерполяцию значений более высокого таймфрейма на текущий график
InpAlertsOn Включить уведомления — Главный переключатель системы оповещений индикатора
InpAlertsOnCurrent Уведомления на текущем баре — Переключатель проверки пробоя полос на текущем (нулевом) баре вместо предыдущего
InpAlertsOnHighLow Проверка High/Low — Переключатель условия пробоя: проверяет максимум/минимум бара вместо цены закрытия
InpAlertsMessage Всплывающее сообщение — Переключатель отображения уведомления в окне терминала
InpAlertsSound Звуковой сигнал — Переключатель воспроизведения звукового файла при срабатывании уведомления
InpAlertsEmail Email-уведомление — Переключатель отправки email при срабатывании уведомления
Получить полный код

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

#property version   "1.08"
#property description "Triangular Moving Average with CG bands"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   5

#property indicator_label1  "TMA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrWhite
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "Upper"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrOrangeRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

#property indicator_label3  "Lower"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrangeRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1

#property indicator_label4  "Up Arrow"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrWhite
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

#property indicator_label5  "Down Arrow"
#property indicator_type5   DRAW_ARROW
#property indicator_color5  clrWhite
#property indicator_style5  STYLE_SOLID
#property indicator_width5  1

input string   InpTimeFrame       = "current time frame"; // TimeFrame
input int      InpHalfLength      = 55;                    // HalfLength
input ENUM_APPLIED_PRICE InpPrice = PRICE_WEIGHTED;       // Price
input double   InpBandsDeviations = 2.5;                  // BandsDeviations
input bool     InpInterpolate     = true;                  // Interpolate
input bool     InpAlertsOn        = false;                 // alertsOn
input bool     InpAlertsOnCurrent = false;                 // alertsOnCurrent
input bool     InpAlertsOnHighLow = false;                 // alertsOnHighLow
input bool     InpAlertsMessage   = false;                 // alertsMessage
input bool     InpAlertsSound     = false;                 // alertsSound
input bool     InpAlertsEmail     = false;                 // alertsEmail

double         tmBuffer[];   // TMA line
double         upBuffer[];   // Upper band
double         dnBuffer[];   // Lower band
double         upArrow[];    // Up arrow signals
double         dnArrow[];    // Down arrow signals

double         wuBuffer[];
double         wdBuffer[];

ENUM_TIMEFRAMES m_timeframe;           // target timeframe
string          m_indicatorName;       // indicator file name
bool            m_useHigherTF;         // whether we need to use higher timeframe data

ENUM_TIMEFRAMES StringToTimeframe(string tfs)
{
   tfs = StringToUpper(tfs);
   if(tfs == "M1"   || tfs == "1")     return(PERIOD_M1);
   if(tfs == "M5"   || tfs == "5")     return(PERIOD_M5);
   if(tfs == "M15"  || tfs == "15")    return(PERIOD_M15);
   if(tfs == "M30"  || tfs == "30")    return(PERIOD_M30);
   if(tfs == "H1"   || tfs == "60")    return(PERIOD_H1);
   if(tfs == "H4"   || tfs == "240")   return(PERIOD_H4);
   if(tfs == "D1"   || tfs == "1440")  return(PERIOD_D1);
   if(tfs == "W1"   || tfs == "10080") return(PERIOD_W1);
   if(tfs == "MN"   || tfs == "43200") return(PERIOD_MN1);
   if(tfs == "CURRENT TIME FRAME")     return(PERIOD_CURRENT);
   return(PERIOD_CURRENT);
}

int BarShift(const datetime time, const datetime &times[])
{
   int lo = 0, hi = ArraySize(times)-1;
   while(lo <= hi)
   {
      int mid = (lo+hi)/2;
      if(times[mid] == time)
         return(mid);
      else if(times[mid] > time)
         lo = mid+1;
      else
         hi = mid-1;
   }
   return(lo);  // nearest previous bar
}

void CalcTMA(const double &price[], int n, double &tm[], double &up[], double &dn[], 
             int halfLength, double bandsDeviations)
{
   if(n <= 0) return;

   double fullLength = 2.0 * halfLength + 1.0;

   double wu[], wd[];
   ArrayResize(wu, n);
   ArrayResize(wd, n);
   ArrayInitialize(wu, 0.0);
   ArrayInitialize(wd, 0.0);

   for(int i = n-1; i >= 0; i--)
   {
      double sum  = (halfLength+1) * price[i];
      double sumw = (halfLength+1);
      for(int j = 1, k = halfLength; j <= halfLength; j++, k--)
      {

         if(i+j < n)
         {
            sum  += k * price[i+j];
            sumw += k;
         }

         if(i-j >= 0)
         {
            sum  += k * price[i-j];
            sumw += k;
         }
      }
      tm[i] = sum / sumw;

      double diff = price[i] - tm[i];
      if(i == n-1)
      {
         wu[i] = (diff >= 0) ? diff*diff : 0;
         wd[i] = (diff < 0)  ? diff*diff : 0;
      }
      else
      {
         if(diff >= 0)
         {
            wu[i] = (wu[i+1]*(fullLength-1) + diff*diff) / fullLength;
            wd[i] = wd[i+1] * (fullLength-1) / fullLength;
         }
         else
         {
            wd[i] = (wd[i+1]*(fullLength-1) + diff*diff) / fullLength;
            wu[i] = wu[i+1] * (fullLength-1) / fullLength;
         }
      }
      up[i] = tm[i] + bandsDeviations * MathSqrt(wu[i]);
      dn[i] = tm[i] - bandsDeviations * MathSqrt(wd[i]);
   }
}

void GetPriceArray(ENUM_APPLIED_PRICE priceType, 
                   const double &open[], const double &high[], const double &low[], const double &close[],
                   double &price[], int size)
{
   for(int i=0; i<size; i++)
   {
      switch(priceType)
      {
         case PRICE_CLOSE:      price[i] = close[i]; break;
         case PRICE_OPEN:       price[i] = open[i]; break;
         case PRICE_HIGH:       price[i] = high[i]; break;
         case PRICE_LOW:        price[i] = low[i]; break;
         case PRICE_MEDIAN:     price[i] = (high[i]+low[i])/2.0; break;
         case PRICE_TYPICAL:    price[i] = (high[i]+low[i]+close[i])/3.0; break;
         case PRICE_WEIGHTED:   price[i] = (high[i]+low[i]+close[i]+close[i])/4.0; break;
         default:               price[i] = close[i];
      }
   }
}

int OnInit()
{
      // код доступен только после оплаты
   }

   string shortName = "TMA+CG (" + InpTimeFrame + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, shortName);

   m_timeframe = StringToTimeframe(InpTimeFrame);
   if(m_timeframe == PERIOD_CURRENT)
      m_timeframe = Period();

   m_useHigherTF = false;
   if(m_timeframe != Period())
      m_useHigherTF = true;

   SetIndexBuffer(0, tmBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, upBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, dnBuffer, INDICATOR_DATA);
   SetIndexBuffer(3, upArrow, INDICATOR_DATA);
   SetIndexBuffer(4, dnArrow, INDICATOR_DATA);
   SetIndexBuffer(5, wuBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(6, wdBuf

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

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

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

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

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

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

Стоимость полного кода
888,90₽ ≈ $10.86