Errori, bug, domande - pagina 2347

 
Andrey Khatimlianskii:

Ma non sono nemmeno riuscito ad implementarlo per diverse librerie. Per collegare diverse librerie con tali macro in una linea e chiamare OnTick per tutte le librerie.

Non capisco bene nemmeno un esempio, cosa voglio ottenere. Puoi mostrarmelo?


ZZZ Per quanto riguarda il gestore, vedere EventBase. EventBase.mqh qui. Stupidamente rendeva tutti eredi e quando un nuovo oggetto appariva, il suo puntatore andava in una lista comune, che veniva chiamata da un ciclo for in ogni evento On.

 
fxsaber:

Non riesco nemmeno ad avere un esempio di quello che voglio ottenere. Puoi mostrarmelo?

MyClass_1.mqh:

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


MyClass_2.mqh:

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


Esperto.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" );
}


Per ottenere tutte e 3 le stampanti come risultato dell'esecuzione: "Init 1", "Init 2" e "Init EA"

 

Ciao a tutti.

Chiamo la funzioneIndicatorParameters da expert, ma ottengo l'errore 4014. Che cosa può essere - si prega di consigliare? Costruire 1960.

 
Andrey Khatimlianskii:

Per collegare diverse librerie con tali macro in una linea, e chiamare OnTick per chiamare tutte le librerie OnTick.

Fare una macro wrapper intorno all'importazione che forma una classe per nome della libreria (class##libname) e usa il contesto per la chiamata all'interno del wrapper (libname::oninit)

e la classe viene scaricata nel gestore di cui sopra.

ma per ogni lib una linea separata.

 
TheXpert:

Fare una macro wrapper intorno all'importazione che forma una classe con il nome della libreria (class##libname)

Questo è un po' complicato per me, quindi lo cercherò su Google.

 
Kuzmich:

Ciao a tutti.

Chiamo la funzioneIndicatorParameters da expert, ma ottengo l'errore 4014. Che cosa può essere - si prega di consigliare? Costruire 1960.

Se avete 3 inludniks, allora il mio codice sopra dovrebbe funzionare, ma per ogni classe dovrebbe prescrivere sostituzioni macro, ecco il mio esempio, sembra funzionare, ma controllerò ancora:

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_
//+------------------------------------------------------------------+

e nel codice Expert Advisor includo solo un #include <fileMyclass.mqh>

nel tuo esempio, tutti e tre i file devono essere chiusi (in fondo al codice) con le mie sostituzioni macro (e sostituire i nomi m_classe2 , m_classe3...)

Andrey Khatimlianskii:

Soluzione già suggerita per una classe di un tipo: ereditare da CObject e aggiungere una sostituzione macro al class manager che memorizzerà tutte le istanze aggiunte in CArrayObj, lo attraverserà e chiamerà la funzione OnXXX richiesta.

Non sono nemmeno riuscito a implementare questo per diverse librerie. Per collegare diverse librerie con tali macro in una linea, e per chiamare OnTick di tutte le librerie.

L'esempio è necessario, non so come e non ha funzionato con "sostituzione macro in class manager"

 
Andrey Khatimlianskii:

Per ottenere tutte e 3 le stampanti: "Init 1", "Init 2" e "Init EA" come risultato dell'esecuzione

Fare il manager. L'esempio del codice sorgente di cui sopra ha mostrato. Le macro servono per altre cose, però.

 
Andrey Khatimlianskii:

È un po' complicato per me, così l'ho cercato su Google.

Non sarà bello, ma potete ridurlo a qualcosa del genere:

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

Ecco una chiamata diretta e un esempio di implementazione senza manager.

#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();
}

Se la classe ImportFrom ha la registrazione del gestore e funzioni non statiche, tutto può essere chiamato automaticamente per tutti gli importati

 
TheXpert:

Ecco una chiamata diretta e un esempio di implementazione senza manager.

Se la classe ImportFrom ha la registrazione del gestore e funzioni non statiche, tutto può essere chiamato automaticamente per tutti gli importati

Ho capito l'idea, grazie.

Non è trasparente al 100%, ma meglio di quanto lo sia al momento.