Wie importiere ich Bid/Ask aus einem anderen Währungspaar? - Seite 5

 
HosseinKOGO:

Das ist der ganze Tag GBPAUD H4 3.12.2018! Und ich habe dieses Mal nicht bis zum Ende übersprungen.

Kann es sein, dass die Druckfunktion einige Berichte verliert, wenn sie zu viel zu drucken hat?
Ich vermute, ein weiteres Problem könnte sein, dass die Ticks dieser 3 Instrumente in unterschiedlichen Millisekunden herauskommen, so dass, wenn wir die Funktion start/OnTick auf GBPAUD verwenden, sie nur die Startfunktion ausführt, wenn der GBPAUD-Tick herauskommt. Und ich vermute, Ihr Code könnte sagen, dass alle diese 3 Paare Preise zurückgeben, wenn keiner von ihnen sind 0. Wenn ja, es wird zurückgegeben, wenn alle ask / bid Preise aller Instrumente kommen zur gleichen Zeit genau.

Die Daten sehen gut aus...

Du hast Recht mit der Druckfunktion... Ich sehe bei meinen Tests auch viele fehlende Zeilen. Aber wenn ich alles in eine Datei drucke, wird nichts ausgelassen.

Hier sind einige Informationen über den Code: die Zeit jedes GBPAUD-Ticks wird verwendet, um die neuesten Ticks der anderen Paare zu erhalten (bis zur gleichen Zeit), so dass es immer etwas zurückgeben wird, wird nicht Null sein.

Ich habe mich entschlossen, die Funktion in eine Klasse zu packen, was aufgeräumter sein sollte. Siehe Anhang. Legen Sie sie in Ihren Expertenordner, zusammen mit Ihrem EA. Sie können sie gerne modifizieren.

Das folgende Beispiel zeigt Ihnen eine Möglichkeit, die Funktion zu nutzen (die hervorgehobenen Zeilen sind wichtig):

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = {"GBPUSD","EURUSD"};
string allPairs[] = {};

int tickCount = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
      allPairs[i] = otherPairs[i-1];
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile(string sym, MqlTick &tick)
{
   int file = FileOpen("LogFile.log",FILE_WRITE|FILE_READ|FILE_TXT);
   FileSeek(file,0,SEEK_END);
   FileWrite(file, sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
   FileClose(file);
}

void printTick(string sym, MqlTick &tick)
{
   Print (sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
}

Der Schlüssel ist also eigentlich nur diese Zeile:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Wenn sie false zurückgibt, müssen Sie im Journal nach der Fehlermeldung suchen.

Dateien:
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

Die Daten sehen gut aus...

Du hast Recht mit der Druckfunktion... Ich sehe bei meinen Tests auch viele fehlende Zeilen. Aber wenn ich alles in eine Datei drucke, wird nichts ausgelassen.

Hier sind einige Informationen über den Code: die Zeit jedes GBPAUD-Ticks wird verwendet, um die neuesten Ticks der anderen Paare zu erhalten (bis zur gleichen Zeit), so dass es immer etwas zurückgeben wird, wird nicht Null sein.

Ich habe mich entschlossen, die Funktion in eine Klasse zu packen, was aufgeräumter sein sollte. Siehe Anhang. Legen Sie sie in Ihren Expertenordner, zusammen mit Ihrem EA. Sie können sie gerne modifizieren.

Das folgende Beispiel zeigt Ihnen eine Möglichkeit, die Funktion zu nutzen (die hervorgehobenen Zeilen sind wichtig):

Der Schlüssel ist also eigentlich nur diese Zeile:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Wenn sie false zurückgibt, müssen Sie im Journal nach der Fehlermeldung suchen.

Ich danke Ihnen für Ihre Hilfe,

Ich habe alle diese Zeilen in die entsprechenden Bereiche kopiert. Aber da ich den Code nicht verstehe, raten Sie mir bitte, wie ich den Ask und Bid von SecondPair in Ask2,Bid2 und das gleiche für ThirdPair einfügen kann.
Hier ist mein globaler Bereich:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0;
.
.
.

Und dieser Teil gibt beim Kompilieren 2 Fehler zurück. Was soll ich mit ihnen machen?
'SecondPair' - konstanter Ausdruck erforderlich MyEA!.mq4
ThirdPair" - konstanter Ausdruck erforderlich MyEA!.mq4

 
HosseinKOGO:

Vielen Dank für Ihre Hilfe,

Ich habe alle diese Zeilen in die entsprechenden Bereiche kopiert. Aber da ich den Code nicht verstehe, bitte ich um einen Rat, wie ich den Ask und Bid von SecondPair in Ask2, Bid2 und das gleiche für ThirdPair einfügen kann.
Hier ist mein globaler Bereich:

Und dieser Teil gibt beim Kompilieren 2 Fehler zurück. Was soll ich mit ihnen machen?
'SecondPair' - konstanter Ausdruck erforderlich MyEA!.mq4
ThirdPair" - konstanter Ausdruck erforderlich MyEA!.mq4

Dann deklarieren Sie Ihre otherPairs auf die gleiche Weise wie allPairs. Und in OnInit, tun Sie dies:

ArrayResize(otherPairs,2);
otherPairs[0] = SecondPair;
otherPairs[1] = ThirdPair;

Und um Werte in Ask2, Bid2, Ask3, Bid3 zuzuweisen, tun Sie dies in OnTick:

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");
 
Seng Joo Thio:

Dann deklarieren Sie Ihre otherPairs auf die gleiche Weise wie allPairs. Und in OnInit, tun Sie dies:

Und um Werte in Ask2, Bid2, Ask3, Bid3 zuzuweisen, tun Sie dies in OnTick:

Es gibt mir wieder 00 :(
Mein globaler Bereich:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
   allPairs[i] = otherPairs[i-1];
   
   ArrayResize(otherPairs,2);
   otherPairs[0] = SecondPair;
   otherPairs[1] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);

OnTick:

   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");

Journal:
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPCAD Fehler
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPUSD Fehler
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPAUD Tick-Nummer 221179, um 2018.01.03 23:36:58 000 Ask = 1.72479 Bid = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: === Verarbeite jetzt Tick 221179



Wo liege ich falsch?
Es tut mir leid für meine nullkommanullen Fähigkeiten :D

 
HosseinKOGO:

Es gibt mir wieder 00 :(
Mein globaler Bereich:

OnInit:

OnDeinit:

OnTick:

Wo liege ich falsch?
Tut mir leid, dass ich keine Ahnung habe :D

OnInit - die 3 neuen Zeilen sollten vor allem gehen.
 
HosseinKOGO:

Es tut mir leid, dass meine Kenntnisse gleich null sind :D

Es geht um Variablen und Funktionen und um die Bereitschaft zu experimentieren.
 
Seng Joo Thio:
OnInit - die 3 neuen Zeilen sollten vor allem kommen.

Ich habe es getan. Aber es ist sehr seltsam: der Timer für diese zwei zusätzlichen Paare funktioniert nicht...

2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPCAD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPUSD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPAUD tick number 370711, at 2018.01.05 11:11:24 000 Ask = 1.72644 Bid = 1.72624
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO:

Ich habe es getan. Aber es ist sehr seltsam: der Timer für diese zwei zusätzlichen Paare funktioniert nicht...

Zeigen Sie mir die ganze ea, nachdem Sie mit dem Experimentieren fertig sind und immer noch nicht herausfinden können, warum. Ich kann in etwa 8 Stunden einen Blick darauf werfen :). Jetzt muss ich 😴... 😂
 
  1. Seng Joo Thio: OnInit - die 3 neuen Zeilen sollten vor allem kommen.
    Versuchen Sie nicht, irgendwelche preis- oder serverbezogenen Funktionen in OnInit (oder beim Laden) zu verwenden, da möglicherweise noch keine Verbindung/kein Chart vorhanden ist:
    1. Terminal startet.
    2. Indikatoren/EAs werden geladen. Statische und global deklarierte Variablen werden initialisiert. (Hängt nicht von einer bestimmten Reihenfolge ab.)
    3. OnInit wird aufgerufen.
    4. Bei Indikatoren wird OnCalculate mit einer eventuell vorhandenen Historie aufgerufen.
    5. Der Mensch muss eventuell ein Passwort eingeben, die Verbindung zum Server beginnt.
    6. Neue Historie wird empfangen, OnCalculate wird erneut aufgerufen.
    7. Neuer Tick wird empfangen, OnCalculate/OnTick wird aufgerufen, jetzt sind TickValue, TimeCurrent, Kontoinformationen und Preise gültig.

  2. Auf MT4: Wenn der aktuelle Chart nicht auf dieses spezifische Paar/TF referenziert ist, müssen Sie 4066/4073 Fehler behandeln, bevor Sie auf Preise zugreifen.
    Download-Geschichte in MQL4 EA - MQL4 und MetaTrader 4 - MQL4 Programmierforum
    Korrigiert

    Die Funktion, auf die verwiesen wird, öffnet ein verstecktes Diagramm für das betreffende Symbol/TF (falls nicht bereits geöffnet), wodurch die Historie aktualisiert wird und das Symbol vorübergehend auf Market Watch gesetzt wird (falls nicht bereits dort), damit SymbolInfoDouble(Symbol, SYMBOL_BID ) oder MarketInfo(Symbol, MODE_BID ) beim ersten Aufruf nicht auch Null zurückgeben.

 
William Roeder:
  1. Versuchen Sie nicht, irgendwelche preis- oder serverbezogenen Funktionen in OnInit (oder beim Laden) zu verwenden, da möglicherweise noch keine Verbindung/kein Chart vorhanden ist:
    1. Terminal startet.
    2. Indikatoren/EAs werden geladen. Statische und global deklarierte Variablen werden initialisiert. (Hängt nicht von einer bestimmten Reihenfolge ab.)
    3. OnInit wird aufgerufen.
    4. Bei Indikatoren wird OnCalculate mit einer eventuell vorhandenen Historie aufgerufen.
    5. Der Mensch muss eventuell ein Passwort eingeben, die Verbindung zum Server beginnt.
    6. Neue Historie wird empfangen, OnCalculate wird erneut aufgerufen.
    7. Neuer Tick wird empfangen, OnCalculate/OnTick wird aufgerufen. Jetzt sind TickValue, TimeCurrent, Kontoinformationen und Preise gültig.

  2. Auf MT4: Wenn der aktuelle Chart nicht auf dieses spezifische Paar/TF referenziert ist, müssen Sie 4066/4073 Fehler behandeln, bevor Sie auf Preise zugreifen.
    Download-Geschichte in MQL4 EA - MQL4 und MetaTrader 4 - MQL4 Programmierforum
    Korrigiert

    Die Funktion, auf die verwiesen wird, öffnet ein verborgenes Diagramm für das betreffende Symbol/TF (falls nicht bereits geöffnet), wodurch die Historie aktualisiert wird und das Symbol vorübergehend auf Market Watch gesetzt wird (falls nicht bereits vorhanden), damit SymbolInfoDouble(Symbol, SYMBOL_BID ) oder MarketInfo(Symbol, MODE_BID ) beim ersten Aufruf nicht ebenfalls Null zurückgeben.

Sie haben Recht. Aber keine Sorge, denn das Einzige, was wir hier in OnInit tun, ist die Initialisierung von Arrays zum Speichern von Symbolnamen und die Vorbereitung einiger Dateihandles zum Lesen unserer eigenen Datendateien. Auf die Geld- und Briefkurse (d.h. "Tick"-Daten) greifen wir nur in OnTick zu, und zwar meist aus unseren eigenen Datendateien, da der MT4-Strategietester immer Nullen zurückgibt, wenn er solche Daten von anderen Symbolen abfragt (beachten Sie, dass sich dieses Verhalten von der Abfrage von OHLC-Daten unterscheidet, mit denen man besser vertraut ist).

Grund der Beschwerde: