MT5 et la vitesse en action - page 78

 
Valeriy Yastremskiy:

Comprendre correctement que la mémoire du terminal est empilée avec la mémoire du programme du terminal de mcl, tix et autres.

Non. Simply CopyTicks stocke le cache des ticks demandés pendant 10 secondes. Par exemple, si l'on demande 3 Go de mémoire, le terminal stockera ces 3 Go supplémentaires dans le cache. Le terminal total consommera 6 Go. Si vous faites ArrayFree et demandez 3 Gb pour un autre symbole, le terminal consommera 9 Gb. Et ainsi de suite.

 
Valeriy Yastremskiy:

Comprendre correctement que la mémoire du terminal s'ajoute à la mémoire des programmes mcl, tix et autres du terminal.

Bien sûr.
 
Nous avons besoin d'un script qui crée un symbole personnalisé basé sur l'historique des ticks de plusieurs symboles par la formule suivante
MqlTick Formula( const MqlTick &Symbol1_Tick
                 const MqlTick &Symbol2_Tick,
                 const MqlTick &Symbol3_Tick,
                 const MqlTick &Symbol4_Tick,
                 const MqlTick &Symbol5_Tick );

Il semblerait que 100 Mo de RAM devraient suffire pour cette tâche, même pour un milliard de tics. Mais dans MT5, vous ne pouvez pas résoudre cette tâche via CopyTicks.

Voilà la béquille :

  1. CopyTicks est appelé pour chaque symbole séparément (et nécessairement avec l'attente de la libération du cache après chaque appel), en écrivant l'historique des ticks dans ses fichiers correspondants via FileSave.
  2. Vient ensuite la lecture des tics à partir de ces fichiers et l'appel de la formule pour ceux-ci.

Oui, c'est une béquille effrayante, mais il n'y a pas d'autres options. Donc, vous ne pouvez pas travailler avec CopyTicks directement. Il est nécessaire d'utiliser des archives de fichiers des tics.


La plus grande consommation de mémoire sera en p.1. même avec la condition de s'attendre à la libération du cache après chaque appel. Dans ce cas, le p.2. fonctionnera gratuitement !

 

Je négocie sur 8 paires à la fois, avec plusieurs Expert Advisors sur chaque paire. Et bien qu'en termes de ressources il semble bon, l'utilisation de la mémoire n'est pas plus de 25%, le CPU n'est pas chargé plus de 10%, les décalages sont perceptibles, comme un nouveau graphique s'ouvre pendant quelques secondes, ainsi que dans le trading général. Peut-être existe-t-il des pratiques exemplaires, du moins dans l'abstrait, pour emballer tout cela et le faire fonctionner plus rapidement ? Je sais que vous virtualisez plusieurs Expert Advisors en un seul. Quels sont les pièges ? Comment l'envoi d'ordres commerciaux a-t-il été mis en œuvre ? A quoi dois-je faire attention ?

P.S. J'utilise moi-même la synchronisation via Virtual et je négocie via MT4Orders, 1 EA par graphique.

 
fxsaber:

De même. Prenez votre VPS. Les sélectionneurs de marché ne peuvent pas travailler dessus.

ZS Il serait bon de se débarrasser des hoquets qui se produisent depuis des mois. Exécutez ce script sur une machine avec une RAM infinie. Par exemple, je ne peux pas télécharger les ticks du 1er juin, un seul caractère à la fois. Il ne fait que suspendre CopyTicks sans consommer de ressources.

Faites un dump du terminal lorsqu'il se "bloque". Voyons quelle en est la cause.

 
traveller00:

Je négocie sur 8 paires à la fois, avec plusieurs Expert Advisors sur chaque paire. Et bien qu'en termes de ressources il semble bon, l'utilisation de la mémoire n'est pas plus de 25%, le CPU n'est pas chargé plus de 10%, les décalages sont perceptibles, comme un nouveau graphique s'ouvre pendant quelques secondes, ainsi que dans le trading général. Peut-être existe-t-il des pratiques exemplaires, du moins dans l'abstrait, pour emballer tout cela et le faire fonctionner plus rapidement ?

Utilisez un MT4Orders frais (où la gestion de l'historique est accélérée après la création de cette branche) et faites un instantané de l'environnement actuel : ordres et positions. J'ai tout ce qu'il faut pour voler.

Je sais que vous virtualisez plusieurs Expert Advisors en un seul. Quels sont les pièges ? Comment l'envoi d'ordres commerciaux a-t-il été mis en œuvre ? A quoi dois-je faire attention ?

J'utilise un OrderSend synchrone, mais je désactive les contrôles MT5.

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

Bibliothèques : MT4Orders

fxsaber, 2020.09.29 08:45

Avec cette ligne.

MT4ORDERS::OrderSend_MaxPause = 0; // Отключение проверки корректности работы MT5-OrderSend.

peut être utilisé pour tout désactiver. Peut être utile en cas d'historique de transactions MT5 lent, car MT4Orders vérifie l'exactitude (et même corrige) de MT5-OrderSend parfois en se référant à cet historique.

Je ne recommande pas de le faire.


Chaque ensemble (ensemble de paramètres d'entrée) est doté de son propre virtuel. Le synchronisateur passe en revue tous les virtuels et effectue la synchronisation pour chacun d'eux. Il doit le faire en boucle, et non dès le premier virtuel.

Après tout appel à OrderSend (à l'intérieur du synchroniseur), un instantané est nécessairement réalisé et de nouveaux ticks sont ajoutés (à tous les Virtuals) qui sont arrivés pendant l'exécution de OrderSend. C'est-à-dire qu'après toute pause hypothétique, nous faisons tout recommencer.

Les ticks frais sont pris uniquement via CopyTicks à chaque fois. Pas de SymbolInfoTick à parcourir. Assurez-vous que si CopyTicks_LastTick.time_msc < SymbolInfoTick.time_msc (cela arrive souvent, même si les appels se succèdent (dans n'importe quelle séquence), alors le synchroniseur n'est pas activé. Sinon, vous risquez de constater que la limite de temps réelle est exécutée, mais pas la limite de temps virtuelle. Et il y aura des problèmes de synchronisation.

Je fais des instantanés avec VIRTUAL::Snapshot. En plus de la rapidité évidente, il vous permet également de séparer votre symbole du reste - seul votre symbole arrive à destination. Cela donne encore plus de vitesse. De plus, il n'y a pas que l'histoire qui est désactivée dans l'instantané,

#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Отказ от снепшота истории для повышения производительности

mais aussi des champs (marqués ci-dessous), qui nécessitent un accès à l'historique.

#define  MACROS(A) this.##A = ::Order##A();

  bool ORDERS::Copy( const bool WithoutHistory = false )
  {
    MACROS(CloseTimeMsc)

    if (WithoutHistory && !this.CloseTimeMsc) // Для исторических ордеров оставляем все без изменений.
    {
      const string Str = NULL;
      this.comment = Str;

      this.Commission = 0;
      this.OpenPriceRequest = this.OpenPrice;
    }
    else // В MT4Orders требуется обращение к истории.
    {
      const string Str = ::OrderComment();
      this.comment = Str;

      MACROS(Commission)
      MACROS(OpenPriceRequest)
    }

Auparavant, je vérifiais également si LastDeal.time_msc n'était pas plus grand que LastTick.time_msc. Si cette condition n'était pas remplie, je refusais la synchronisation pour des raisons évidentes. Mais une telle vérification consomme beaucoup de ressources (elle fonctionne avec l'historique), j'ai donc refusé.


Fonction Trade On - OnTick.


J'ai probablement énuméré les principales.

 

Synchrone, j'en déduis que ce n'est pas seulement l'envoi d'ordres, mais tous les ordres commerciaux, y compris les modifications, les suppressions, etc.


SymbolInfoTick n'est pas lancé, parce que l'ordre des ticks peut se mélanger ? Et les CopyTicks sont exactement dans le bon ordre.


Il s'avère que SymbolInfoTick n'est nécessaire que pour vérifier l'heure et c'est tout ? Toutes les transactions, etc. sont corrigées uniquement parCopyTicks ?


Est-il utile d'essayer de regrouper plusieurs EA sur un seul graphique ? Rien d'impossible, mais j'essaie de comprendre si cela vaut la peine de se tracasser et de réécrire ou si le bénéfice sera minime ?

 
traveller00:

Est-il utile d'essayer de regrouper plusieurs EA sur un seul graphique ? Rien d'impossible, mais j'essaie de savoir si cela vaut la peine de se tracasser et de réécrire ou si le bénéfice sera minime ?

D'où viendrait le bénéfice ? Tout le monde attendra l'un d'entre eux lors des échanges.

Et il y a moins de parallélisme.

A moins que l'on puisse garder un seul cache de commandes pour tous, mais l'avantage est discutable...

 
Anton:

Prenez une photo du terminal lorsqu'il "raccroche". Voyez ce qui en est la cause.

Le code reproduisant le problème ne vous suffit-il pas ? Ou est-ce qu'il ne se reproduit pas ?

 
traveller00:

Synchrone, j'en déduis que ce n'est pas seulement l'envoi d'ordres, mais tous les ordres de transaction, y compris la modification, la suppression, etc.

Je voulais dire MT5-OrderSend.

SymbolInfoTick n'est pas passé, parce que l'ordre des ticks peut être gâché ? Et CopyTicks va exactement tout dans le bon ordre.

Parce qu'il y aura des trous.

Donc, SymbolInfoTick n'est nécessaire que pour la vérification du temps, c'est tout ?

Oui.

Tous les échanges, etc. se feront uniquement parCopyTicks ?

Seulement.

Est-il judicieux d'essayer de regrouper plusieurs EA sur un seul graphique ? Rien d'impossible, mais j'essaie de savoir si cela vaut la peine de se tracasser et de réécrire ou si le bénéfice sera minime ?

C'est une aide précieuse pour moi.


Chaque passe (en mode test unique) à la fin écrit ses insteps dans le même fichier. Ainsi, après avoir examiné certaines passes après l'optimisation, j'obtiens un fichier contenant les données de ces passes. Puis je les filtre dans ce fichier, en ne laissant que ce qui semble bon. Et je sélectionne simplement ce fichier à l'aide du FileSelectDialog lors du démarrage du robot. Ainsi, il négocie le portefeuille.


Il s'avère que l'optimisation prend 20 minutes. Aperçu des passes - 3 minutes. Leur filtre - 3 minutes. Mise en service du robot - secondes. Le robot n'a pas besoin d'être compilé. Garder la trace des versions et des graphiques - de la même manière.

Au démarrage, je peux voir le rapport de chaque jeu. À tout moment, je peux voir l'état du virtuel et de son homonyme du réel, et le raccourci clavier détaillé HTML-Report pour le virtuel et le réel. Tant pour un seul ensemble que pour l'ensemble du portefeuille.


Les statistiques de trading des Virtual étant spécialement rédigées rapidement, il est possible de comparer rapidement les jeux à la volée (à partir du clavier).

Dossiers :
clip0184.gif  64 kb