Fragen zu OOP in MQL5 - Seite 61

 
Alexey Navoykov:
Andererseits ist es für die Serialisierung wahrscheinlich besser, die Namen der Textfelder explizit anzugeben, so dass Sie sie im Code frei umbenennen können, ohne befürchten zu müssen, dass die gespeicherten Dateien nicht mehr funktionieren.

Ich frage nach der Struktur der Abhilfe, die Implementierung selbst ist keine große Sache ))))

es ist kein Problem, die Felder zu benennen, das Problem ist zu denken, was danach zu tun - wird json nur eine Methode in jeder Klasse, oder eine statische Klasse oder allgemein duplizieren Klasse Felder in Form von text.... sein

;)


ZS:

Gedanke an einige bewährte Angebereien - "ja, ich habe Code im Allgemeinen gut in C++ von MQL ohne Änderung hier und da portiert!!!! "

Natürlich ist dies notwendig, aber gemessen an der Zeit, die für die Entwicklung einer solchen Codestruktur aufgewendet wird, ist dies recht teuer, und bei neuen Wünschen wird Code-Unterstützung benötigt.

nur Vorteile der Verbindung C + + (+++ MQL ) sind nicht klar, Syntax Konstrukte sind 90% gleich, warum dupliziert? imho interessante andere Sprachen mit erweiterten Syntax und Compiler Möglichkeiten der Kontrolle in IDE beim Schreiben des Projekts - es ist zumindest schnell und bequem, nicht auf die bereit Entwicklungen in der Public Domain zu erwähnen, die gleichen C # und Python

 
Igor Makanu:

nur die Vorteile des C++-Bündels (+++ MQL) sind nicht klar

C++ hat viel mehr Möglichkeiten. Und eine Milliarde verschiedener Bibliotheken.

 
Koldun Zloy:

C++ hat viel mehr Funktionen. Und eine Milliarde verschiedener Bibliotheken.

Unbestreitbar

aber egal wie sehr Sie sich bemühen, Sie werden nicht in der Lage sein, irgendeine C-Header-Datei in MQL zu öffnen und eine fertige C++-Lösung zu verwenden, um eine Million Bibliotheken zu verbinden

Ich habe es Anfang des Jahres gegoogelt und versucht, TensorFlow mit MQL zu verbinden, das eine C++ API hat.

 
Igor Makanu:

Zweifellos

Aber egal, wie sehr man sich bemüht, man kann nicht irgendeine C-Header-Datei nehmen, sie in MQL öffnen und eine fertige Lösung aus C++ verwenden, um eine Million Bibliotheken zu verbinden

Ich habe es Anfang des Jahres gegoogelt und versucht, TensorFlow mit MQL zu verbinden, das eine C++ API hat - man muss eine Viper schreiben

Sie haben nach der Paarung von C++ und MQL gefragt. Ich habe verstanden, dass C++ in DLL verwendet wird. Wie könnte es anders sein?

 
Koldun Zloy:

Sie haben nach der Verbindung zwischen C++ und MQL gefragt. Ich habe verstanden, dass in der DLL C++ verwendet wird. Wie könnte es anders sein?

Ich fragtehttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

Ansonsten, gut .... ein Trick, der es Ihnen erlaubt, die Header-Datei c_api.h in MQL zu öffnen und dann die TensorFlow-Dokumente zu verwenden

jetzt öffnen Sie die Header-Datei in VS, dann verpacken Sie die Aufrufe, das Modell, die internen Zustände... ...in Ihre .dll und dann können Sie es in MQL verwenden


all dies ist zeitaufwendig


Igor Makanu:

deshalb frage ich nach der Struktur der Umgehung, die Umsetzung selbst ist ein nachträglicher Einfall )))

vielleicht ist es realistisch, einfache Strukturen in json mit MQL-Tools zu serialisierenhttps://habr.com/ru/post/311262/

Zumindest ist es beruhigend zu wissen, dass das Material im Internet verfügbar ist.

Dateien:
c_api.zip  17 kb
 
Igor Makanu:

Aha... Ich werde es noch einmal versuchen:

HELFEN SIE MIR UND BENÖTIGEN SIE EIN BEISPIEL! Bitte!

Das ist nur etwas, das ich auf meinen Knien geschrieben habe, um darüber nachzudenken.

#define  COMMA (text==NULL?NULL:",\n")
#define  PUSH(dVal) Push(#dVal,dVal)

class CJSon{
   string text;
public:
   CJSon():text(NULL){}
   CJSon* Push(string key,string value) {text+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* Push(string key,long value)   {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   string Finish()   {return text="{\n"+text+"\n}";}
};

#undef  COMMA

void OnStart(){
   int a=56;
   double b=0.369;
   string text="Example";
   string json=(CJSon()).PUSH(a).PUSH(b).PUSH(text).Finish();
   Print(json);
 } 
 
Vladimir Simakov:

Auf den Knien geschrieben, nur um darüber nachzudenken.

Danke, aber es funktioniert nicht (((

//+------------------------------------------------------------------+
static string _json;
template<typename T>class CJSon{
#define  COMMA (_json==NULL?NULL:",\n")
#define  PUSH(dVal) Push(#dVal,dVal)
public:
   CJSon() {_json = "";}
   CJSon* Push(string key,string value) {_json+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* Push(string key,long value)   {_json+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {_json+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   static string Finish()   {return _json="{\n"+_json+"\n}";}
};
//+------------------------------------------------------------------+
class A
{
   public:
   static long a1;
};
long A::a1;
//+------------------------------------------------------------------+
void OnStart()
{
   CJSon<A> a;
   A::a1 = 10;
   
   a.PUSH(A::a1);
   string s = a.Finish() ;
   
   PRINT(s);
}
//+------------------------------------------------------------------+

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) s = {

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) ,

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) "A::a1":10

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) }

Darüber hinaus will es nur mit Statik arbeiten.

obwohl es nicht so schwer ist, eine Zeichenkette in einer Methode mit Defines zu sammeln, muss man im Allgemeinen darüber nachdenken

 
Igor Makanu:

Hier ist die Anfragehttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

Ansonsten, gut .... ein Trick, der es erlaubt, die Header-Datei c_api.h in MQL zu öffnen und dann die TensorFlow-Dokumente zu verwenden

jetzt öffnen Sie die Header-Datei in VS, dann verpacken Sie die Aufrufe, das Modell, die internen Zustände... ...in Ihre .dll und dann können Sie es in MQL verwenden


alles in allem ist es sehr zeitaufwendig

Keine Tricks, um C++-Quellen mit dem MQL-Compiler zu kompilieren.

Die TensorFlow-Bibliothek exportiert eine Menge Funktionen. Sie brauchen wahrscheinlich nur einen kleinen Teil davon.

Schreiben Sie Prototypen der Funktionen, die Sie verwenden. Es wird nicht lange dauern.


 
Vladimir Simakov:

Auf den Knien geschrieben, nur um darüber nachzudenken.

Zum Schluss noch etwas sehr Interessantes. Ist es ein "Dampfzug"-Muster?

 
Igor Makanu:

Danke, aber es hat nicht geklappt (((

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) s = {

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) ,

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) "A::a1":10

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) }

Darüber hinaus will es nur mit Statik arbeiten.

Obwohl es nicht so schwer ist, eine Zeichenkette in einer Methode mit Defines zu sammeln, müssen Sie darüber nachdenken

Irgendwie machst du es falsch)

#define  COMMA (text==NULL?"{\n":",\n")
#define  VALUE(dVal) Push(#dVal,dVal)
#define  STRUCT(dVal) PushStruct(#dVal,dVal.JSon())

class CJSon{
   string text;
public:
   CJSon():text(NULL){}
   CJSon* Push(string key,string value) {text+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* PushStruct(string key,string value) {text+=COMMA+"\""+key+"\":"+value; return &this;}
   CJSon* Push(string key,long value)   {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   string Finish()   {return text+="\n}";}
};

#undef  COMMA

class _CTest{
   int a;
   double b;
   string t;
public:
   _CTest(int _a,double _b,string _t):a(_a),b(_b),t(_t){}
   string JSon()  {return (CJSon()).VALUE(a).VALUE(b).VALUE(t).Finish();}
};

class CTest{
   _CTest test;
   int a;
   long b;
public:
   CTest():test(10,0.369,"Hi"),a(555),b(LONG_MIN){}
   string JSon() {return (CJSon()).STRUCT(test).VALUE(a).VALUE(b).Finish();}
};

void OnStart(){
   CTest test;
   Print(test.JSon());
 } 
PS Korrigiert