Überführung von Werten von OnCalculate zu OnTick - Seite 2

 
al_ben:

Wie bekomme ich den aktuellen "ExtHBuffer[i-2]" Wert von OnCalculate in OnTick?

Da gibt es einen Artikel "Leitfaden zur Verwendung technischer Indikatoren in Expert Advisors", dort ist es recht einfach erklärt.

Weiß jetzt nicht ob der Heiken Ashi ein Custom Indicator ist, dann würde ich vorschlagen schau mal in der Doku wie man iCustom verwendet.

Wenn es für Deinen Kenntnisstand momentan noch zu kompliziert ist, hast Du schonmal dran gedacht, erstmal einen EA auf der Basis von MA oder RSI zu bauen?

Grüße
 
pennyhunter #:
Da gibt es einen Artikel "Leitfaden zur Verwendung technischer Indikatoren in Expert Advisors", dort ist es recht einfach erklärt.

Weiß jetzt nicht ob der Heiken Ashi ein Custom Indicator ist, dann würde ich vorschlagen schau mal in der Doku wie man iCustom verwendet.

Wenn es für Deinen Kenntnisstand momentan noch zu kompliziert ist, hast Du schonmal dran gedacht, erstmal einen EA auf der Basis von MA oder RSI zu bauen?

Grüße

Hi Pennyhunter,

zunächst herzlichen Dank für die erste konstruktive Antwort in diesem Thread :-)

Einen funktionierenden EA auf Basis eines normalen EA's habe ich bereits. Heißt, ich versuche lediglich, den iMA durch HeikenAshi-Werte zu ersetzen.

Mit der iCustom Funktion habe ich gestern auch rumprobiert und mit einem Code-Schnipsel auch erste Erfolge gehabt. Wenn ich das als Skript ausführe, werden die gewünschten Werte (OHLC + letzte Candle Colour) geprintet:


void OnStart()
  {

   
   double HA_CloseData[], HA_OpenData[], HA_LowData[], HA_HighData[], HA_Colour[];
  
   ArraySetAsSeries(HA_CloseData,true); 
   ArraySetAsSeries(HA_OpenData,true);
   ArraySetAsSeries(HA_LowData,true);
   ArraySetAsSeries(HA_HighData,true);
   ArraySetAsSeries(HA_Colour,true);
   double HA_CloseControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 0, 0 ); 
   double HA_OpenControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 1, 0 );
   double HA_LowControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 2, 0 );
   double HA_HighControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 3, 0 );
   double HA_ColourControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 4, 0 );
  
   double numberOfHA_OpenData = CopyBuffer(HA_OpenControlPanel, 0, 0, 3, HA_OpenData);
   double numberOfHA_HighData = CopyBuffer(HA_HighControlPanel, 1, 0, 3, HA_HighData);
   double numberOfHA_LowData = CopyBuffer(HA_LowControlPanel, 2, 0, 3, HA_LowData);
   double numberOfHA_CloseData = CopyBuffer(HA_CloseControlPanel, 3, 0, 3, HA_CloseData);
   double numberOfHA_Colour = CopyBuffer(HA_ColourControlPanel, 4, 0, 3, HA_Colour);
   
   // Output for testing:

   Print("The Heiken Ashi open Price of the 2nd current candle is " + (string)HA_OpenData[1] + "."); 
   Print("The Heiken Ashi high Price of the 2nd current candle is " + (string)HA_HighData[1] + ".");  
   Print("The Heiken Ashi low Price of the 2nd current candle is " + (string)HA_LowData[1] + "."); 
   Print("The Heiken Ashi close Price of the 2nd current candle is " + (string)HA_CloseData[1] + "."); 
   Print("The Heiken Ashi candle colour of the 2nd current candle is " + (string)HA_Colour[1] + ", whereas 0.0 represents blue, 1.0 red."); 
  }
//+------------------------------------------------------------------+

Wenn ich diesen Code nun in meinen (mit iMA-funktionierenden) EA einsetze, wird der Array für die Heiken Ashi Werte nicht richtig aus dem Buffer befüllt. Ich habe zu Versuchszwecken mal das ganze Order-Gedöns auskommentiert und in die OnTick Stelle den letzten HA-Low Wert ausgeben lassen und als Skript gestartet. In der Ausgabe wird mein Wert bei jedem Tick mit 0.0 ausgegeben und nicht mit dem korrekten Low-Wert der letzten Kerze. Hast du eine Idee was bei dem Übertrag schief geht? Ich meine das Konzept zwischen OnCalculate aus einem Indikator und dem OnTick Verhalten eines EA's mittlerweile verstanden zu haben :-) 


#include <Trade\Trade.mqh>

// --- Input variables
input double   lot = 100;
input int      slippage = 1;
input bool     useStopLoss = false;
input double   stopLossPips = 30;
input bool     useTakeProfit = false;
input double   takeProfitPips = 60;

//--- Service Variables

CTrade myTradingControlPanel;
double HA_LowControlPanel, HA_HighControlPanel, HA_CloseControlPanel, HA_OpenControlPanel,HA_ColourControlPanel;
int P;
double currentBid, currentAsk;
double stopLossPipsFinal, takeProfitPipsFinal, stopLevelPips;
double stopLossLevel, takeProfitLevel;
double HA_Low, HA_High, HA_Colour;
// from GetIndicatorData_HA
double HA_CloseData[], HA_OpenData[], HA_LowData[], HA_HighData[], HA_ColourData[];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   // from GetIndicatorData_HA
   ArraySetAsSeries(HA_CloseData,true); 
   ArraySetAsSeries(HA_OpenData,true);
   ArraySetAsSeries(HA_LowData,true);
   ArraySetAsSeries(HA_HighData,true);
   ArraySetAsSeries(HA_ColourData,true);
      
   // Getting the Control Panel/Handle for short SMA
   double HA_CloseControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 0, 0 );
   double HA_OpenControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 1, 0 );
   double HA_LowControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 2, 0 );
   double HA_HighControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 3, 0 );
   double HA_ColourControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 4, 0 );
   
   if(_Digits == 5 || _Digits == 3 || _Digits == 1) P = 10;else P = 1; // To account for 5 digit brokers
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(HA_CloseControlPanel);
   IndicatorRelease(HA_OpenControlPanel);
   IndicatorRelease(HA_LowControlPanel);
   IndicatorRelease(HA_HighControlPanel);
   IndicatorRelease(HA_ColourControlPanel);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // -------------------- Collect most current data --------------------
   
   currentBid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // Get latest Bid Price
   currentAsk = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // Get latest Ask Price
   
   // Collect data from the HA indicator
   double numberOfHA_OpenData = CopyBuffer(HA_OpenControlPanel, 0, 0, 3, HA_OpenData);
   double numberOfHA_HighData = CopyBuffer(HA_HighControlPanel, 1, 0, 3, HA_HighData);
   double numberOfHA_LowData = CopyBuffer(HA_LowControlPanel, 2, 0, 3, HA_LowData);
   double numberOfHA_CloseData = CopyBuffer(HA_CloseControlPanel, 3, 0, 3, HA_CloseData);
   double numberOfHA_ColourData = CopyBuffer(HA_ColourControlPanel, 4, 0, 3, HA_ColourData);
   
   HA_Low = HA_LowData[1];
   HA_High = HA_HighData[1];
   HA_Colour = HA_ColourData[1];
   
   Print("HA_Low = " + (string)HA_Low);
   
   }
 

Was meinst Du denn mit: " Wenn ich diesen Code nun in meinen (mit iMA-funktionierenden) EA einsetze, wird der Array für die Heiken Ashi Werte nicht richtig aus dem Buffer befüllt. "?

Hast Du die Werte Deines EAs auf einem Chart mit denen des Indikators auf demselben Chart verglichen?

Hast Du einfach mal nach Heiken Ashi EA gesucht? Ich finde allein 7 in der CodeBase. Warum alles selber machen, wenn es das doch bereits gibt?

Zumindest kann man dort schauen, wie die das machen.

 
Carl Schreiber #:

Was meinst Du denn mit: " Wenn ich diesen Code nun in meinen (mit iMA-funktionierenden) EA einsetze, wird der Array für die Heiken Ashi Werte nicht richtig aus dem Buffer befüllt. "?

Hast Du die Werte Deines EAs auf einem Chart mit denen des Indikators auf demselben Chart verglichen?

Hast Du einfach mal nach Heiken Ashi EA gesucht? Ich finde allein 7 in der CodeBase. Warum alles selber machen, wenn es das doch bereits gibt?

