Perguntas sobre OOP em MQL5 - página 61

 
Alexey Navoykov:
Por outro lado, para a serialização, é provavelmente melhor especificar explicitamente os nomes dos campos de texto, para que você possa então renomeá-los livremente em código sem medo de que os arquivos armazenados parem de funcionar.

Estou perguntando sobre a estrutura de trabalho, a implementação em si não é um grande problema ))))

não é um problema nomear os campos, o problema é pensar, o que fazer depois - será json apenas um método em cada classe, ou uma classe estática ou geralmente campos de classe duplicados na forma de texto....

;)


ZS:

pensamento de alguma bravata bem estabelecida - "sim eu tenho código bem em geral em C++ da MQL portado sem mudança aqui e ali!!!! "

é claro que isto é necessário, mas em termos de tempo gasto no desenvolvimento de tal estrutura de código, é bastante caro, e o suporte de código será necessário com novos desejos

apenas as vantagens da conexão C++ (+++ MQL ) não são claras, as construções de sintaxe são 90% iguais, por que duplicar? imho interessantes outras linguagens com possibilidades de sintaxe estendida e compilação de controle na IDE enquanto se escreve o projeto - é pelo menos rápido e confortável, sem mencionar os desenvolvimentos prontos no domínio público, o mesmo C# e Python

 
Igor Makanu:

apenas as vantagens do pacote C++ (+++ MQL) não são claras

O C++ tem muito mais possibilidades. Além disso, um bilhão de bibliotecas diferentes.

 
Koldun Zloy:

O C++ tem muito mais características. Além disso, um bilhão de bibliotecas diferentes.

indiscutivelmente

mas não importa o quanto você tente, você não será capaz de abrir qualquer arquivo de cabeçalho C em MQL e usar uma solução pronta C++ para conectar um milhão de bibliotecas

Procurei no Google no início deste ano e tentei conectar TensorFlow à MQL tendo C++ API.

 
Igor Makanu:

sem dúvida

Mas não importa o quanto você tente, você não pode pegar nenhum arquivo de cabeçalho C, abri-lo em MQL e usar uma solução pronta de C++ para conectar um milhão de bibliotecas

Eu pesquisei no Google no início deste ano e tentei conectar o TensorFlow à MQL tendo C++ API - você precisa escrever uma víbora

Você perguntou sobre o emparelhamento C++ e MQL. Entendi que o C++ é usado em DLL. De que outra forma poderia ser?

 
Koldun Zloy:

Você perguntou sobre a ligação entre C++ e MQL. Entendi que o C++ é usado na DLL. De que outra forma poderia ser?

Eu pergunteihttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

caso contrário, bem .... um truque que permite abrir o arquivo de cabeçalho c_api.h (tenho-o anexado) em MQL e depois usar os documentos TensorFlow

agora você abre o arquivo de cabeçalho em VS, depois embrulha as chamadas, modelo, estados internos... ...em seu .dll e então você pode usá-lo em MQL


tudo isso consome tempo


Igor Makanu:

é por isso que eu estou perguntando sobre a estrutura de trabalho, a implementação em si é um pensamento posterior ))))

talvez seja realista seriar estruturas simples na json usando ferramentas MQLhttps://habr.com/ru/post/311262/

ao menos é reconfortante saber que o material está disponível na web

Arquivos anexados:
c_api.zip  17 kb
 
Igor Makanu:

Uh-huh... Vou tentar perguntar novamente:

AJUDA-ME E PRECISO UM EXEMPLO! Por favor!

É apenas algo que escrevi de joelhos, só para pensar nisso.

#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 joelhos, só de pensar no assunto.

Obrigado, mas não está funcionando (((

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

além disso, ele só quer trabalhar com estáticos

embora não seja tão difícil coletar um fio em um método com definições, em geral, você precisa pensar sobre isso

 
Igor Makanu:

aqui está perguntandohttps://www.mql5.com/ru/forum/307970/page10#comment_11652222

caso contrário, bem .... algum truque que permite abrir o arquivo de cabeçalho c_api.h em MQL e depois usar os documentos TensorFlow

agora você abre o arquivo de cabeçalho em VS, depois embrulha as chamadas, modelo, estados internos... ...em seu .dll e então você pode usá-lo em MQL


em suma, é um processo demorado

Sem truques que permitam compilar a fonte C++ com compilador MQL.

A biblioteca TensorFlow exporta muitas funções. Você provavelmente só precisa de uma pequena fração deles.

Escreva os protótipos das funções que você está usando. Não vai demorar muito.


 
Vladimir Simakov:

Escrito de joelhos, só de pensar no assunto.

Finalmente, algo muito interessante. É um padrão "Trem a Vapor"?

 
Igor Makanu:

Obrigado, mas não colou (((

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

além disso, ele só quer trabalhar com estáticos

Embora não seja tão difícil coletar um fio em um método com definições, você precisa pensar sobre isso

De alguma forma você está fazendo isso errado)

#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 Corrigido
Razão: