Kommunikation zwischen EAs und Indis und Panelen

Einloggen oder registrieren, um einen Kommentar zu schreiben
Otto Pauser
840
Otto Pauser  

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

Lars Rompe
2020
Lars Rompe  
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 Pauser
840
Otto Pauser  
Oh, Danke für gleich drei Daumen!!!
Joosy
96
Joosy  

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

👍👍👍

Christian
2033
Christian  

Otto ..heirate mich :-)

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

Otto Pauser
840
Otto Pauser  
Christian:

Otto ..heirate mich :-)

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

????? Danke, lieber nicht!
Christian
2033
Christian  

:-) ...


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


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

Gruß 

Otto Pauser
840
Otto Pauser  
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).

Christian
2033
Christian  
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ß

Otto Pauser
840
Otto Pauser  
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

Carl Schreiber
Moderator
6842
Carl Schreiber  

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...
12
Einloggen oder registrieren, um einen Kommentar zu schreiben