Zumindest kann man dort schauen, wie die das machen.

Also ich habe mir ein Skript erstellt (siehe erster Code Teil), der sich aus dem Standard Heiken Ashi Indikator von MT5 die Buffer-Werte abholt. Das Skript gibt die Werte der letzten Candle so aus wie gewollt.

Im nächsten Schritt versuche ich, den Inhalt dieses Scripts in meinen EA aufzunehmen. Der originale EA verwendet MA-Werte, ich muss also "nur" diese Teile durch die HA-Informationen austauschen. Man sollte meinen, dass das jetzt kein Ding ist, aber leider wird in dem EA nicht mehr der korrekte Heiken Ashi Wert verwendet, sondern 0.0 --> Ich vermute, dass ich irgendetwas falsch mache beim Zugriff auf den Buffer Wert bzw. bei der Zuweisung der Variable HA_Low? 


Mein Anspruch ist nicht, dass ich jemanden beauftrage oder mir einen fertigen EA kaufe. Ich möchte es gerne selber lernen und dazu muss ich verstehen, was passiert. Wenn ich beim ersten Problem mir einen fertigen Code kaufe, ist der Lerneffekt leider nicht so groß. Das Trading ist für mich nur zu 50% von Bedeutung, da ich versuche ebenfalls andere Programmiersprachen zu lernen. Daneben ist eine Weiterentwicklung des EA's auch schwierig wenn man nicht versteht, wie der funktioniert. 

Aber danke für den Tipp mit der Codebase. Ich schaue mir die EAs mal an, vielleicht fällt dann ja der Groschen :-)

 
Hab die Ursache scheinbar gefunden. Wenn ich den folgenden Teil in den "OnTick" Bereich schiebe und nicht im "OnInit" lasse, werden korrekte Werte berechnet und im OnTick korrekt weiter verarbeitet 
   // Getting the Control Panel/Handle for short SMA
   double HA_CloseControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 0, 0 ); 
   double HA_OpenControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 1, 0 );
   double HA_LowControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 2, 0 );
   double HA_HighControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 3, 0 );
   double HA_ColourControlPanel = iCustom(_Symbol, _Period, "Heiken_Ashi", 4, 0 );


Ist mir zwar nicht ganz klar, weil mit diesem Befehl ja nur der Indikator konfiguriert wird (?) und nicht mit Bufferwerten befüllt wird, oder? Dass der Handle nun bei jedem Tick aufs neue erstellt wird, scheint mir nicht ganz logisch. Wenn mich jemand aufklären kann, wäre das super :-) 

 
al_ben #:
Hab die Ursache scheinbar gefunden. Wenn ich den folgenden Teil in den "OnTick" Bereich schiebe und nicht im "OnInit" lasse, werden korrekte Werte berechnet und im OnTick korrekt weiter verarbeitet 


Ist mir zwar nicht ganz klar, weil mit diesem Befehl ja nur der Indikator konfiguriert wird (?) und nicht mit Bufferwerten befüllt wird, oder? Dass der Handle nun bei jedem Tick aufs neue erstellt wird, scheint mir nicht ganz logisch. Wenn mich jemand aufklären kann, wäre das super :-) 

iCustom in OnTick ist ein Ticket zum Crash. Denn es wird mir jedem Aufruf ein neues Handle erzeugt, bis das Maximum erreicht ist und das Terminal aufgibt.
 
Carl Schreiber #:
iCustom in OnTick ist ein Ticket zum Crash. Denn es wird mir jedem Aufruf ein neues Handle erzeugt, bis das Maximum erreicht ist und das Terminal aufgibt.

Das hab ich bereits vermutet, macht auch keinen Sinn. Das war aber scheinbar auch nicht der Grund. 

Ich hatte den Variablen 

HA_CloseControlPanel etc...

zweimal den Typ double zugewiesen. Nachdem ich im OnInit Bereich den Typ entfernt hatte, ging es :-)

 
al_ben #:

Das hab ich bereits vermutet, macht auch keinen Sinn. Das war aber scheinbar auch nicht der Grund. 

Ich hatte den Variablen 

zweimal den Typ double zugewiesen. Nachdem ich im OnInit Bereich den Typ entfernt hatte, ging es :-)

