Вопросы по ООП в MQL5 - страница 61

 
Alexey Navoykov:
Хотя с другой стороны, для сериализации наверно лучше явно задавать текстовые названия полей.  Чтоб потом можно было свободно переименовывать их в коде, не боясь, что сохранённые файлы перестанут работать.

дык и спрашиваю про структуру обхода, сама реализация дело десятое )))

надефайнить имена полей, в целом не проблема, проблема как бы подумать, что делать потом - json будет просто методом в каждом классе, или статическим классом или вообще сделать дубликат полей класса в виде текста....

;)


ЗЫ:

задумался о некой устоявшейся браваде - "да у меня код ну вообще в С++ из MQL портируется без изменений тудым-сюдым!!! "

дело то конечно нужно, но по затраченному времени разработки такой структуры кода, это дело довольно затратное, да о поддержка кода будет требоваться с новыми хотелками

не понятны только преимущества связки С++ (+++ MQL ) , синтаксические конструкции на 90% один в один, зачем дублироваться? имхо интересны другие языки с расширенным синтаксисом и возможностями компилятора по контролю в IDE во время написания проекта - это как минимум быстро и комфортно, не говоря  уже о готовых наработках в свободном доступе том же C# и Python

 
Igor Makanu:

не понятны только преимущества связки С++ (+++ MQL ) 

У C++ возможностей намного больше. Плюс миллиард различных библиотек.

 
Koldun Zloy:

У C++ возможностей намного больше. Плюс миллиард различных библиотек.

бесспорно

но как ни старайся, не получится взять Сишный  любой заголовочный файл открыть в MQL и использовать готовое решение от С++, чтобы подключить миллион библиотек

я специально в начале года прогуглил, и попробовал подключить TensorFlow к MQL имея C++ API - нужно писать врапер

 
Igor Makanu:

бесспорно

но как ни старайся, не получится взять Сишный  любой заголовочный файл открыть в MQL и использовать готовое решение от С++, чтобы подключить миллион библиотек

я специально в начале года прогуглил, и попробовал подключить TensorFlow к MQL имея C++ API - нужно писать врапер

Вы спрашивали про связку C++ и MQL. Я понял что C++ используется в DLL. А как иначе?

 
Koldun Zloy:

Вы спрашивали про связку C++ и MQL. Я понял что C++ используется в DLL. А как иначе?

вот спрашивал https://www.mql5.com/ru/forum/307970/page10#comment_11652222

иначе, ну .... некий фокус который позволяет открыть заголовочный файл c_api.h (приатачил) в MQL и дальше пользоваться доками от TensorFlow 

сейчас это открываешь в VS заголовочный файл , затем оборачиваешь вызовы, модель, внутренние состояния... и в свою .dll и затем вот уже можешь юзать в MQL


в общем трудоемко все это по времени


Igor Makanu:

дык и спрашиваю про структуру обхода, сама реализация дело десятое )))

наверное реально сериализовать простые конструкции в json средствами MQL https://habr.com/ru/post/311262/

как минимум обнадеживает, что готовый материал в сети есть

Файлы:
c_api.zip  17 kb
 
Igor Makanu:

угу... попробую так еще спросить:

хелп ми ай нид ан экзампл! плиз!

На коленке писано, чисто так, на подумать

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

На коленке писано, чисто так, на подумать

Спасибо, но не прикрутилось (((

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

дык вдобавок еще только статиками хочет работать

хотя не так и сложно дефайнами собрать строку в одном методе, подумать в общем нужно

 
Igor Makanu:

вот спрашивал https://www.mql5.com/ru/forum/307970/page10#comment_11652222

иначе, ну .... некий фокус который позволяет открыть заголовочный файл c_api.h (приатачил) в MQL и дальше пользоваться доками от TensorFlow 

сейчас это открываешь в VS заголовочный файл , затем оборачиваешь вызовы, модель, внутренние состояния... и в свою .dll и затем вот уже можешь юзать в MQL


в общем трудоемко все это по времени

Никаких фокусов, позволяющих компилировать исходник C++ компилятором MQL нет.

Библиотека TensorFlow экспортирует очень много функций. Вам, скорее всего, нужна только небольшая часть из них.

Напишите прототипы функций, которые Вы используете. Это не займёт много времени.


 
Vladimir Simakov:

На коленке писано, чисто так, на подумать

Наконец-то нечто очень интересное. Это паттерн "Паровозик"?

 
Igor Makanu:

Спасибо, но не прикрутилось (((

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

дык вдобавок еще только статиками хочет работать

хотя не так и сложно дефайнами собрать строку в одном методе, подумать в общем нужно

Как-то ты не так делаешь)

#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 Поправил