iMA on handle of another indicator

Einloggen oder registrieren, um einen Kommentar zu schreiben
Wissam L
21
Wissam L  

Hello MQL5 forum,

I hope that I get everything right with my first topic.

According to the MQL5 reference to iMA (), it is not only allowed to set an ENUM_APPLIED_PRICE constant in the used_price constant, but also a handle of another indicator. But I don't know how to apply a handle to another indicator.

I want to average the OBV indicator. Since the OBV indicator has its own chart window on the terminal, the moving average (MA) indicator can be applied to this chart window. Everything works fine, but I have to program this into my EA. Can someone help me?

Here is my OBV indicator. Imagine that the parameters MAX_COPIES, pSymbol, pTimeframe, pVolume, p ... are determined by input variables.

 


//OBV-Indicator 
 double ovb[];
 ArraySetAsSeries(ovb, true );

 int obvHandle = iOBV(pSymbol,pTimeframe,pVolume);
 CopyBuffer(obvHandle, 0 , 0 ,MAX_COPIES,obv);

Here's the moving average: How do I combine these two parts to get the MA of the OBV indicator?

 // Moving average 
 double ma[];
 ArraySetAsSeries(ma, true );
 int maHandle= iMA(pSymbol,pTimeframe,pMAPeriod,pMAShift,pMAMethod,pMAPrice);
 CopyBuffer(maHandle, 0 , 0 ,MAX_COPIES,ma);

Carl Schreiber
Moderator
10134
Carl Schreiber  

Hallo und schon mal viel Erfolg!

Wir sprechen hier Deutsch. :)

Der simpelste Weg wäre den Durchschnitt des iOBV selbst berechnen und dann einem eigenen Indikatorpuffer zuweisen.

Wenn man das als eigenen Indikator programmiert kann man den wie andere aufrufen - oder man programmiert den Mittelwert in einem EA über dem exponentiellen Mittelwert neuerMA = (neuerOBV - alterMA)*c + alterMAprv (mit c = 2/(n+1)).

Wissam L
21
Wissam L  
Carl Schreiber:

Hallo und schon mal viel Erfolg!

Wir sprechen hier Deutsch. :)

Der simpelste Weg wäre den Durchschnitt des iOBV selbst berechnen und dann einem eigenen Indikatorpuffer zuweisen.

Wenn man das als eigenen Indikator programmiert kann man den wie andere aufrufen - oder man programmiert den Mittelwert in einem EA über dem exponentiellen Mittelwert neuerMA = (neuerOBV - alterMA)*c + alterMAprv (mit c = 2/(n+1)).

Danke für die präzise Antwort Carl. Ich habe seit nun deinen zweiten Lösungsvorschlag umgesetzt (jedoch der normale Mittelwert und nicht der EMA):
double current_OBV = obv[0]; 
                        
double OBV_values[];
ArrayResize(OBV_values, MAPeriod); 

double summation_OBV = 0;

for(int i=0; i<MAPeriod; i++)
{
 OBV_values[i] = obv[i];
 summation_OBV += OBV_values[i];
}
double MA_of_OBV = MathRound(summation_OBV / MAPeriod);
Gibt es aber keinen Lösungsvorschlag, der die direkte oben genannte Beschreibung in der MQL5 Referenz umsetzt? 
amando
2950
amando  

Wenn du für die berechnung des ema as handle des onv heranziehst sollte es gehen.

du kannst jeden ema das handle eines anderen indikator übergeben, dann berechnet er aus den werten des ersten indikator im ea

Wissam L
21
Wissam L  
amando:

Wenn du für die berechnung des ema as handle des onv heranziehst sollte es gehen.

du kannst jeden ema das handle eines anderen indikator übergeben, dann berechnet er aus den werten des ersten indikator im ea

Hallo amando, danke für deine Antwort. Genau so eine Lösung suche ich. Ich habe versucht, das handle in den iMA() zu übergeben. Es funktioniert schlicht nicht. Könntest du mir das coden wenn du kannst, das sollte ja eigentlich nicht mehr als 3 Zeilen benötigen. Wäre echt eine große Hilfe.
Otto Pauser
2172
Otto Pauser  

So geht's:

int handle1,handle2;

int OnInit()
{
   handle1=iCustom(_Symbol,_Period,"Examples/CCI");
   if(handle1==INVALID_HANDLE)
      return(INIT_FAILED);

   handle2=iMA(_Symbol,_Period,10,0,MODE_EMA,handle1);
   if(handle2==INVALID_HANDLE)
      return(INIT_FAILED);

   return(INIT_SUCCEEDED);
}

void OnTick()
{

}
Wissam L
21
Wissam L  
Otto Pauser:

So geht's:

Vielen vielen Dank Otto. Ich wusste lediglich nicht, dass ich dafür die iCustom() Funktion brauche. Ich wünsche Dir eine schöne Woche :)
Einloggen oder registrieren, um einen Kommentar zu schreiben