오류, 버그, 질문 - 페이지 2347

 
Andrey Khatimlianskii :

그러나 다른 라이브러리의 경우에도 이것을 구현하지 못했습니다. 이러한 매크로 대체가 있는 여러 라이브러리를 한 줄로 연결하여 OnTick이 호출될 때 모든 라이브러리의 OnTick이 호출되도록 합니다.

어떤 것은 강하게 받는 것이 바람직할 것이라는 예를 들어도 따라잡지 못한다. 보여줄 수 있어?


추신: 관리자의 경우 여기에서 EventBase.mqh를 참조하십시오. 어리석게도 모든 사람을 상속자로 만들었으며 새 개체가 나타나면 해당 포인터가 각 On-event의 for 루프에 의해 호출되는 일반 목록에 떨어졌습니다.

 
fxsaber :

어떤 것은 강하게 받는 것이 바람직할 것이라는 예를 들어도 따라잡지 못한다. 보여줄 수 있어?

MyClass_1.mqh:

 class Myclass_1
  {
public :
   void                OnInit (){ Print ( "Init 1" );};
  };


MyClass_2.mqh:

 class Myclass_2
  {
public :
   void                OnInit (){ Print ( "Init 2" );};
  };


Expert.mq5:

 #include <MyClass_1.mqh>
#include <MyClass_2.mqh>

Myclass_1 m_class_1;
Myclass_2 m_class_2;

void OnInit ( void )
{
   Print ( "Init EA" );
}


실행 결과로 3개의 인쇄를 모두 얻으려면: "Init 1", "Init 2" 및 "Init EA"

 

안녕하세요.

EA에서 함수를 호출   IndicatorParameters 하지만 오류 4014가 발생합니다. 이유가 무엇입니까? 빌드 1960.

 
Andrey Khatimlianskii :

이러한 매크로 대체가 있는 여러 라이브러리를 한 줄로 연결하여 OnTick이 호출될 때 모든 라이브러리의 OnTick이 호출되도록 합니다.

lib 이름(class##libname)으로 클래스를 생성하고 컨텍스트를 사용하여 래퍼(libname::onit) 내부에서 호출하는 가져오기 주위에 매크로 래퍼를 만듭니다.

글쎄, 수업은 앞서 언급 한 관리자에게 미끄러졌습니다.

각각의 개별 라인에 대해서만.

 
TheXpert :

lib 이름(class##libname)으로 클래스를 생성하는 가져오기 주위에 매크로 래퍼를 만듭니다.

이건 너무 복잡해서 구글로 갔습니다.

 
Kuzmich :

안녕하세요.

EA에서 함수를 호출   IndicatorParameters 하지만 오류 4014가 발생합니다. 이유가 무엇입니까? 빌드 1960.

글쎄, 3개의 인클루더가 있다면 위에 게시한 코드가 작동해야 하지만 각 클래스에 대한 매크로 대체를 작성해야 합니다. 여기에 제 예가 있습니다. 작동하는 것 같지만 여전히 확인하겠습니다.

 class Myclass
  {
public :
                     Myclass(){};
                    ~Myclass(){};
   void                OnInit ()  { Print ( __FUNCSIG__ , " выполнен" );};
   void                OnDeinit ( int Reason){ Print ( __FUNCSIG__ , " выполнен" );}
   void                OnTick ()  { Print ( __FUNCSIG__ , " выполнен" );};
   void                OnTimer () { Print ( __FUNCSIG__ , " выполнен" );};
  } m_class;
//+------------------------------------------------------------------+
#define MyClassOnInit m_class. OnInit ();
void OnInit ( void ){ MyClassOnInit; EventSetMillisecondTimer ( 300 ); ::MyClassOnInit_(); }
#define OnInit MyClassOnInit_
//+------------------------------------------------------------------+
#define MyClassOnDeinit(Reason) m_class. OnDeinit (Reason);
void OnDeinit ( const int Reason ){ MyClassOnDeinit(Reason); ::MyClassOnDeinit_(Reason); }
#define OnDeinit MyClassOnDeinit_
//+------------------------------------------------------------------+
#define MyClassOnTimer m_class. OnTimer ();
void OnTimer ( void ){ MyClassOnTimer; ::MyClassOnTimer_(); }
#define OnTimer MyClassOnTimer_
//+------------------------------------------------------------------+
#define MyClassOnTick m_class. OnTick ();
void OnTick ( void ){ MyClassOnTick; ::MyClassOnTick_(); }
#define OnTick MyClassOnTick_
//+------------------------------------------------------------------+

EA 코드에는 #include <fileMyclass.mqh> 하나만 포함합니다.

귀하의 예에서 세 파일 모두 (코드 맨 아래에서) 매크로 대체로 닫아야합니다 (이름 m_class2 , m_class3 ...)

안드레이 카팀리안스키 :

동일한 유형의 클래스에 대해 솔루션이 이미 제안되었습니다. CObject에서 이를 상속하고 CArrayObj에 추가된 모든 인스턴스를 저장하는 관리자 클래스에 매크로 대체를 추가하고 이를 반복하고 필요한 OnXXX 함수를 호출합니다.

그러나 다른 라이브러리의 경우에도 이것을 구현하지 못했습니다. 이러한 매크로 대체가 있는 여러 라이브러리를 한 줄로 연결하여 OnTick이 호출될 때 모든 라이브러리의 OnTick이 호출되도록 합니다.

예제가 필요합니다. "클래스 관리자에서 매크로 대체"로 작업하는 방법과 작업을 수행하지 않았습니다.

 
Andrey Khatimlianskii :

실행 결과로 3개의 인쇄를 모두 얻으려면: "Init 1", "Init 2" 및 "Init EA"

관리자를 만드십시오. 위 소스의 예가 나와 있습니다. 매크로는 다른 용도로 사용됩니다.

 
Andrey Khatimlianskii :

이건 너무 복잡해서 구글로 갔습니다.

일반적으로 잘 되지는 않지만 다음과 같이 레코드를 최대한 줄일 수 있습니다.

 // for libsample
#import "libsample.ex5"
IMPORT_EA_INTERFACE // здесь список импортируемых функций. они по идее одинаковые, поэтому можно в отдельный дефайн
#import
DECLARE_AND_REGISTER(libsample) // здесь генерация класса-обертки для libsample который обернет импортированные функции и зарегистрируется в менеджере
 

다음은 직접 호출 및 관리자가 없는 구현의 예입니다.

 #define IMPORT_EA_INTERFACE \
void f1(); \
void f2(); \

#define DECLARE_AND_REGISTER(x) \
class ImportFrom_ ##x \
{ \
public : \
   static void f1() { x::f1();} \
   static void f2() { x::f2();} \
}; \

#import "libsample.ex5"
IMPORT_EA_INTERFACE
#import
DECLARE_AND_REGISTER(libsample)

#import "libsamplesecond.ex5"
IMPORT_EA_INTERFACE
#import
DECLARE_AND_REGISTER(libsamplesecond)

void OnStart ()
{
   ImportFrom_libsample::f1();
   ImportFrom_libsample::f2();

   ImportFrom_libsamplesecond::f1();
   ImportFrom_libsamplesecond::f2();
}

ImportFrom 클래스에 관리자 등록 및 비정적 함수가 있는 경우 모든 가져오기 또는

 
TheXpert :

다음은 직접 호출 및 관리자가 없는 구현의 예입니다.

ImportFrom 클래스에 관리자 등록 및 비정적 함수가 있는 경우 모든 가져오기 또는

그 생각을 이해합니다. 감사합니다.

100% 투명하지는 않지만 현재보다 낫습니다.