Caractéristiques du langage mql5, subtilités et techniques - page 61

 
Vladislav Andruschenko:

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.

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, C


template<typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit()
{
  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 { } ;

 
Artyom Trishkin:

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;
};
 
Koldun Zloy:

Vous ne perdrez rien en faisant cela :

Oui, je l'ai fait. Je voulais juste éviter les objets inutiles.
 

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

Action/type de programmeChangement de TF ou de symboleChangement de compte
IndicateurExécution de OnDeinit et OnInit, modification de l'objet global de la classe (réinitialisation complète).Rien ne se passe sauf que prev_calculé est remis à zéro.
EAExécuter OnDeinit et OnInit, l'objet global de la classe ne change pas.Exécution de OnDeinit et OnInit, modification de l'objet global de la classe (rechargement complet).
 
Compression de fichiers et mesure du temps d'exécution universel

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

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
} 

void OnStart()
{
  uchar Data[];
  uchar Key[1];
  uchar Result[];
  
  FileLoad("thousands_rubies_galaxy.bmp", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
  
  ArrayFree(Data);
  
  FileLoad("space_wind.wav", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
}

Résultat

826534
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 53334
306648
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 29029
 

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.

 
fxsaber:

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.

Y a-t-il une photo de ce à quoi cela ressemblerait ? Ce n'est pas très clair, je n'ai pas encore utiliséOBJ_CHART.
Raison: