Kommunikation zwischen EAs und Indis und Panelen

 

Hallo Community,

des öfteren ist schon die Frage gestellt worden wie EAs und Indikatoren Daten austauschen können.

Auch eine Steuerung mittels Panelen=Dialogen (irrwitzigerweise mit Platten ins deutsche übersetzt) wäre oft hilfreich.

Die 'Globalen Variablen', Dateien, 'Named Pipes' etc. bieten sich an.

Doch es gibt eine einfache und sehr schnelle Möglichkeit, die ich durch intensives Studium der EasyAndFastGUI-Library gefunden habe.

Diese möchte ich euch nicht vorenthalten. Hier ein simples Beispiel zweier Indikatoren. Einer sendet, der ander empfängt.

Der Sender: sendet alle 10sec einen ChartEvent

#property indicator_chart_window
#property indicator_plots 0

#define ON_DATACHANGE 100

int OnInit()
{
   EventSetTimer(10);
   return(INIT_SUCCEEDED);
}

void OnTimer()
{
   EventChartCustom(0,ON_DATACHANGE,1,0,"Message from Sender");
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double& price[]) 
{
   return(rates_total);
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CUSTOM+ON_DATACHANGE)
      if(lparam==1)
         return;  // It's me, do not process;
}

Der Lauscher:

#property indicator_chart_window
#property indicator_plots 0

#define ON_DATACHANGE 100

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double& price[]) 
{
   return(rates_total);
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   if(id==CHARTEVENT_CUSTOM+ON_DATACHANGE)
      if(lparam==1)
         Alert(sparam);
}

wenn's gefällt und jemand brauchen kann, freue ich mich über einen Daumen hinauf, aber das geht ja hier nicht.

Grüße Otto

 
Otto Pauser:

...

wenn's gefällt und jemand brauchen kann, freue ich mich über einen Daumen hinauf, aber das geht ja hier nicht.

Grüße Otto


👍👍👍

 
Oh, Danke für gleich drei Daumen!!!
 

Otto Pauser:

wenn's gefällt und jemand brauchen kann, freue ich mich über einen Daumen hinauf, aber das geht ja hier nicht.

Grüße Otto

👍👍👍

 

Otto ..heirate mich :-)

👍👍👍👍👍👍👍👍 ..na noch einer 👍

 
Christian:

Otto ..heirate mich :-)

👍👍👍👍👍👍👍👍 ..na noch einer 👍

????? Danke, lieber nicht!
 

:-) ...


Wie sieht es denn mit ner "payload" aus Otto ?


Möglich Daten mitzusenden oder ist nur ein Signal möglich ?

Gruß 

 
Christian:

:-) ...


Wie sieht es denn mit ner "payload" aus Otto ?


Möglich Daten mitzusenden oder ist nur ein Signal möglich ?

Gruß 

Muss ich mir überlegen. Mit sParam könnt was gehen. Welche Daten willst du übertragen?

In der Zwischenzeit ein Powertool von mir. Ähnlich wie der Windows Spy, überwacht die Messages.

Wollte ich eigentlich in der Codebase veröffentlichen, aber dieses ganze Brimborium dort ist mir zu blöd.

LG Otto

Falls es Probleme beim entpacken gibt, die Datei auf Spy.rar umbenennen. (*.rar und *.ico darf man ja nicht als datei anhängen, warum auch immer).

 
Otto Pauser:

Muss ich mir überlegen. Mit sParam könnt was gehen. Welche Daten willst du übertragen?


Für mich wäre interessant eine komplette MqlTick Struktur an einen Empfänger zu senden.

Meinetwegen auch in einen chararray fester Länge gewandelt.

MqlTick -> char[256] -> MqlTick(FromOtherChart)

  

Ich nutze ja eine API die eben nur auf einem Chart läuft und auch Sinn macht.

Ist sicher auch für andere interessant

Gruß

 
Christian:

Für mich wäre interessant eine komplette MqlTick Struktur an einen Empfänger zu senden.

Meinetwegen auch in einen chararray fester Länge gewandelt.

MqlTick -> char[256] -> MqlTick(FromOtherChart)

Ich nutze ja eine API die eben nur auf einem Chart läuft und auch Sinn macht.

Ist sicher auch für andere interessant

Gruß

Leider sind gewisse Tricks wie in Delphi oder C++ nicht möglich. zB die Adressen von Variablen übereinander zu legen und Strukturen wie Schablonen zu verwenden.

Auch mit Pointern überprüft der Compiler zu genau.

Es geht nicht Struktur A an der gleichen Adresse wie Struktur B bzw einen String zu definieren (in Delphi/Pascal: records mit dem Statement 'Absolute').

Das chararray ist eine Möglichkeit.

Oder die einzelnen Werte in Strings umwandeln und mit StringConcatenate verbinden, beim Empfänger wieder aufdröseln. Ist wahrscheinlich relativ langsam und eher mühsam.

Wenn du nicht alle Felder von MqlTick brauchst, die EventRoutine mehrfach aufrufen und Werte in lparam und dparam und/oder in sparam übergeben.

Oder dem anderen Programm nur den Hinweis liefern, das im Chart(Symbol) XY ein neuer Tick eingetroffen ist, und es diesen gefälligst selber mit CopyTick(_Symbol,...) lesen soll. _Symbol wird in sparam übermittelt.

Oder bei ssd-Platte via FileWriteStruct / FileReadStruct und mittels Message nur der Anstoß, neue Daten sind da. File lesen.

Du siehst, es gibt schon einige Möglichkeiten.

LG, Otto

 

Es gibt doch für MT4/5 eine ganze Reihe von Möglichkeiten:

  1. Mutex: https://www.mql5.com/de/code/1835
  2. MemMaps: https://www.mql5.com/de/code/816 und https://www.mql5.com/de/code/817
  3. Pipes und Sockets und
  4. Ram-Disks mit den File-Func. aus kernel32 (sind schneller als die von (zumindest) MT4.
Ausprobiert habe ich die aber noch nicht!
Mutex - WinAPI
Mutex - WinAPI
  • Stimmen: 40
  • 2016.06.27
  • ---
  • www.mql5.com
Globale Variablen, Festplatte oder im Speicher abgelegte Dateien (memory-mapped files), wichtige operative Verfahren sind jetzt kein Problem mehr! Wenn Sie verwenden: Zugriff auf die selben Daten von verschiedenen Experten arbeiten mit anderen Anwendungen aus MQL mit gemeinsamen Daten Ihr Kopierer arbeitet mit verschiedenen MT4-MT4 / MT4-MT5...
Grund der Beschwerde: