Нужно в описании указать, что индикатор рисует.
Можете ли вы добавить звуковые оповещения при изменении тренда?
Здравствуйте, Диого,
У вас случайно нет версии для MT4? Спасибо
С цветами:
//properties
#property copyright "Copyright 2016, quebralim"
#property link "https://www.mql5.com/en/users/quebralim"
#property version "1.4"
#property description "Trends Accumulator"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 1
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_colour1 clrBlue,clrRed
#property indicator_width1 10
#property indicator_label1 "Trends Accumulator"
//входы
input uint Threshold =40; //Порог (в пунктах)
input uint MA_Period =10; //Период МА (в барах)
input ENUM_MA_METHOD MA_Method =MODE_EMA; //MA Method
input ENUM_APPLIED_PRICE MA_Price =PRICE_TYPICAL; //MA Price
//глобалы
double bTA[]; //Буфер TA
double bMA[]; //Буфер MA
int hMA; // Обработчик MA
double cTA[]; // Буфер Clr
double xTA[]; // Буфер Clr TA
//+------------------------------------------------------------------+
//| Функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
{
//проверка входов
if(MA_Period<1)
return INIT_PARAMETERS_INCORRECT;
//индекс входов
SetIndexBuffer(0,xTA,INDICATOR_DATA);
SetIndexBuffer(1,cTA,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,bMA,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,bTA,INDICATOR_CALCULATIONS);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MA_Period);
//Инициализация имени индикатора
IndicatorSetString(INDICATOR_SHORTNAME, "Trend Accumulator ("+(string)Threshold+", "+(string)MA_Period+")");
//Инициализация МА
hMA=iMA(_Symbol,_Period,MA_Period,0,MA_Method,MA_Price);
if (hMA == INVALID_HANDLE){
Print("Не удалось инициализировать индикатор MA!");
return INIT_FAILED;
}
//успех!
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Функция вычисления |
//+------------------------------------------------------------------+
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(rates_total<=(int)MA_Period)
{
return 0;
}
//готов ли MA к копированию?
ResetLastError();
if(BarsCalculated(hMA)<rates_total)
{
Print("Не все данные MA рассчитаны. Ошибка #",GetLastError());
return prev_calculated;
}
//какой объем MA мы должны скопировать?
int to_copy;
if(prev_calculated>rates_total || prev_calculated<=0)
{
to_copy=rates_total;
}
else
{
to_copy=rates_total-prev_calculated+2;
}
// Проверьте, остановлена ли операция перед большой операцией
if(IsStopped())
{
return 0;
}
//копируем буфер MA
ResetLastError();
if(CopyBuffer(hMA,0,0,to_copy,bMA)<=0)
{
Print("Не удалось получить MA! Ошибка #",GetLastError());
return prev_calculated;
}
//вычисление начала
int i;
if(prev_calculated<=(int)MA_Period)
{
i=(int)MA_Period;
}
else
{
i=prev_calculated-1;
}
//вычисляем TA через start...i...rates_total
int iMax;
while(i<rates_total-1)
{
//остановка
if(IsStopped())
{
return 0;
}
//первое значение
bTA[i]=bTA[i-1]+bMA[i]-bMA[i-1];
xTA[i]=bTA[i];
if(xTA[i]<0)
{
xTA[i]=xTA[i]*(-1);
}
cTA[i]=0;
if(bTA[i]<0)
{
cTA[i]=1;
}
//последнее максимальное значение
if(bTA[i]*bTA[i-1]>0)
{
iMax=MaxAround(i);
}
else
{
iMax=MaxAround(i-1);
}
//перепишите, если необходимо
if((bTA[iMax]>0 && bTA[iMax]-bTA[i]>=Threshold*_Point) //если он упал слишком низко
|| (bTA[iMax]<0 && bTA[i]-bTA[iMax]>=Threshold*_Point))
{ //если он поднялся слишком высоко
bTA[iMax+1]=bMA[iMax+1]-bMA[iMax];
xTA[iMax+1]=bTA[iMax+1];
if(xTA[iMax+1]<0)
{
xTA[iMax+1]=xTA[iMax+1]*(-1);
}
cTA[iMax+1]=0;
if(bTA[iMax+1]<0)
{
cTA[iMax+1]=1;
}
for(int k=iMax+2; k<=i;++k)
{
bTA[k]=bTA[k-1]+bMA[k]-bMA[k-1];
xTA[k]=bTA[k];
if(xTA[k]<0)
{
xTA[k]=xTA[k]*(-1);
}
cTA[k]=0;
if(bTA[k]<0)
{
cTA[k]=1;
}
}
}
//increment
++i;
}
//оцениваем только последний сигнал
bTA[i]=bTA[i-1]+bMA[i]-bMA[i-1];
xTA[i]=bTA[i];
if(xTA[i]<0)
{
xTA[i]=xTA[i]*(-1);
}
cTA[i]=0;
if(bTA[i]<0)
{
cTA[i]=1;
}
//done
return i;
}
//+------------------------------------------------------------------+
//| Max Around | |
//+------------------------------------------------------------------+
//Возвращает: индекс абсолютного максимального значения в текущем тренде
int MaxAround(int i)
{
int iMax=i;
//позитивная версия
if(bTA[i]>0)
{
while(i > 0 && bTA[--i]>0)
{
if(bTA[i]>bTA[iMax])
{
iMax=i;
}
}
}
//отрицательная версия
else if(bTA[i]<0)
{
while(i > 0 && bTA[--i]<0)
{
if(bTA[i]<bTA[iMax])
{
iMax=i;
}
}
}
//return
return iMax;
}
//+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Trends Accumulator:
Аккумулятор движений цены. Определяет начало и конец тренда.
Автор: Diogo Seca