Custom Indikator funktioniert nicht im ExpertAdvisor

 

Hallo zusammen,


ich hatte vor ein paar Tagen mal mit MQL5 angefangen und gestern meinen ersten Indicator geschrieben. Dieser greift auf 3 andere Indikatoren zurück, wertet die Werte aus und generiert dann einfach nur ein Signal. Das Signal wird einfach im Chart sowohl über Comment() angezeigt als auch über ein Objekt (Buy- / Sell-Arrow) über der entsprechenden Kerze. Das funktioniert alles wie's soll und auch im Tester ist es genauso, wie ich's haben möchte.


Nun wollte ich den Indikator schlicht in einem ExpertAdvisor einbinden und das klappt auch so weit ohne Fehler, allerdings lässt sich über den IndicatorBuffer kein Signal ermitteln. Der Buffer ist 0.0 wenn kein Signal vorliegt, 1.0 bei Buy und 2.0 bei Sell (schlicht & einfach ;-) - im ExpertAdvisor wird aber immer 0 angezeigt. Der Buffer ist im Indicator eingerichtet (Codesnippet Indicator):

#property indicator_buffers 1
//indicator buffers
double    ExtIndiBuffer[];
int OnInit()
  {
      //--- indicator buffers mapping
      SetIndexBuffer(0,ExtIndiBuffer);
      //---
      return(INIT_SUCCEEDED);
  }

bekommt die richtigen Werte zugewiesen und er zeigt auch die richtigen Werte an, wenn ich ihn über Comment ausgebe (Codesnippet Indicator) :

Comment(
        "Buffer: "+ExtIndiBuffer[0]
       );


Im EA allerdings scheint irgendwas nicht richtig zu funktionieren - der Buffer ist immer 0. Hier der EA wie er gerade aussieht:

double test[];
int IndicHandle;

int OnInit()
  {
      ArraySetAsSeries(test,true);
      IndicHandle=iCustom(_Symbol,_Period,"IchiADX",9,9,26,52,24,5.0,15.0,false,false,true);
      if (IndicHandle==NULL) {
         Alert("Indicator Handling konnte nicht geladen werden.");
         return(INIT_FAILED);  
      }
      return(INIT_SUCCEEDED);
  }

void OnTick()
  {
      CopyBuffer(IndicHandle,0,0,2,test);
      double tmp=test[0];
      Comment("Testvalue: "+tmp);
      if (tmp>0.0) {
         Alert("Here we go" + tmp);
      }
  }

Hat ggf. jemand eine Idee woran das liegen könnte?

Lieben Dank für hilfreiche Antworten.

 

Du machst das auch nicht richtig

das handle und das ArraySetAsseries musst du in die on init reingeben


setindexbuffer brauchst du im ea nicht, weil das hat er ja im indicator. Das sind im indy die buffer


in die ontick schreibst du dann den copybuffer rein, hier für jeden buffer einen eigenen copybuffer

den buffer musst du im algemeinen teil mit


double xx[]; definieren, das hast du ja bemacht


#property indicatorbuffer brauchst du nicht, das ist nur im indi notwendig, nicht im ea

 

Danke für Deine Antwort - allerdings schein ich nicht eindeutig gewesen zu sein:

Die ersten beiden Codesnippets sind vom Indikator, nur der letzte Teil ist der Advisor.


Was Deine übrigen Anregungen angeht: Das hat's schon mal deutlich schneller gemacht, der Buffer übermittelt trotzdem noch kein Signal.. :(

 
Hugo1404:

Danke für Deine Antwort - allerdings schein ich nicht eindeutig gewesen zu sein:

Die ersten beiden Codesnippets sind vom Indikator, nur der letzte Teil ist der Advisor.


Was Deine übrigen Anregungen angeht: Das hat's schon mal deutlich schneller gemacht, der Buffer übermittelt trotzdem noch kein Signal.. :(

Dann poste mal deinen ea, dann kann man das ansehen

 Btw, wieviele buffer hat der indicator? Was zweigt dieser im datenfenster an?
 
amando:

Dann poste mal deinen ea, dann kann man das ansehen

 Btw, wieviele buffer hat der indicator? Was zweigt dieser im datenfenster an?

Ich habe den kompletten EA gerade oben gepostet - er macht im Grunde noch nichts, außer den Buffer abfragen und eben das funktioniert nicht. ^^

Der Indikator hat einen Buffer (#property indicator_buffers 1), er zeigt auch nichts im Datenfenster an. Er generiert nur ein Signal und stellt dieses optisch dar (Pfeil) und gibt es auch im Comment aus.

Das wird auch so in den Buffer geschrieben -> 0.0 = kein Signal, 1.0 = Buy, 2.0 = Sell.

Codesnippet Indicator (OnCalculate):

//buy signal
if (signal=="buy" && lastsignal!=1) {
        if (InpShowSignals==true) {
		ObjectCreate(_Symbol,IntegerToString(Bars(Symbol(),Period())),OBJ_ARROW_BUY,0,TimeCurrent(),(PInfo[1].low));
	}
        lastsignal=1;
        if (InpShowAlerts==true) {
		Alert("BUY Signal (" + TimeCurrent() + ")");
        }
        ExtIndiBuffer[0]=1.0;
}
//sell signal
if (signal=="sell" && lastsignal!=2) {
	if (InpShowSignals==true) {
		ObjectCreate(_Symbol,IntegerToString(Bars(Symbol(),Period())),OBJ_ARROW_SELL,0,TimeCurrent(),(PInfo[1].high));
	}
        lastsignal=2;
        if (InpShowAlerts==true) {
		Alert("Sell Signal (" + TimeCurrent() + ")");
        }
	ExtIndiBuffer[0]=2.0;
}
//kein signal
if (signal=="---") {
	ExtIndiBuffer[0]=0.0;
}
 
iCustom() - Der Indikatorname benötigt das '.ex5' nicht, das Handle wird nicht auf Gültigkeit überprüft.
 

Danke Otto, hab's abgeändert! Ändert aber nichts daran, dass der Buffer keine Signale übermittelt.


Die Variable wirft den Wert 10 aus, sollte passen und damit gültig sein. 

 

Ich vermute das Problem liegt in Deinem Indikator!

Mach dort einmal

Comment("t[0] ",time[0],"  t[",rates_total-1,"] ",time[rates_total-1]);
Und dann experimentiere ein bisschen mit ArraySetAsserie()
 
Hugo1404:

Danke Otto, hab's abgeändert! Ändert aber nichts daran, dass der Buffer keine Signale übermittelt.


Die Variable wirft den Wert 10 aus, sollte passen und damit gültig sein. 

Ja, 10 ist ein gültiger Wert. -1 steht für WRONG_VALUE

Was sagt das Data-Window über deine Indikatorwerte? Wenn dort die richtigen Werte erscheinen ist das Problem beim EA.

 
Carl Schreiber:

Ich vermute das Problem liegt in Deinem Indikator!

Mach dort einmal

Und dann experimentiere ein bisschen mit ArraySetAsserie()

1000 Dank! Ich verstehe zwar nicht warum, aber wenn ich den Buffer direkt im Indikator sortiere, funktioniert es...

Grund der Beschwerde: