Preguntas sobre POO en MQL5 - página 61

 
Alexey Navoykov:
Por otro lado, para la serialización, probablemente sea mejor especificar explícitamente los nombres de los campos de texto, para poder luego renombrarlos libremente en el código sin temor a que los archivos guardados dejen de funcionar.

Pregunto por la estructura de la solución, la aplicación en sí no es un gran problema ))))

no es un problema nombrar los campos, el problema es pensar, qué hacer después - será json sólo un método en cada clase, o una clase estática o en general duplicar los campos de la clase en forma de text....

;)


ZS:

¡¡¡¡pensó en algunas bravuconadas bien establecidas - "sí tengo código bien en general en C++ de MQL portado sin cambio aquí y allá!!!! "

por supuesto que es necesario, pero en términos de tiempo dedicado al desarrollo de tal estructura de código, es bastante caro, y se necesitará apoyo de código con nuevos deseos

las únicas ventajas de la conexión C++ (+++ MQL ) no son claras, las construcciones de sintaxis son 90% iguales, ¿por qué se duplican? imho interesante otros idiomas con sintaxis extendida y posibilidades de control del compilador en el IDE mientras se escribe el proyecto - es al menos rápido y cómodo, por no hablar de los desarrollos listos en el dominio público, el mismo C# y Python

 
Igor Makanu:

sólo las ventajas del paquete C++ (+++ MQL) no están claras

C++ tiene muchas más posibilidades. Además de mil millones de bibliotecas diferentes.

 
Koldun Zloy:

C++ tiene muchas más características. Además de mil millones de bibliotecas diferentes.

indiscutiblemente

pero por mucho que lo intentes, no podrás abrir ningún archivo de cabecera C en MQL y utilizar una solución C++ ya preparada para conectar un millón de librerías

Lo busqué en Google a principios de este año e intenté conectar TensorFlow con MQL teniendo la API de C++.

 
Igor Makanu:

sin duda

Pero por mucho que lo intentes, no puedes coger cualquier archivo de cabecera de C, abrirlo en MQL y utilizar una solución ya hecha de C++ para conectar un millón de librerías

Lo busqué en Google a principios de este año y traté de conectar TensorFlow a MQL teniendo la API de C++ - necesitas escribir una víbora

Has preguntado por el binomio C++ y MQL. Tengo entendido que en la DLL se utiliza C++. ¿Cómo podría ser si no?

 
Koldun Zloy:

Has preguntado por la relación entre C++ y MQL. Tengo entendido que en la DLL se utiliza C++. ¿Cómo podría ser si no?

Le pregunté ahttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

por lo demás, bien .... un truco que permite abrir el archivo de cabecera c_api.h (lo tengo adjunto) en MQL y luego usar los documentos de TensorFlow

ahora abres el archivo de cabecera en VS, luego envuelves las llamadas, el modelo, los estados internos... ...en su .dll y luego puede usarlo en MQL


todo esto lleva mucho tiempo


Igor Makanu:

por eso estoy preguntando por la estructura de la solución, la implementación en sí es una idea tardía )))

tal vez sea realista serializar estructuras simples en json utilizando herramientas MQLhttps://habr.com/ru/post/311262/

al menos es tranquilizador saber que el material está disponible en la web

Archivos adjuntos:
c_api.zip  17 kb
 
Igor Makanu:

Uh-huh... Intentaré preguntar de nuevo:

¡AYUDA Y NECESITA UN EJEMPLO! ¡Por favor!

Es algo que escribí de rodillas, sólo para pensarlo.

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

Escrito de rodillas, sólo para pensarlo.

Gracias, pero no funciona (((

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

Además, sólo quiere trabajar con la estática

aunque no es tan difícil recoger una cadena en un método con defines, en general, hay que pensar en ello

 
Igor Makanu:

aquí está pidiendohttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

por lo demás, bien .... algún truco que permita abrir el archivo de cabecera c_api.h en MQL y luego usar los docs de TensorFlow

ahora abres el archivo de cabecera en VS, luego envuelves las llamadas, el modelo, los estados internos... ...en su .dll y luego puede usarlo en MQL


En definitiva, es un proceso que requiere mucho tiempo.

No hay trucos que permitan compilar el código fuente C++ con el compilador MQL.

La biblioteca TensorFlow exporta muchas funciones. Probablemente sólo necesites una pequeña parte de ellos.

Escriba los prototipos de las funciones que utiliza. No tardará mucho.


 
Vladimir Simakov:

Escrito de rodillas, sólo para pensarlo.

Por último, algo muy interesante. ¿Es un modelo de "Tren de Vapor"?

 
Igor Makanu:

Gracias, pero no se pegó (((

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

Además, sólo quiere trabajar con la estática

Aunque no es tan difícil recoger una cadena en un método con defines, hay que pensar en ello

De alguna manera lo estás haciendo 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 Corregido
Razón de la queja: