MQL5 Mein Indicator liefert zwar die CopyTime Werte aber nicht CopyBuffer im EA

Einloggen oder registrieren, um einen Kommentar zu schreiben
heyday
22
heyday  

Ich habe einen ganz einfachen, meinen ersten EA aufgesetzt, der nichts anders macht als zu prüfen, ob EURUSD Periode M1 geöffnet ist. Ist das der Fall rufe ich die Funktion iCustom auf. Aber der Indicator wird dadurch nicht meinem Chart zugeordnet. Ich vermute, beim Debuggen wird der Indicator irgendeinem Chart zugeordnet, aber nicht meinem. Dieses Problem konnte ich dann noch lösen, aber der Indikator liefert mit CopyBuffer keine Daten aus meinem Indikator. Die Funktion CopyTime liefert mir die richtigen Daten. Letztlich scheint das Problem zu sein, dass der Indikator, den ich über den EA meinem Chart zuordne, nicht arbeitet. Habe natürlich jede Menge Sleep eingebaut, um das Problem einzugrenzen.

Der Indikator selbst arbeitet hervorragend, wenn ich ihn einfach dem Chart zuordne, aber aus dem EA heraus arbeitet er nicht.

Meine Fragen sind:

Wie starte ich einen selbst geschriebenen Indikator und hänge ihn an genau den Chart, für den er geschrieben ist, aus einem EA heraus, so dass ich die Daten, die ich im Indikator berechne, im EA mit CopyBuffer einlesen kann?

Bitte nicht einen Link auf "Wie schreibt man einen Indikator" oder "EA & Indikator" Beispiel. Denn genau da habe ich meine Infos her. Mein Problem ist ja auch nicht der Indikator. Sondern wie starte ich den Indikator aus dem EA.

Hier noch ein Codefragment, das zeigt wie ich den Indikator starte, der dann aber nicht arbeitet. Das mit CopyBuffer habe ich weggelassen, da der Indikator eh nicht arbeitet. (Siehe OnInit() Funktion)

string cSymbolName="EURUSD";
double Lots = 0.3;
ENUM_TIMEFRAMES GNSTimeFrame = PERIOD_M1;
ENUM_TIMEFRAMES GNS15TimeFrame = PERIOD_M15;
ENUM_TIMEFRAMES GNSD1TimeFrame = PERIOD_D1;

// handle für meine Indikatoren
int hGNS;
int hGNS15;
int hGNSD1;

int logfile;    // logfile (debugging)

// es soll immer nur eine Order offen sein, entweder buy oder sell
bool bord=false, sord=false;

datetime zeithD1[500], zeitlD1[500];
int anzhD1, anzlD1;
double highsD1[500], lowsD1[500];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

long BindToChart(ENUM_TIMEFRAMES setPer) {
// immer Candles anzeigen
   ENUM_CHART_MODE cMode = CHART_CANDLES; // CHART_LINE, CHART_BARS
   long chartID, nID;
   string cSymbol;
   int cPer;
   int currM;
   
   Sleep(2000);
   chartID = ChartFirst();
   cSymbol = ChartSymbol(chartID);
   cPer = ChartPeriod(chartID);
   nID = chartID;
   while((cPer != setPer) || (cSymbol != cSymbolName)) {
      nID=ChartNext(chartID); // Get the new chart ID by using the previous chart ID
      if(nID<0) break;
      chartID = nID;
      cSymbol = ChartSymbol(chartID);
      cPer = ChartPeriod(chartID);
   }
   if (nID < 0) {
      // Chart muß geöffnet werden
      chartID = ChartOpen(cSymbolName,setPer);
   }
   ChartBringToTop(chartID);
   // bring chart window to top
   ChartForegroundSet(true,chartID);
   // show Candles
   currM = ChartModeGet(chartID);
   if (currM != cMode) {
      ChartModeSet(cMode,chartID);
   }
   return chartID;
}
bool ChartBringToTop(const long chart_ID=0)
{
   //--- Setzen den Wert des Fehlers zurück
   ResetLastError();
   //--- Zeigt wir den Chart über alle anderen
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
   {
      //--- Schreiben die Fehlermeldung in den Log "Experten"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
   }
   //--- erfolgreiche Ausführung
   return(true);
}

bool ChartForegroundSet(const bool value,const long chart_ID=0)
  {
//--- reset the error value
   ResetLastError();
//--- set property value
   if(!ChartSetInteger(chart_ID,CHART_FOREGROUND,value))
     {
      //--- display the error message in Experts journal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }


ENUM_CHART_MODE ChartModeGet(const long chart_ID=0)
  {
//--- prepare the variable to get the property value
   long result=WRONG_VALUE;
//--- reset the error value
   ResetLastError();
//--- receive the property value
   result = ChartGetInteger(chart_ID,CHART_MODE);
   if(!result)
     {
      //--- display the error message in Experts journal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- return the value of the chart property
   return((ENUM_CHART_MODE)result);
  }
//+------------------------------------------------------------------+
//| Sets chart display type (candlesticks, bars or line)             |
//+------------------------------------------------------------------+
bool ChartModeSet(const long value,const long chart_ID=0)
  {
//--- reset the error value
   ResetLastError();
//--- set property value
   if(!ChartSetInteger(chart_ID,CHART_MODE,value))
     {
      //--- display the error message in Experts journal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }

int OnInit()
  {
   MqlDateTime stm;
   long chartID;
   int timeframe;
   datetime itime[];
   string s;
   
   hGNS = 0;
   hGNS15 = 0;
   hGNSD1 = 0;

   TimeToStruct((datetime)SymbolInfoInteger(cSymbolName,SYMBOL_TIME),stm);

   ResetLastError();
   logfile=FileOpen("log.txt",FILE_WRITE|FILE_TXT|FILE_ANSI);
   timeframe = stm.hour*60+stm.min;
   timeframe += 2880;   
   chartID = BindToChart(PERIOD_M1);
   s = Symbol();
   hGNSD1=iCustom(cSymbolName,PERIOD_M1,"GetNextStopM1\\GetNextStopM1",timeframe);

   if (!ChartIndicatorAdd(chartID,0,hGNSD1)) {
      PrintFormat("Failed to add M1 indicator on main chart window. Error code  %d",GetLastError());
      return -1;
   }


   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if (hGNS != 0) IndicatorRelease(hGNS);
   if (hGNS15 != 0) IndicatorRelease(hGNS15);
   if (hGNSD1 != 0) IndicatorRelease(hGNSD1);
   ResetLastError();
   FileClose(logfile);
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+
Carl Schreiber
Moderator
10134
Carl Schreiber  
Im Editor stell den Kursor auf iCustom und drück F1, dann lies und orientiere Dich am Beispiel unten..
Otto Pauser
2172
Otto Pauser  

Das große Problem sind die mit vollkommen Unnötigem überladenen Beispiele in der Dokumentation.

Ich wollte sowieso eine zynische Anfrage starten, ob Metaquotes dem Ein- oder Umsteiger absichtlich diese Prügel vor die Beine wirft.

Des Pudels Kern wird unter unnötigen, unübersichtlichen Kommentaren versteckt.

Das die OnInit() den Indi/EA initialisiert braucht man doch nicht immer in einem riesigen Kasten wiederholen.

Kurz zu iCustom und CopyBuffer, da gibt es schon gemeine Fallstricke.

1. Die Parameter in iCustom müssen, sofern angegeben, Datentypmässig passen.
    Oft werden beim Indi trennende Leerzeilen (string) angegeben. Die müssen bei iCustom mitberücksichtigt werden, sofern man Parameter hinter diesen setzen will !!!!!

2. In CopyBuffer muss man lt. Reference die Buffernummer anführen.
    Gemeint ist aber der Bufferindex!!!!!!
    Eine Nummer beginnt bei mir mit 1 ein Index  bei 0. Das hat mich viel Zeit gekostet.

    Die Buffer sollten (mit Ausnahmefällen) immer als ArraySetAsSeries(buffer,true) indexiert werden.
    Das genügt 1x in der OnInit, nicht jedesmal in der OnTick.

    Bei Indikatoren hingegen muß in der OnCalculate JEDES mal ArraySetAsSeries(high,true) usw. ausgeführt werden.

Abschließend: es besteht kein großer Unterschied ob man einen integrierten Indi (zB iMA) oder einen eigenen mit iCustom verwendet.

Besonders wichtig bei iCuston: handle auf Gültigkeit prüfen.

string indiname="MySuperIndicator"
handel=iCustom(_Symbol,_Period,indiname)
if(handle==INVALID_HANDLE)
   {
      Alert("*ERROR* creating handle for "+indiname);
      return(INIT_FAILED);
   }

Viel Erfolg, und bleib dran. (der Code den du gepostet hast hat mit einem EA aber nix zu tun ;)

Hier ist trotzdem ein Link den du wahrscheinlich noch nicht kennst, der ist OK https://www.mql5.com/de/articles/496

Schnelleinstieg oder Kurzanleitung für Anfänger
Schnelleinstieg oder Kurzanleitung für Anfänger
  • 2016.01.27
  • Dmitriy Parfenovich
  • www.mql5.com
Liebe Leser, in diesem Artikel möchte ich Ihnen vermitteln und zeigen, wie man sich möglichst schnell und einfach die Grundlagen der Erstellung automatischer Handelssysteme, wie die Arbeit mit Indikatoren u. a., erschließt. Der Beitrag richtet sich an Neueinsteiger, in ihm kommen weder komplizierte noch schwer zu verstehende Beispiele zur...
heyday
22
heyday  

Danke, für die Antwort, das Problem lag jetzt aber darin, dass ich im EA und im indicator folgende Zeile hatte:

   logfile=FileOpen("log.txt",FILE_WRITE|FILE_TXT|FILE_ANSI);

Beim Zweiten Versuch die Datei anzulegen im Indicator, hat er einfach gestoppt. Also nicht versuchen die selbe Datei an zwei Stellen öffnen.

Problem gelöst

amando
2950
amando  
Otto Pauser:

Das große Problem sind die mit vollkommen Unnötigem überladenen Beispiele in der Dokumentation.

Ich wollte sowieso eine zynische Anfrage starten, ob Metaquotes dem Ein- oder Umsteiger absichtlich diese Prügel vor die Beine wirft.

Des Pudels Kern wird unter unnötigen, unübersichtlichen Kommentaren versteckt.

Das die OnInit() den Indi/EA initialisiert braucht man doch nicht immer in einem riesigen Kasten wiederholen.


Du sprichst mir aus der Seele Otto, und die Kommentare von machen Moderatoren sind genauso sinnlos wie die Dokumentation, wenn diese lesbar wäre, dann würden sich viele Fragen gar nicht stellen.

Einloggen oder registrieren, um einen Kommentar zu schreiben