Domande su OOP in MQL5 - pagina 61

 
Alexey Navoykov:
D'altra parte, per la serializzazione, è probabilmente meglio specificare esplicitamente i nomi dei campi di testo, in modo da poterli poi rinominare liberamente nel codice senza paura che i file memorizzati smettano di funzionare.

Sto chiedendo della struttura del workaround, l'implementazione in sé non è un grosso problema ))))

non è un problema nominare i campi, il problema è pensare, cosa fare dopo - sarà json solo un metodo in ogni classe, o una classe statica o in generale campi di classe duplicati sotto forma di testo....

;)


ZS:

pensato a qualche spavalderia ben consolidata - "sì ho codice bene in generale in C++ da MQL portato senza modifiche qui e là!!!! "

Naturalmente questo è necessario, ma a giudicare dal tempo richiesto per lo sviluppo di una tale struttura di codice, è piuttosto costoso.

solo vantaggi della connessione C ++ MQL ) non sono chiari, i costrutti di sintassi sono il 90% stesso, perché duplicato? imho interessante altre lingue con sintassi estesa e compilatore possibilità di controllo in IDE durante la scrittura del progetto - è almeno veloce e confortevole, per non parlare degli sviluppi pronti nel dominio pubblico, lo stesso C# e Python

 
Igor Makanu:

solo i vantaggi del bundle C++ (+++ MQL) non sono chiari

C++ ha molte più possibilità. Più un miliardo di librerie diverse.

 
Koldun Zloy:

C++ ha molte più caratteristiche. Più un miliardo di librerie diverse.

indiscutibilmente

ma per quanto ci proviate, non sarete in grado di aprire qualsiasi file di intestazione C in MQL e usare una soluzione C++ già pronta per collegare un milione di librerie

L'ho cercato su Google all'inizio di quest'anno e ho provato a collegare TensorFlow a MQL avendo l'API C++.

 
Igor Makanu:

indubbiamente

Ma per quanto ci proviate, non potete prendere un qualsiasi file header C, aprirlo in MQL e usare una soluzione pronta da C++ per collegare un milione di librerie

Ho cercato su Google all'inizio di quest'anno e ho provato a collegare TensorFlow a MQL avendo l'API C++ - è necessario scrivere un viper

Hai chiesto dell'accoppiamento tra C++ e MQL. Ho capito che il C++ è usato nella DLL. Come potrebbe essere altrimenti?

 
Koldun Zloy:

Avete chiesto del legame tra C++ e MQL. Ho capito che il C++ è usato nella DLL. Come potrebbe essere altrimenti?

Ho chiesto ahttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

altrimenti, bene .... qualche trucco che permette di aprire il file header c_api.h in MQL e poi usare i dock di TensorFlow

ora aprite il file header in VS, poi avvolgete le chiamate, il modello, gli stati interni... ...nel vostro .dll e poi potete usarlo in MQL


tutto questo richiede tempo


Igor Makanu:

Ecco perché sto chiedendo della struttura del workaround, l'implementazione stessa è un ripensamento )))

forse è realistico serializzare strutture semplici in json usando strumenti MQLhttps://habr.com/ru/post/311262/

almeno è rassicurante sapere che il materiale è disponibile sul web

File:
c_api.zip  17 kb
 
Igor Makanu:

Uh-huh... Proverò a chiedere di nuovo:

AIUTATEMI E BISOGNA UN ESEMPIO! Per favore!

È solo qualcosa che ho scritto in ginocchio, solo per pensarci.

#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:

Scritto in ginocchio, solo per pensarci.

Grazie, ma non funziona (((

//+------------------------------------------------------------------+
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) }

Inoltre, vuole lavorare solo con la statica

anche se non è così difficile raccogliere una stringa in un metodo con le definizioni, in generale, è necessario pensarci

 
Igor Makanu:

qui si chiede ahttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

altrimenti, bene .... qualche trucco che permette di aprire il file header c_api.h in MQL e poi usare i documenti di TensorFlow

ora si apre il file header in VS, poi si avvolgono le chiamate, il modello, gli stati interni... ...nel vostro .dll e poi potete usarlo in MQL


tutto sommato è una perdita di tempo

Nessun trucco per compilare il sorgente C++ con il compilatore MQL.

La libreria TensorFlow esporta molte funzioni. Probabilmente ne avrete bisogno solo di una piccola parte.

Scrivete i prototipi delle funzioni che state usando. Non ci vorrà molto.


 
Vladimir Simakov:

Scritto in ginocchio, solo per pensarci.

Infine, qualcosa di molto interessante. È un modello "Steam Train"?

 
Igor Makanu:

Grazie, ma non si è attaccato (((

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) }

Inoltre, vuole lavorare solo con la statica

Anche se non è così difficile raccogliere una stringa in un metodo con le definizioni, bisogna pensarci

In qualche modo lo stai facendo male)

#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 Corretto
Motivazione: