Erreurs, bugs, questions - page 2347

 
fxsaber:

Je ne peux même pas obtenir un exemple de ce que je veux obtenir. Tu peux me montrer ?

MaClasse_1.mqh :

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


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


Pour obtenir les 3 imprimantes à la suite de l'exécution : "Init 1", "Init 2" et "Init EA".

 

Bonjour à tous.

J'appelle la fonctionIndicatorParameters depuis l'expert, mais je reçois l'erreur 4014. Qu'est-ce que cela peut être ? Construire 1960.

 
Andrey Khatimlianskii:

Pour connecter plusieurs bibliothèques avec de telles macros dans une ligne, et pour appeler OnTick pour appeler toutes les bibliothèques OnTick.

Faire un wrapper macro autour de l'importation qui forme une classe par le nom de la bibliothèque (class##libname) et utilise le contexte pour l'appel à l'intérieur du wrapper (libname::oninit).

et la classe est déposée dans le gestionnaire ci-dessus.

mais pour chaque lib une ligne séparée.

 
TheXpert:

Faire une macro enveloppante autour de l'importation qui forme une classe par le nom de la bibliothèque (class##libname)

C'est un peu difficile pour moi, alors je vais chercher sur Google.

 
Kuzmich:

Bonjour à tous.

J'appelle la fonctionIndicatorParameters depuis l'expert, mais je reçois l'erreur 4014. Qu'est-ce que cela peut être ? Construire 1960.

Si vous avez 3 inludniks, alors mon code ci-dessus devrait fonctionner, mais pour chaque classe devrait prescrire des substitutions de macro, voici mon exemple, il semble fonctionner, mais je vais encore vérifier :

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

et dans le code du conseiller expert, je n'en inclus qu'un seul #include <fileMyclass.mqh>

dans votre exemple, les trois fichiers doivent être fermés (tout en bas du code) avec mes substitutions de macro (et substituer les noms m_class2 , m_class3...)

Andrey Khatimlianskii:

Solution déjà proposée pour une classe de type unique : hériter de CObject et ajouter une macro de substitution au gestionnaire de classe qui stockera toutes les instances ajoutées dans CArrayObj, les parcourra en boucle et appellera la fonction OnXXX requise.

Je n'ai pas non plus réussi à implémenter cela pour différentes bibliothèques. Pour connecter plusieurs bibliothèques avec de telles macros dans une ligne, et pour appeler OnTick de toutes les bibliothèques.

Un exemple est nécessaire, je ne sais pas comment et je n'ai pas travaillé avec "substitution de macro dans le gestionnaire de classe".

 
Andrey Khatimlianskii:

Pour obtenir les 3 imprimantes : "Init 1", "Init 2" et "Init EA" à la suite de l'exécution.

Faites manager. L'exemple du code source ci-dessus a montré. Les macros servent à autre chose, cependant.

 
Andrey Khatimlianskii:

C'est un peu compliqué pour moi, alors je l'ai googlé.

Ça ne va pas être joli, mais vous pouvez le réduire à quelque chose comme ça :

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

Voici un appel direct et un exemple de mise en œuvre sans gestionnaire.

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

Si la classe ImportFrom dispose d'un gestionnaire d'enregistrement et de fonctions non statiques, tout peut être appelé automatiquement pour tous les éléments importés soit

 
TheXpert:

Voici un appel direct et un exemple de mise en œuvre sans gestionnaire.

Si la classe ImportFrom dispose d'un gestionnaire d'enregistrement et de fonctions non statiques, tout peut être appelé automatiquement pour tous les éléments importés soit

J'ai compris l'idée, merci.

Pas 100% transparente, mais mieux que ce qu'elle est actuellement.

 
Le développement logique de cette approche est le suivant

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : Rapport

fxsaber, 2018.12.14 23:51

Lorsque vous placez un EA sur un graphique, le rapport de backtest sur les nouvelles données actuelles s'ouvre immédiatement. Cela vous permet de voir immédiatement (un coup d'œil sur les graphiques permet de déterminer beaucoup de choses en une seconde) ce que l'EA a "négocié" avec les paramètres d'entrée donnés, et comment. Et en cas d'erreur aléatoire dans les paramètres d'entrée, déterminez-la rapidement.


Lorsque je lance un EA, je veux voir sur le graphique les transactions qu'il a effectuées. serait Le conseiller expert démarre un graphique et examine les transactions qu'il a effectuées dans le passé avec les paramètres d'entrée donnés. J'ai délibérément souligné la particule BY dans la phrase précédente. Je veux voir non pas ce qui a été négocié, mais ce qui aurait pu être négocié, si l'EA a fonctionné avec les paramètres spécifiés sur le compte pendant une longue période.


De nombreuses personnes sur ce forum ont créé ou utilisent des visualisateurs de l'histoire des graphiques. Veuillez parcourir les options les plus pratiques/visibles ici pour voir des idées sympas plutôt que de réinventer la roue. Si vous voulez voir l'historique du graphique, utilisez des flèches et des lignes pour montrer les positions fermées, c'est trop primitif. Nous en avons besoin uniquement pour les postes fermés, pas pour les postes fermés et pas pour les postes actuels.