Indikatoren: Trends Accumulator

 

Trends Accumulator:

Akkumulator von Preisbewegungen. Bestimmt Beginn und Ende eines Trends.

Autor: Diogo Seca

 
Guten Morgen Diego, ich benutze den Trendakkumulator und möchte eine personalisierte Modifikation, können wir reden?
 

Sie müssen in der Beschreibung angeben, was der Indikator zeichnet.

 

Können Sie akustische Warnungen hinzufügen, wenn sich der Trend ändert?

 
Erinnerungston hinzufügen
 

Hallo Diogo,


hast du zufällig die MT4-Version verfügbar? Danke

 
Der Indikator ist perfekt, aber ich sehe nur ein Problem..... Er malt neu!
Ist es möglich, dies zu beheben?
 

Mit Farben:


//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

#Eigenschaft indicator_buffers 4

#Eigenschaft indicator_plots 1

#property indicator_type1 DRAW_COLOR_HISTOGRAM

#property indicator_colour1 clrBlue,clrRed

#property indicator_width1 10

#property indicator_label1 "Trends Akkumulator"

//Eingaben

input uint Schwellenwert =40; //Schwellenwert (in Punkten)

input uint MA_Period =10; //MA Periode (in Balken)

input ENUM_MA_METHOD MA_Methode =MODE_EMA; //MA Methode

input ENUM_APPLIED_PRICE MA_Price =PRICE_TYPICAL; //MA Preis

//globals

double bTA[]; // TA-Puffer

double bMA[]; // MA-Puffer

int hMA; // MA-Bearbeiter

double cTA[]; // Clr-Puffer

double xTA[]; // Clr TA-Puffer



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

//| Indikator Initialisierungsfunktion |

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

int OnInit()

{

//Eingangsüberprüfungen

if(MA_Periode<1)

return INIT_PARAMETERS_INCORRECT;


//Index-Inits

SetIndexPuffer(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);

//Indikatorname init

IndicatorSetString(INDICATOR_SHORTNAME, "Trend Accumulator ("+(string)Threshold+", "+(string)MA_Period+")");


//MA-Einleitung

hMA=iMA(_Symbol,_Periode,MA_Periode,0,MA_Methode,MA_Preis);

if (hMA == INVALID_HANDLE){

Print("Der MA-Indikator konnte nicht initialisiert werden!");

return INIT_FAILED;

}

//Erfolg!

return INIT_SUCCEEDED;

}

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

//| Berechnungsfunktion |

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

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 &Volumen[],

const int &spread[])

{

//Gibt es genug Daten?

if(rates_total<=(int)MA_Period)

{

0 zurückgeben;

}


//ist MA bereit zum Kopieren?

ResetLastError();

if(BarsCalculated(hMA)<rates_total)

{

Print("Nicht alle Daten des MA sind berechnet. Fehler #",GetLastError());

return prev_calculated;

}


//Wie viel von MA sollen wir kopieren?

int to_copy;

if(prev_calculated>Raten_gesamt || prev_calculated<=0)

{

to_copy=Raten_Gesamt;

}

sonst

{

to_copy=trates_total-prev_calculated+2;

}


//Test, ob vor der großen Operation angehalten wurde

if(IsStopped())

{

0 zurückgeben;

}


//Kopieren des MA-Puffers

ResetLastError();

if(CopyBuffer(hMA,0,0,to_copy,bMA)<=0)

{

Print("Failed getting MA! Fehler #",GetLastError());

return prev_calculated;

}


//Berechnung des Starts

int i;

if(prev_calculated<=(int)MA_Period)

{

i=(int)MA_Zeitraum;

}

sonst

{

i=vorher_berechnet-1;

}


//Berechnung von TA durch start...i...rates_total

int iMax;

while(i<Raten_Gesamt-1)

{

//Stop-Klausel

if(IsStopped())

{

0 zurückgeben;

}


//erster Wert

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;

}


//letzter Maximalwert

if(bTA[i]*bTA[i-1]>0)

{

iMax=MaxAround(i);

}

sonst

{

iMax=MaxAround(i-1);

}


//bei Bedarf umschreiben

if((bTA[iMax]>0 && bTA[iMax]-bTA[i]>=Schwellenwert*_Point) //wenn er zu tief gefallen ist

|| (bTA[iMax]<0 && bTA[i]-bTA[iMax]>=Schwellenwert*_Punkt))

{ //wenn sie zu hoch gestiegen ist

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;

}

}

}


//inkrementieren

++i;

}

//nur das letzte Signal schätzen

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 | |

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

//Rückgabe: Index zum absoluten Maximalwert innerhalb des aktuellen Trends

int MaxAround(int i)

{

int iMax=i;

//positive Version

if(bTA[i]>0)

{

while(i > 0 && bTA[--i]>0)

{

if(bTA[i]>bTA[iMax])

{

iMax=i;

}

}

}

//negative Version

else if(bTA[i]<0)

{

while(i > 0 && bTA[--i]<0)

{

if(bTA[i]<bTA[iMax])

{

iMax=i;

}

}

}

//zurück

gibt iMax zurück;

}

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