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 ×[])
{
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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.