J'ai maintenant rencontré un problème lorsque l'historique contient plus de 1000 transactions et lorsque j'appelle la fonction de traitement de l'historique, par exemple, pour calculer le bénéfice de l'historique. + L'information sur le graphique commence à ralentir et le terminal se raccroche. C'est-à-dire que les citations sont accompagnées d'un délai.
Il est décevant qu'il n'y ait pas d'héritage multiple dans MQL. Cependant, nous pouvons le faire fonctionner de toutes les manières possibles - avec des modèles et des macros - comment les éviter).
Voici ce que j'ai fait.Toutes les classes sources doivent être déclarées comme des modèles définissant la classe mère.
class CBase { }; // базовый класс// Макросы, задающие список наследования:#define INHERIT1(T) T<CBase>
#define INHERIT2(T1, T2) T2<INHERIT1(T1)>
#define INHERIT3(T1, T2, T3) T3<INHERIT2(T1,T2)>
#define INHERIT4(T1, T2, T3, T4) T4<INHERIT3(T1,T2,T3)>
// Различные пользовательские классы:template<typename TParent>
class A : public TParent { public: void a() { Print("A"); } };
template<typename TParent>
class B : public TParent { public: void b() { Print("B"); } };
template<typename TParent>
class C : public TParent { public: void c() { Print("C"); } };
class X : public INHERIT3(A, B, C) { }; // Объявляем класс, наследуемый от A, B, Ctemplate<typename T>
void SomeFunc(B<T>& obj) { obj.b(); } // Проверочная функция, принимающая класс BvoidOnInit()
{
X x;
x.a();
x.b();
x.c();
SomeFunc(x);
}
Bien sûr, il y a quelques subtilités, liées au fait que les classes sont héritées séquentiellement (dans l'ordre que nous avons défini), plutôt que simultanément (comme dans un véritable héritage multiple). En particulier, ils auront des priorités différentes lorsqu'une surcharge se produit. En outre, si une même classe de modèle participe plusieurs fois à la chaîne d'héritage, il s'agira de classes complètement différentes, qui ne sont en aucun cas liées les unes aux autres. Nous devons donc être prudents. Mais il n'y a aucun problème avec les interfaces, vous pouvez hériter sans restrictions.
Mais qu'en est-il sans déclaration sous forme de modèles ?
Par exemple, nous avons deux bibliothèques autosuffisantes prêtes à l'emploi :
classe CLib1 : public CClass1 { };et classe CLib2 : public CClass2 { } ;
Nous devons faire en sorte qu'il y ait un tel héritage dans la classe du programme :
CLib1--> CLib2 --> CProgram pour que les deux bibliothèques soient disponibles dans la classe CProgram. Et la bibliothèque CLib1 sera disponible dans CLib2.
Cela empêche les deux bibliothèques d'être modifiées de quelque façon que ce soit.
Est-ce possible ?
Avec un héritage multiple, ce serait probablement comme ceci classe CProgram : public CLib1,CLib2 { } ;
Par exemple, nous avons deux bibliothèques autosuffisantes prêtes à l'emploi :
classe CLib1 : public CClass1 { };et classe CLib2 : public CClass2 { } ;
Nous devons créer un tel héritage dans la classe du programme :
CLib1--> CLib2 --> CProgram pour que les deux bibliothèques soient disponibles dans la classe CProgram. Et la bibliothèque CLib1 sera disponible dans CLib2.
Cela empêche les deux bibliothèques d'être modifiées de quelque façon que ce soit.
Est-ce possible ?
Avec un héritage multiple, ce serait probablement comme ceci classe CProgram : public CLib1,CLib2 { } ;
La meilleure façon d'obtenir des données à partir des fonctions de copie asynchrones (CopyRates, CopyTicks, etc.) est probablement via EventChartCustom.
Il est possible de savoir que le serveur de transaction a changé, et pas seulement le compte -AccountInfoString (ACCOUNT_SERVER) dans OnDeinit (EA, pas indicateur) retournera le nouveau serveur de transaction.
Il existe toute une classe d'indicateurs qui superposent des graphiques d'autres symboles sur le graphique des prix. Ils se font de la même manière - par le biais de tampons indicateurs.
Cependant, dans MT5, il existe un merveilleux OBJ_CHART, qui vous permet de réaliser cette tâche de manière beaucoup plus belle et sans tampons d'indicateurs.
Par exemple, vous pouvez placer n'importe quel indicateur et voir immédiatement comment il se présente sur un autre symbole.
Schéma esclave - plusieurs graphiques sont affichés en arrière-plan du graphique principal.
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
J'ai maintenant rencontré un problème lorsque l'historique contient plus de 1000 transactions et lorsque j'appelle la fonction de traitement de l'historique, par exemple, pour calculer le bénéfice de l'historique. + L'information sur le graphique commence à ralentir et le terminal se raccroche. C'est-à-dire que les citations sont accompagnées d'un délai.
Sans le code, on ne peut que deviner.
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Particularités de mql5, trucs et astuces
Alexey Navoykov, 2017.07.21 17:04
Il est décevant qu'il n'y ait pas d'héritage multiple dans MQL. Cependant, nous pouvons le faire fonctionner de toutes les manières possibles - avec des modèles et des macros - comment les éviter).
Voici ce que j'ai fait.Toutes les classes sources doivent être déclarées comme des modèles définissant la classe mère.
Bien sûr, il y a quelques subtilités, liées au fait que les classes sont héritées séquentiellement (dans l'ordre que nous avons défini), plutôt que simultanément (comme dans un véritable héritage multiple). En particulier, ils auront des priorités différentes lorsqu'une surcharge se produit. En outre, si une même classe de modèle participe plusieurs fois à la chaîne d'héritage, il s'agira de classes complètement différentes, qui ne sont en aucun cas liées les unes aux autres. Nous devons donc être prudents. Mais il n'y a aucun problème avec les interfaces, vous pouvez hériter sans restrictions.
Mais qu'en est-il sans déclaration sous forme de modèles ?
Par exemple, nous avons deux bibliothèques autosuffisantes prêtes à l'emploi :
classe CLib1 : public CClass1 { };et
classe CLib2 : public CClass2 { } ;
Nous devons faire en sorte qu'il y ait un tel héritage dans la classe du programme :
CLib1--> CLib2 --> CProgram pour que les deux bibliothèques soient disponibles dans la classe CProgram. Et la bibliothèque CLib1 sera disponible dans CLib2.
Cela empêche les deux bibliothèques d'être modifiées de quelque façon que ce soit.
Est-ce possible ?
Avec un héritage multiple, ce serait probablement comme ceci
classe CProgram : public CLib1,CLib2 { } ;
Et sans déclaration type ?
Par exemple, nous avons deux bibliothèques autosuffisantes prêtes à l'emploi :
classe CLib1 : public CClass1 { };et
classe CLib2 : public CClass2 { } ;
Nous devons créer un tel héritage dans la classe du programme :
CLib1--> CLib2 --> CProgram pour que les deux bibliothèques soient disponibles dans la classe CProgram. Et la bibliothèque CLib1 sera disponible dans CLib2.
Cela empêche les deux bibliothèques d'être modifiées de quelque façon que ce soit.
Est-ce possible ?
Avec un héritage multiple, ce serait probablement comme ceci
classe CProgram : public CLib1,CLib2 { } ;
Vous ne perdrez rien si vous faites cela :
class CProgram { CLib1 lib1; CLib2 lib2; };Vous ne perdrez rien en faisant cela :
La meilleure façon d'obtenir des données à partir des fonctions de copie asynchrones (CopyRates, CopyTicks, etc.) est probablement via EventChartCustom.
Particulièrement pertinent pour les indicateurs.
Il est possible de savoir que le serveur de transaction a changé, et pas seulement le compte -AccountInfoString (ACCOUNT_SERVER) dans OnDeinit (EA, pas indicateur) retournera le nouveau serveur de transaction.
Mémo
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie
Mon mécontentement aux testeurs de stratégie. aux développeurs MQL
fxsaber, 2017.12.04 09:11
Résultat
Il existe toute une classe d'indicateurs qui superposent des graphiques d'autres symboles sur le graphique des prix. Ils se font de la même manière - par le biais de tampons indicateurs.
Cependant, dans MT5, il existe un merveilleux OBJ_CHART, qui vous permet de réaliser cette tâche de manière beaucoup plus belle et sans tampons d'indicateurs.
Par exemple, vous pouvez placer n'importe quel indicateur et voir immédiatement comment il se présente sur un autre symbole.
Schéma esclave - plusieurs graphiques sont affichés en arrière-plan du graphique principal.
Par exemple, vous pouvez lancer n'importe quel indicateur et voir immédiatement comment il se présente sur un autre symbole.
Schéma esclave - plusieurs graphiques sont affichés en arrière-plan du graphique principal.