MQL5의 OOP에 대한 질문 - 페이지 61

 
Alexey Navoykov :
반면에 직렬화의 경우 텍스트 필드 이름을 명시적으로 설정하는 것이 더 나을 수 있습니다. 저장된 파일이 작동을 멈출 염려 없이 나중에 코드에서 자유롭게 이름을 바꿀 수 있습니다.

그래서 나는 우회의 구조에 대해 묻습니다. 구현 자체는 열 번째입니다)))

필드 이름을 수정하는 것은 일반적으로 문제가 되지 않습니다. 문제는 다음에 무엇을 해야 하는지 생각하는 방법입니다. json은 각 클래스의 메서드이거나 정적 클래스이거나 다음 형식으로 클래스 필드를 복제할 수도 있습니다. 텍스트....

;)


추신:

나는 잘 정립된 허세에 대해 생각했습니다. "예, 코드가 있습니다. 음, 일반적으로 MQL의 C ++에서는 여기저기서 변경 없이 이식됩니다!!!"

물론 필요한 사항이지만 이러한 코드 구조를 개발하는 데 소요되는 시간으로 인해 이 비즈니스는 상당히 비용이 많이 들지만 새로운 위시리스트에는 코드 지원이 필요합니다

C++ 번들(++++ MQL)의 장점만 명확하지 않고 구문 구성이 90% 일대일인데 왜 중복됩니까? IMHO, 프로젝트를 작성하는 동안 IDE에서 제어하기 위한 확장 구문 및 컴파일러 기능이 있는 다른 언어는 흥미롭습니다. C와 같은 공개 도메인에서 기성품 개발은 말할 것도 없고 최소한 빠르고 편안합니다. # 그리고 파이썬

 
Igor Makanu :

C++ 번들(+++ MQL )의 장점만 명확하지 않습니다.

C++에는 더 많은 옵션이 있습니다. 또한 수십억 개의 다양한 라이브러리가 있습니다.

 
Koldun Zloy :

C++에는 더 많은 옵션이 있습니다. 또한 수십억 개의 다양한 라이브러리가 있습니다.

의심할 여지 없이

하지만 아무리 애를 써도 MQL에서 Sish 헤더 파일을 열 수 없으며 C++의 기성 솔루션을 사용하여 백만 개의 라이브러리를 연결할 수 없습니다.

나는 특히 연초에 구글링을 했고 C ++ API를 사용하여 TensorFlow를 MQL에 연결하려고 시도했습니다. 래퍼를 작성해야 합니다.

 
Igor Makanu :

의심할 여지 없이

하지만 아무리 애를 써도 MQL에서 Sish 헤더 파일을 열 수 없으며 C++의 기성 솔루션을 사용하여 백만 개의 라이브러리를 연결할 수 없습니다.

나는 특히 연초에 구글링을 했고 C ++ API를 사용하여 TensorFlow를 MQL에 연결하려고 시도했습니다. 래퍼를 작성해야 합니다.

C++와 MQL 간의 연결에 대해 질문하셨습니다. DLL에서 C++를 사용한다는 것을 이해했습니다. 다른 방법은?

 
Koldun Zloy :

C++와 MQL 간의 연결에 대해 질문하셨습니다. DLL에서 C++를 사용한다는 것을 이해했습니다. 다른 방법은?

나는 물었다 https://www.mql5.com/en/forum/307970/page10#comment_11652222

그렇지 않으면 .... MQL에서 헤더 파일 c_api.h(첨부)를 연 다음 TensorFlow의 도크를 사용할 수 있는 트릭

이제 VS에서 이 헤더 파일을 연 다음 호출, 모델, 내부 상태... 및 .dll을 래핑하고 MQL에서 이미 사용할 수 있습니다.


일반적으로 이 모든 작업은 시간이 많이 소요됩니다.


이고르 마카누 :

그래서 나는 우회의 구조에 대해 묻습니다. 구현 자체는 열 번째입니다)))

MQL https://habr.com/en/post/311262/ 를 사용하여 간단한 구성을 json으로 직렬화하는 것이 현실적일 수 있습니다.

최소한 네트워크에 기성품이 있다는 확신

파일:
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/en/forum/307970/page10#comment_11652222

그렇지 않으면 .... MQL에서 헤더 파일 c_api.h(첨부)를 연 다음 TensorFlow의 도크를 사용할 수 있는 트릭

이제 VS에서 이 헤더 파일을 연 다음 호출, 모델, 내부 상태... 및 .dll을 래핑하고 MQL에서 이미 사용할 수 있습니다.


일반적으로 이 모든 작업은 시간이 많이 소요됩니다.

MQL 컴파일러로 C++ 소스를 컴파일할 수 있는 트릭은 없습니다.

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());
 } 
추신 수정