Mein Ansatz. Der Kern ist der Motor. - Seite 92

 
Maxim Kuznetsov:

Die einzigen und einzigen GlobalVariablen und Dateien für den Datenaustausch zwischen EAs, Indikatoren und Skripten sind

Alle 4 oben genannten Punkte sind lokale "Hacks" in Ermangelung von Fisch. Alle 4 oben genannten Punkte verwenden Mechanismen, die nicht für den Austausch beliebiger Daten, geschweige denn von Datenfeldern, ausgelegt sind.

Man könnte meinen, dass GlobalVariables speziell für das Messaging entwickelt wurde. Das ist eine dumme Behauptung. Im Grunde ist es derselbe Hack wie bei jedem anderen Artikel.

 
fxsaber:


...Grob gesagt,läuft ein vollständiger Schreib-/Lese-Tick-Zyklus durch eine Ressource mit einer Rate von 4 Millionen Ticks pro Sekunde.

Das Lesen/Schreiben der Ressource ist sehr schnell. Aber inwieweit ist dies für eine solche Übertragung geeignet:

1. Zeile A. Timer-Ereignis. Sammeln Sie alle Parameterwerte, die während des Ereignisses geändert wurden, und übersetzen Sie sie in eine Zeichenkette. String in Char übersetzen, in Ressource schreiben. Nachricht an B-Seite senden.

2. Partei B. OnChartEvent()-Ereignis, empfängt ein Nachrichtensignal, öffnet die Ressource, liest sie, füllt den Parameterkern mit neuen Werten und zeichnet die erforderlichen Elemente neu.

Was ist, wenn dieses Ereignis kontinuierlich mit der Frequenz des Timers ausgeführt wird?

Es stellt sich die Frage, wie die Ressourcen dafür am besten eingesetzt werden können und ob es andere Möglichkeiten gibt.

//---------------------------------------------------------------------------------------------------------------------

  • Die Option EventChartCustom() hat zwei Nachteile.

  1. Das Paket wird in die Ereigniswarteschlange aufgenommen.
  2. Das Paket darf nicht mehr als 127 Zeichen lang sein. Folglich muss eine Nachricht mit 1000 Zeichen aufgeteilt und dann wieder zusammengesetzt werden. Und jeder Teil der Nachricht wird in der Ereigniswarteschlange stehen.
  • Bei der Variante, bei der Graphobjekte durchlaufen werden, muss die Nachricht in 64-Zeichen-Bündel aufgeteilt, in Objektbeschreibungen geschrieben und dann wieder zusammengesetzt werden. Interessant ist, dass diese Variante die schnellste ist, aber mit zunehmender Länge der Zeichenkette nimmt die Geschwindigkeit ab. Das heißt, jeder Aufruf von ObjectSetString() dauert 3 Mikrosekunden. Aber wenn eine Zeichenkette 1000 Zeichen lang ist, müssen wir sie in 64 Zeichen aufteilen, was bedeutet, dass wir ObjectSetString() etwa 8 Mal aufrufen müssen. 8*3 = 24 ms. Dann dauert es genauso lange, die Schnur zu montieren. Wenn die Zeichenkette 10 000 Zeichen lang wäre, würde diese Methode definitiv die Geschwindigkeit der Methode erreichen, die über Ressourcen arbeitet. (Ich spreche von der Zeit, die für das Speichern und Lesen der Ressource benötigt wird, sowie von der Zeit, die für die Übertragung von Zeichenketten nach uint und zurück benötigt wird).
Die Ressourcenvariante bleibt bis zum Schluss ungeprüft. Ich werde es heute im Testgerät ausprobieren und dann wird endgültig klar sein, ob es universell einsetzbar ist.
 
Реter Konow:

Was ist, wenn dieses Ereignis kontinuierlich mit der Frequenz des Zeitgebers ausgeführt wird?

Die Frage ist, wie die Ressourcen dafür am besten eingesetzt werden können und ob es andere Möglichkeiten gibt.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Datenaustausch zwischen Programmen

fxsaber, 2018.11.21 13:12

Wahrscheinlich haben Sie viel Zeit, um die verschiedenen Optionen für Interaktionen so detailliert zu beschreiben. Leider verfüge ich nicht über eine solche Ressource.

Hier ist ein Artikel zu diesem Thema, in dem es um eine umfassende Interaktion geht. Jedes Gebäude wird aus Bausteinen und für bestimmte Aufgaben gebaut. Alle möglichen Bausteine sind am Anfang des Threads aufgeführt. Der Rest ist Sache des Bauherrn.

 
fxsaber:

Der Artikel testet nicht die Kommunikation zweier Programme über Ressourcen, von denen sich eine im Prüfgerät befindet.

 

Was ist das Problem mit der Gewerkschaft? Bitte, ein Beispiel:

union UZ{
   double d;
   int i[2];
};

void OnStart(){

   UZ u1;
   UZ u2;
   
   u1.d=12345.678;
   
   ArrayCopy(u2.i,u1.i);
   
   Alert(u2.d);

}
 
Реter Konow:

Der Artikel testet nicht die Kommunikation zweier Programme über Ressourcen, von denen sich eine im Prüfgerät befindet.

Lesen Sie den Satz über Ziegelsteine.

 
fxsaber:

...

Dieser Artikel schießt mit einer Kanone auf Spatzen. Wie viele Artikel. Ich würde das Problem lieber selbst lösen, als den Artikel zu verstehen.

Alles kann 10-mal einfacher und klarer gemacht werden. Aber der Artikel ist sehr viel einfacher...


Und was nützt der Artikel, wenn Sie sagen, dass Sie die Funktionsweise der Ressourcen im Prüfgerät nicht überprüft haben?

 
Реter Konow:

Und was nützt dieser Artikel, wenn Sie sagen, dass Sie die Ressourcenoperation im Tester nicht überprüft haben?

Ich bin aus der Diskussion ausgestiegen.

 

An dieser Lösung ist etwas faul. Vielleicht mache ich etwas falsch.

Um es kurz zu machen:

Die Funktion StringToCharArray() nimmt NUR ein Array von Zeichen entgegen.

Die Funktion ResourceCreate() akzeptiert NUR ein uint-Array.

Daher muss der Inhalt des char-Arrays (gefüllt mit der konvertierten Zeichenfolge) in das uint-Array umgeschrieben werden.

 
//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //----------------------------------------------
   ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   uchar Arr[];
   uint  Data[];
   //---------------------------
   string price = (string)Bid;
   //---------------------------
   int width = StringToCharArray(price,Arr);
   //---------------------------
   ArrayResize(Data,width);
   //---------------------------
   ArrayCopy(Arr,Data);
   //---------------------------
   if(!ResourceCreate("::Resource",Data,width,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //---------------------------
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+

Indikator in einem normalen Diagramm:

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(25); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   uint Data[50],width,height;
   //-----------------------------
   if(!ResourceReadImage("::Resource",Data,width,height))Print("Failed to read resource!");
   else Print("Resource is readable!");
   //-----------------------------
   
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: