Bibliotheken: TradeTransactions - Seite 2

 
Sergey Chalyshev:

Bisher kann ich mir keine Verwendung für diese Bibliothek vorstellen.

Auf dem Forex wird sie definitiv nicht benötigt, und auch an der Börse besteht kein Bedarf.

Wenn Sie von teilweiser Ausführung sprechen, dann funktioniert sie auf dem Forex in vollem Umfang. Gerade deshalb ist die Asynchronität am Forex sehr gefragt, und deshalb kann diese Bibliothek nützlich sein.

Haben Sie diese Bibliothek an der Börse getestet?

Ich habe sie nicht an der Börse getestet, aber Börse und Forex sind für die Bibliothek technisch dasselbe. Sie erhalten einfach Daten über alle Transaktionen, wo immer Sie wollen und wann immer Sie wollen. Mehr gibt es nicht zu tun. Hier hängt also nichts von der Art des Marktes ab.

In welchem Fall wird sie Ihrer Meinung nach nützlich sein?

Die Bibliothek wird nützlich sein, wenn Asynchronität zum Einsatz kommt. Dabei handelt es sich um das massenhafte Versenden von Handelsaufträgen(mehr als einer). Es kann viele Szenarien geben:

  • Eröffnung/Änderung/Schließung eines Charakterkorbs.
  • Griders.
  • Arbeiten mit den Ergebnissen von Teilausführungen.
  • Schließen aller Positionen und Löschen aller Aufträge.
  • ...
 
fxsaber:

Es ist notwendig zu experimentieren. Ich denke, dass das gleichzeitige Schreiben/Lesen einer Ressource genauso funktioniert wie bei globalen Variablen, da das Schreiben in beiden Fällen eine Erzeugung ist: ResourceCreate und GlobalVariableSet. Der einzige Unterschied zwischen einer Ressource und einer globalen Variable ist, dass man nicht einmal theoretisch gleichzeitig etwas in eine Ressource schreiben kann. Bei globalen Variablen ist das möglich.


Tatsächlich ist das Lesen einer Ressource das Abrufen eines Teils der Daten aus dem Speicher. Und wenn das Lesen begonnen hat, sollte das Schreiben einer Ressource keinen Einfluss darauf haben, da beim Schreiben ein weiteres Stück Speicher zugewiesen wird. Sie können sich kaum überschneiden, weil das Betriebssystem selbst dies höchstwahrscheinlich verhindern wird. Aus diesem Grund sollte es meiner Meinung nach keine Lade-/Speicherkonflikte mit Ressourcen geben. Aber natürlich ist es besser, den Entwicklern diese Frage zu stellen.

Ist eine Ressource mit dem gleichen Namen nicht die gleiche Ressource (bzw. ein Stück Speicher)?

Das ist leicht zu überprüfen - man sollte etwas Langes mit einer speziellen Markierung am Ende schreiben und es parallel lesen. Wenn nicht die ganze Nachricht gelesen wird, kann es einen Konflikt geben.

 
Andrey Khatimlianskii:

Ist eine Ressource mit dem gleichen Namen nicht die gleiche Ressource (bzw. der gleiche Speicherplatz)?

Schreiben ist das Erzeugen einer anderen Ressource.

Das lässt sich leicht überprüfen - schreiben Sie etwas Langes mit einer speziellen Markierung am Ende und lesen Sie es parallel. Wenn nicht die ganze Nachricht gelesen wird, kann es einen Konflikt geben.

#property script_show_inputs

input bool Save = true; // Speichern/Laden

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/de/code/22166

#define  MINLENGTH 100000
#define _CS(A) ((!::IsStopped()) && (A))

void OnStart()
{  
  const RESOURCEDATA<int> Resource("::Test");
  int Array[];            

  while (_CS(true))
    if (Save)
      for (int i = 0; _CS(i < MINLENGTH); i++)    
      {
        const int Size = ArrayResize(Array, i + MINLENGTH);
        
        Array[Size - 1] = Size;
        
        Resource = Array;
      }
    else
    {
      ArrayResize(Array, 0);      
      const int Size = Resource.Get(Array);
      
      if (!Size || (Array[Size - 1] != Size))
      {
        Print(Size);
        
        break;
      }
    }        
}


Dieses Testskript zeigt, dass es keinen Konflikt gibt.

 
fxsaber:

Die Aufnahme ist die Schaffung einer weiteren Ressource.

Dieses Überprüfungsskript zeigt, dass es keine Konflikte gibt.

So etwas hatte ich auch im Sinn:

#property script_show_inputs

input bool Save = true; // Speichern/Laden

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/de/code/22166

#define  MINLENGTH 100000

void OnStart()
{  
        const RESOURCEDATA<int> Resource("::Test");
        int Array[];            
        string str = "";
        for ( int i = 0; i < MINLENGTH; i ++ ) str += (i%1000==0?"\n":"a");
        str += "\nCHECK";

        while ( !::IsStopped() )
    if (Save)
    {
        char arr[];
        StringToCharArray( (string)GetTickCount() + "\n" + str, arr );
        ArrayResize(Array, ArraySize(arr));
        ArrayCopy( Array, arr );
        Resource = Array;
    }
    else
    {
      ArrayResize(Array, 0);
      const int Size = Resource.Get(Array);
      char get[]; ArrayResize( get, Size );
      ArrayCopy( get, Array );
      string res = CharArrayToString( get );
      uint start = (uint)StringToInteger( StringSubstr( res, 0, StringFind( res, "\n" ) ) );
      Comment( "Delay = ", (GetTickCount() - start), " ms\n", res );
      if ( StringSubstr( res, StringLen( res )-5, 5 ) != "CHECK" ) { Print( res ); break; }
    }
}

