Индикаторы: Trends Accumulator

 

Trends Accumulator:

Аккумулятор движений цены. Определяет начало и конец тренда.

Автор: Diogo Seca

 
Доброе утро, Диего, я использую трендовый аккумулятор, я хотел бы получить индивидуальную модификацию, мы можем поговорить?
 

Нужно в описании указать, что индикатор рисует.

 

Можете ли вы добавить звуковые оповещения при изменении тренда?

 
Добавьте звук напоминания
 

Здравствуйте, Диого,


У вас случайно нет версии для 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;

}

//+------------------------------------------------------------------+