Fehler, Irrtümer, Fragen - Seite 2347

 
Andrey Khatimlianskii:

Aber ich habe es auch nicht geschafft, es für verschiedene Bibliotheken zu implementieren. Um mehrere Bibliotheken mit solchen Makros in einer Zeile zu verbinden und OnTick für alle Bibliotheken aufzurufen.

Ich verstehe nicht wirklich, auch nicht ein Beispiel, was ich bekommen möchte. Können Sie es mir zeigen?


ZZZ Was den Manager betrifft, siehe. EventBase.mqh hier. Dummerweise machte ich jeden zu einem Erben und wenn ein neues Objekt erschien, ging sein Zeiger in eine gemeinsame Liste, die von einer for-Schleife in jedem On-Event aufgerufen wurde.

 
fxsaber:

Ich kann nicht einmal ein Beispiel für das bekommen, was ich haben möchte. Können Sie es mir zeigen?

MyClass_1.mqh:

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


MyClass_2.mqh:

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


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


Um alle 3 Drucker als Ergebnis der Ausführung zu erhalten: "Init 1", "Init 2" und "Init EA"

 

Hallo zusammen.

Ich rufe die FunktionIndicatorParameters vom Experten aus auf, erhalte aber den Fehler 4014. Woran kann es liegen - bitte um Rat? Baujahr 1960.

 
Andrey Khatimlianskii:

Um mehrere Bibliotheken mit solchen Makros in einer Zeile zu verbinden, und um OnTick aufzurufen, um alle Bibliotheken OnTick aufzurufen.

Erstellen Sie einen Makro-Wrapper um den Import, der eine Klasse mit dem Namen der Bibliothek bildet (class##libname) und den Kontext für den Aufruf innerhalb des Wrappers verwendet (libname::oninit)

und die Klasse wird an den oben genannten Manager übergeben.

sondern für jede Lib eine eigene Zeile.

 
TheXpert:

Erstellen Sie einen Makro-Wrapper um den Import, der eine Klasse mit dem Namen der Bibliothek bildet (class##libname)

Das ist ein bisschen schwierig für mich, also werde ich es googeln.

 
Kuzmich:

Hallo zusammen.

Ich rufe die FunktionIndicatorParameters vom Experten aus auf, erhalte aber den Fehler 4014. Woran kann es liegen - bitte um Rat? Baujahr 1960.

Wenn Sie 3 inludniks haben, dann sollte mein Code funktionieren, aber für jede Klasse sollte Makro-Ersetzungen vorschreiben, hier ist mein Beispiel, es scheint zu funktionieren, aber ich werde noch überprüfen:

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

und im Code des Expert Advisors füge ich nur ein #include <fileMyclass.mqh> ein

in Ihrem Beispiel müssen alle drei Dateien (ganz unten im Code) mit meinen Makro-Ersetzungen geschlossen werden (und die Namen m_class2 , m_class3... ersetzen)

Andrey Khatimlianskii:

Bereits vorgeschlagene Lösung für Ein-Typ-Klasse: erben Sie es von CObject, und fügen Sie Makro-Substitution zu Klassen-Manager, die alle hinzugefügten Instanzen in CArrayObj speichern wird, Schleife durch sie und rufen Sie erforderliche OnXXX-Funktion.

Ich habe es auch nicht geschafft, dies für verschiedene Bibliotheken zu implementieren. Um mehrere Bibliotheken mit solchen Makros in einer Zeile zu verbinden, und OnTick aller Bibliotheken aufzurufen.

Beispiel benötigt wird, weiß ich nicht, wie und funktionierte nicht mit "Makro-Substitution im Klassenmanager"

 
Andrey Khatimlianskii:

Um alle 3 Drucke zu erhalten: "Init 1", "Init 2" und "Init EA"

Manager machen. Das Beispiel des obigen Quellcodes hat gezeigt. Makros sind jedoch für andere Dinge gedacht.

 
Andrey Khatimlianskii:

Das ist ein bisschen kompliziert für mich, also habe ich es gegoogelt.

Es wird nicht schön sein, aber man kann es auf so etwas reduzieren:

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

Hier ist ein direkter Aufruf und ein Beispiel für eine Implementierung ohne 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();
}

Wenn die Klasse ImportFrom über eine Managerregistrierung und nicht-statische Funktionen verfügt, kann alles automatisch für alle importierten Funktionen aufgerufen werden.

 
TheXpert:

Hier ist ein direkter Aufruf und ein Beispiel für eine Implementierung ohne Manager.

Wenn die Klasse ImportFrom über eine Managerregistrierung und nicht-statische Funktionen verfügt, kann alles automatisch für alle importierten Funktionen aufgerufen werden.

Ich habe die Idee verstanden, danke.

Nicht 100 % transparent, aber besser als im Moment.