Questions sur la POO dans MQL5 - page 61

 
Alexey Navoykov:
En revanche, pour la sérialisation, il est probablement préférable de spécifier explicitement les noms textuels des champs, afin de pouvoir ensuite les renommer librement dans le code sans craindre que les fichiers stockés cessent de fonctionner.

Je demande la structure de la solution de contournement, la mise en œuvre elle-même n'est pas un gros problème ))))

ce n'est pas un problème de nommer les champs, le problème est de penser à ce qu'il faut faire ensuite - est-ce que json sera juste une méthode dans chaque classe, ou une classe statique ou généralement des champs de classe dupliqués sous forme de texte....

;)


ZS :

pensée d'une bravade bien établie - "oui j'ai bien codé en général en C++ à partir de MQL porté sans changement ici et là !!!! "

bien sûr, cela est nécessaire, mais en termes de temps consacré au développement d'une telle structure de code, c'est assez coûteux, et un support de code sera nécessaire avec les nouveaux souhaits

seuls les avantages de la connexion C + + + MQL ne sont pas claires, les constructions syntaxiques sont 90% de la même, pourquoi dupliqué ? imho intéressant d'autres langues avec la syntaxe étendue et les possibilités de compilateur de contrôle dans l'IDE tout en écrivant le projet - il est au moins rapide et confortable, sans parler des développements prêts dans le domaine public, le même C # et Python

 
Igor Makanu:

seuls les avantages du bundle C++ (+++ MQL) ne sont pas clairs

Le C++ offre beaucoup plus de possibilités. Plus un milliard de bibliothèques différentes.

 
Koldun Zloy:

Le C++ a beaucoup plus de fonctionnalités. Plus un milliard de bibliothèques différentes.

indiscutablement

mais peu importe les efforts que vous ferez, vous ne pourrez pas ouvrir n'importe quel fichier d'en-tête C dans MQL et utiliser une solution C++ toute prête pour connecter un million de bibliothèques.

J'ai fait des recherches sur Google au début de cette année et j'ai essayé de connecter TensorFlow à MQL en utilisant l'API C++.

 
Igor Makanu:

sans aucun doute

Mais quels que soient vos efforts, vous ne pouvez pas prendre n'importe quel fichier d'en-tête C, l'ouvrir dans MQL et utiliser une solution toute faite à partir de C++ pour connecter un million de bibliothèques.

J'ai fait des recherches sur Internet au début de l'année et j'ai essayé de connecter TensorFlow à MQL en utilisant l'API C++.

Vous avez posé une question sur le couplage C++ et MQL. J'ai compris que le C++ est utilisé dans les DLL. Comment pourrait-il en être autrement ?

 
Koldun Zloy:

Vous avez demandé quel était le lien entre C++ et MQL. J'ai compris que le C++ est utilisé dans la DLL. Comment pourrait-il en être autrement ?

J'ai demandé àhttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

sinon, bien .... une astuce qui vous permet d'ouvrir le fichier d'en-tête c_api.h dans MQL et d'utiliser ensuite les docks TensorFlow

maintenant vous ouvrez le fichier d'en-tête dans VS, puis vous enveloppez les appels, le modèle, les états internes... ...dans votre .dll et vous pourrez ensuite l'utiliser dans MQL.


tout cela prend du temps


Igor Makanu:

c'est pourquoi je demande la structure de la solution de contournement, la mise en œuvre elle-même est une réflexion après coup ;)))

il est peut-être réaliste de sérialiser des structures simples en json en utilisant les outils MQLhttps://habr.com/ru/post/311262/

au moins c'est rassurant de savoir que le matériel est disponible sur le web

Dossiers :
c_api.zip  17 kb
 
Igor Makanu:

Uh-huh... Je vais réessayer de demander :

AIDEZ-MOI ET AVEZ BESOIN D'UN EXEMPLE ! S'il vous plaît !

C'est juste quelque chose que j'ai écrit sur mes genoux, juste pour y réfléchir.

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

J'ai écrit à genoux, juste pour y penser.

Merci, mais ça ne fonctionne pas (((

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

en plus de cela, il ne veut travailler qu'avec les statiques

bien qu'il ne soit pas si difficile de rassembler une chaîne de caractères dans une méthode avec des définitions, en général, il faut y penser

 
Igor Makanu:

voici la demande dehttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

sinon, bien .... une astuce qui permet d'ouvrir le fichier d'en-tête c_api.h dans MQL et ensuite d'utiliser les docs TensorFlow

maintenant vous ouvrez le fichier d'en-tête dans VS, puis vous enveloppez les appels, le modèle, les états internes... ...dans votre .dll et vous pourrez ensuite l'utiliser dans MQL.


dans l'ensemble, cela prend du temps

Aucune astuce permettant de compiler le source C++ avec le compilateur MQL.

La bibliothèque TensorFlow exporte un grand nombre de fonctions. Vous n'avez probablement besoin que d'une petite partie d'entre eux.

Écrivez les prototypes des fonctions que vous utilisez. Ça ne prendra pas longtemps.


 
Vladimir Simakov:

J'ai écrit à genoux, juste pour y penser.

Enfin, quelque chose de très intéressant. Est-ce un modèle "Steam Train" ?

 
Igor Makanu:

Merci, mais ça n'a pas collé ((()

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

en plus de cela, il ne veut travailler qu'avec les statiques

Bien qu'il ne soit pas si difficile de rassembler une chaîne de caractères en une seule méthode avec les définitions, vous devez y réfléchir.

D'une manière ou d'une autre, vous vous y prenez mal)

#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 corrigé