Es scheint wirklich nicht verloren zu sein.

 
Andrey Khatimlianskii:

Ich meinte so etwas wie dies:

Es scheint wirklich nicht verloren zu gehen.

Bei dieser Variante der Prüfung werden Änderungen der Größe der Ressource und der Daten am Ende der Ressource nicht berücksichtigt.

 
fxsaber:

Bei dieser Prüfvariante werden Änderungen in der Größe der Ressource und der Daten am Ende der Ressource nicht berücksichtigt.

Können zuvor geschriebene Daten im Speicher verbleiben? Wie sind sie zu löschen?

 
Andrey Khatimlianskii:

Können zuvor aufgezeichnete Daten im Speicher bleiben?

Theoretisch ist dies möglich. Deshalb sollten Sie auch dies überprüfen.

Wie kann man sie löschen?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: TradeTransactions

fxsaber, 2018.09.20 16:23.

  ResourceINT.Free();                // Gelöschte Daten aus der Ressource

Reinigung der Ressource - Löschung.

 
fxsaber:

Theoretisch kann das erlaubt sein. Deshalb sollten Sie es auch überprüfen.

Es gibt keine Fehler bei zwei unterschiedlich langen Zeichenketten:

#property script_show_inputs

input bool Save = true; // Speichern/Laden

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/de/code/22166

#define  MINLENGTH 100000

void OnStart()
{  
        const RESOURCEDATA<int> Resource("::Test");
        int Array[];            
        string str[2] = {""};
        for ( int i = 0; i < MINLENGTH  ; i ++ ) str[0] += (i%1000==0?"\n":"a");
        for ( int i = 0; i < MINLENGTH/2; i ++ ) str[1] += (i%1000==0?"\n":"b");
        str[0] += "\nCHECK";
        str[1] += "\nCHECK";

        while ( !::IsStopped() )
    if (Save)
    {
        char arr[];
        static bool var = false;
        var = !var;
        StringToCharArray( (string)GetTickCount() + "\n" + str[var], arr );
        ArrayResize(Array, ArraySize(arr));
        ArrayCopy( Array, arr );
        Resource = Array;
    }
    else
    {
      ArrayResize(Array, 0);
      const int Size = Resource.Get(Array);
      char get[]; ArrayResize( get, Size );
      ArrayCopy( get, Array );
      string res = CharArrayToString( get );
      uint start = (uint)StringToInteger( StringSubstr( res, 0, StringFind( res, "\n" ) ) );
      Comment( "Delay = ", (GetTickCount() - start), " ms\n", res );
      if ( StringSubstr( res, StringLen( res )-5, 5 ) != "CHECK" ) { Print( res ); break; }
    }
}
 
Andrey Khatimlianskii:

Auch bei zwei unterschiedlich langen Zeichenketten treten keine Fehler auf:

Das ist richtig. Deshalb habe ich gesagt, dass der ursprüngliche Code dies überprüft hat.

 
Haben Sie jemals in Erwägung gezogen, Standard-C++-Stil/Namenskonventionen zu verwenden? Ich persönlich halte Ihren Code für brillant, aber der Grund, warum ich Ihre Bibliotheken nicht verwende (oder sie umstrukturieren muss), ist der verwendete Stil. Es ist sehr schwierig, einen Teil Ihres Codes geistig zu analysieren, einfach weil Sie keine Standardkonventionen einhalten. Das ist besonders frustrierend für diejenigen von uns, die aus anderen Sprachen kommen. Zum Beispiel wird in dieser Bibliothek alles in CamelCase benannt, außer der Klassendeklaration (ALLCAPS), was den Namenskonventionen in fast allen Programmiersprachen zuwiderläuft. Ein Blick auf den Code ist frustrierend, weil in vielen anderen Sprachen
CamelCase.thing

auf ein klassenweites Attribut statt auf ein Instanzattribut zugreift.

Das gleiche gilt für die Klassendeklarationen, und Sie verwenden so gerne Makros, dass ich nie weiß, ob Ihre Klassendeklarationen Makros oder Enums sind. Gemäß den MQL-Standardkonventionen sollten Sie nur ALLCAPS für Enums, Makros und Konstanten verwenden - und CamelCase wird für Klassendeklarationen verwendet. Auch Variablen werden gemäß der MQL-Konvention mit snake_case definiert.


Es ist nicht meine Absicht, Sie mit meiner konstruktiven Kritik zu beleidigen, und ich weiß, dass Sie sehr hart daran arbeiten, diese Bibliotheken für alle frei zu machen, was großartig ist und wir brauchen mehr Entwickler wie Sie. Ich weiß, dass ich nicht nur für mich selbst spreche, und wenn Sie nur eine kleine Änderung am Stil vornehmen würden, dann würden mehr Entwickler Ihre Bibliotheken verwenden. Das ist doch das, was Sie wollen, oder nicht?