Die Handles müssten auch int sein. Bin mir nicht sicher ob Du mit double überhaupt etwas angezeigt kriegst, da das Handle eigentlich nicht richtig initialisiert ist, wie Carl übrigens schon sagte. Aber in der OnInit sollten sie schon sein, da es sich um eine einmalige Sache handelt. Es liefe auch in der Tick, aber dann wären es viele unnötige Ausführungen, das hat ja Carl auch schon gesagt.

Aber zeigt er nun etwas an oder nicht? Ich bin etwas verwirrt. So vom Drübergehen müsste nich mehr viel falsch sein... ArraySetAsSeries hast auch true gemacht...

Warum lässt Du Dir die Werte für den vorletzten Balken [1] anzeigen und nicht den letzten [0] ? Ist das Absicht?

Achso, der iCustom. Bis ich das raushatte wie man das mit dem Pfad macht. So wie Du das machst, sucht der die ex5 des HA nur im Ordner des EA, oder? Bei iCustom in der Doku steht drunter noch ein etwas komplizierterer Teil mit "\\" wo Du einen Pfad ausgehend vom Ordner Indicators angeben kannst.
 
al_ben #:
Ich hatte den Variablen 

zweimal den Typ double zugewiesen. Nachdem ich im OnInit Bereich den Typ entfernt hatte, ging es :-)

Das hätte man in weniger als 1 Minute mit dem Debugger herausgefunden:


https://www.mql5.com/de/articles/654 // Zur Fehlerbehebung von MQL5-Programmen (Debugging)

Vielleicht hilft das Dir ja auch:

https://www.mql5.com/de/articles/10&nbsp; // MQL5: Erstellen Ihres eigenen Indikators
https://www.mql5.com/en/forum/296230 // How to start with MQL5: Usefull Hints and lots of code!!

https://www.mql5.com/de/articles/9266 // Tips from a professional programmer (Part  I): Code storing, debugging and compiling. Working with projects and logs
https://www.mql5.com/de/articles/9327 // Tips from a professional programmer (Part II): Storing and exchanging parameters between an Expert Advisor, scripts and external programs

https://www.mql5.com/de/articles/567&nbsp;  Grundlagen der Programmierung in MQL5: Arrays

How to start with MQL5
How to start with MQL5
  • 2018.12.24
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
pennyhunter #:
Die Handles müssten auch int sein. Bin mir nicht sicher ob Du mit double überhaupt etwas angezeigt kriegst, da das Handle eigentlich nicht richtig initialisiert ist, wie Carl übrigens schon sagte. Aber in der OnInit sollten sie schon sein, da es sich um eine einmalige Sache handelt. Es liefe auch in der Tick, aber dann wären es viele unnötige Ausführungen, das hat ja Carl auch schon gesagt.

Aber zeigt er nun etwas an oder nicht? Ich bin etwas verwirrt. So vom Drübergehen müsste nich mehr viel falsch sein... ArraySetAsSeries hast auch true gemacht...

Warum lässt Du Dir die Werte für den vorletzten Balken [1] anzeigen und nicht den letzten [0] ? Ist das Absicht?

Achso, der iCustom. Bis ich das raushatte wie man das mit dem Pfad macht. So wie Du das machst, sucht der die ex5 des HA nur im Ordner des EA, oder? Bei iCustom in der Doku steht drunter noch ein etwas komplizierterer Teil mit "\\" wo Du einen Pfad ausgehend vom Ordner Indicators angeben kannst.

Der Handle funktioniert auch als double, schmeißt dann allerdings ein paar warnings, die dann weg sind wenn man das richtige Datenformat verwendet.

--> Ja, nachdem ich dem Handle nur einmal einen Datentyp zugewiesen hatte, waren die Werte korrekt. Der EA funktioniert so wie gewollt, zumindest mit dem jetzt vorhandenen rudimentären Inhalt.

So wie ich sehe, zeigt der Wert [1] die Daten von der letzten abgeschlossenen Kerze an. [0] zeigt die aktuellen Werte der nicht abgeschlossenen Kerze an, welche für meine Handelsstrategie irrelevant sind. 

So wie ich den Pfad in iCustom angegeben hab, wird der im EA Ordner und dann im Stammverzeichnis der Indikatoren gesucht (da hab ich meinen HA-Indikator abgelegt).

Grund der Beschwerde: