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

 
Alexey Navoykov:

Tu vas trop loin ! Tout d'abord, il passe par la file d'attente des messages. Deuxièmement, vous devez effectuer des conversions supplémentaires (aller et retour). En plus, il y a une certaine validation en cours.

À propos, vous ne devez pas spécifier explicitement la taille de la structure. Il y a une taille pour cela.

  • Où avez-vous vu une file de messages à cet endroit ?
  • Il n'y a pas de conversions aller-retour. La même union est utilisée comme dans l'exemple de @fxsaber
  • Il n'y a pas non plus de validation.
  • Bien sûr, vous pouvez utiliser sizeof(...), mais comme il s'agissait de l'implémentation d'une tâche concrète et non d'une tâche universelle, j'ai simplement dû l'écrire plus court en 3 chiffres.

Peut-être avez-vous regardé un autre code.

HH la seule chose que je n'aime pas dans ma version : j'ai dû doubler la taille de la ligne pour contourner les zéros, car le zéro est perçu comme la fin de la ligne. Je sens au fond de moi qu'il existe une solution plus simple, mais je ne l'ai pas trouvée. Mais ça marche quand même plus vite.

 
Nikolai Semko:

  • Où avez-vous vu une file d'attente de messages ?

SetWindowText/GetWindowText ne sont pas envoyés par des messages ?


Il n'y a pas de conversions aller-retour.

Bien sûr que oui. Qu'est-ce que c'est que cette agitation ?

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Alexey Navoykov:

SetWindowText/GetWindowText ne sont pas envoyés par des messages ?

Et vous parlez de messages Windows... Et alors ? Existe-t-il une alternative plus rapide pour échanger des données entre différents programmes dans le windos sans dll homebrew ?

Je comprends que vous ayez été offensé par mes paroles, que ma variante soit rapide. D'abord, je ne l'ai pas affirmé, je l'ai seulement suggéré. Deuxièmement, j'ai étayé mon hypothèse par un code de test, en le comparant auMemory Mapping.
Et si vous essayez de réfuter ne serait-ce qu'une supposition, ne fondez pas votre réfutation uniquement sur des déclarations. Je vous serai très reconnaissant si vous pouvez me dissuader et m'indiquer la mise en œuvre plus rapide de l'échange de données entre terminaux sans aucune dll auto-écrite.

Je n'exclus pas que la variante via le disque RAM soit beaucoup plus rapide. Mais il s'agit d'un sujet légèrement différent, car il nécessite l'installation d'un disque RAM et sa configuration.

Alexey Navoykov:

Bien sûr. Mais c'est quoi cette danse avec des tambourins :

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];

Tant pis pour les tambourins. C'est une banalité. Et cette banalité, d'ailleurs, est réalisée en 50-60 ns, alors que tout le bloc de réception de la structure tick est réalisé en 90 µs (90 000 ns.), c'est-à-dire que ces "diamants" n'occupent que 0,06 % du temps de réception du bloc de données. De plus, j'ai écrit que ce point ne me dérange que dans la perspective du doublement de la mémoire.

Et donc ma variante semble très pratique, simple et intelligente pour l'échange de petites structures de données.

 
Nikolai Semko:

  • La seule chose que je n'aime pas dans ma version : j'ai dû doubler la taille de la ligne pour contourner les zéros, car le zéro est perçu comme la fin de la ligne. Je sens au fond de moi qu'il existe une solution plus simple, mais je ne l'ai pas trouvée. Mais ça marche quand même plus vite.

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

Bibliothèques : HistoryTicks

Négociation Automatisée, 2018.03.29 11:09

  • Il existe des fonctions multiplateformes dans les sources( fichierData_String.mqh) qui vous permettent d'insérer/extraire n'importe quelle donnée dans/depuis une chaîne. Par exemple, il permet d'échanger facilement n'importe quelle donnée entre n'importe quel programme MQL en utilisant les paramètres de chaîne (sparam)des événements utilisateur;
#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    const string Str = DATA_STRING::ToString(Tick);
    
    MqlTick Ticks[1];
    
    Ticks[0] = DATA_STRING::FromString<MqlTick>(Str);
    ArrayPrint(Ticks);
  }
}
 
fxsaber:

Wow !
Je ne connaissais même pas les fonctions comme CryptEncode etCryptDecode. Merci !
Je vais y jeter un coup d'oeil.
À première vue, tout cela semble être de la haute technologie, mais d'une lenteur insensée. En effet, la fonction CryptEncode fonctionne deux ordres de grandeur plus lentement (microsecondes contre dizaines de nanosecondes) que ce que l'on a appelé ici des tambourins :

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Nikolai Semko:

Je suppose que vous avez été offensé par le fait que je dise que ma version était rapide. D'abord, je ne l'ai pas affirmé, j'ai juste fait une supposition. Deuxièmement, j'ai étayé mon hypothèse par un code de test, en le comparant auMemory Mapping.

Je n'ai pas parlé de "rapidité" mais de"il peut être plus rapide que toutes les solutions existantes", et j'ai donc fait plusieurs remarques sans aucune attaque. Et ces remarques étaient tout à fait justes. Mais vous, pour une raison quelconque, vous commencez par le nier avec persistance ("peut-être avez-vous dû regarder un autre code"), puis vous vous lancez dans le "et alors ! Alorsséparons les mouches des escalopes.

Deuxièmement, en ce qui concerne MemoryMapping (plus précisément, son wrapper MQL), je n'ai jamais dit qu'il était rapide. De plus, dans le fil de discussion sur ce projet ici, j'ai signalé les bugs de l'auteur qui créent des décalages et comment les corriger. Donc, si vous devez tester quelque chose, testez-le dans sa forme native, et non sous la forme des mauvaises décisions de quelqu'un d'autre.

 
Nikolai Semko:

ZZY Mais à première vue, tout cela est de la haute technologie, mais d'une lenteur insensée, car la fonction CryptEncode est plus lente de deux ordres de grandeur (microsecondes contre dizaines de nanosecondes) que ce qu'on appelle ici des tambourins :

A quoi sert la vitesse ?

 
Alexey Navoykov:

Je ne parle pas de "rapidité", mais de"cela peut être plus rapide que toutes les solutions existantes", et j'ai donc fait quelques remarques sans aucune attaque. Et ces remarques étaient tout à fait justes. Mais pour une raison quelconque, vous commencez par nier obstinément ("peut-être avez-vous regardé un autre code"), puis vous vous mettez dans la position "et alors ! Alorsséparons les mouches des escalopes.

Premièrement, mon message a été écrit avant que vous n'ayez cité votre code de test. Deuxièmement, en ce qui concerne MemoryMapping (plus précisément, son wrapper MQL mentionné), je n'ai jamais prétendu qu'il fonctionnait rapidement. De plus, dans le fil de discussion sur ce projet ici, j'ai signalé les bugs de l'auteur qui créent des décalages et comment les corriger. Donc, si vous devez tester quelque chose, testez-le sous forme native, et non pas en prenant les mauvaises décisions de quelqu'un.

Ok. D'accord. C'était trop fort.

Je voulais juste dire que l'utilisation éventuelle de user32.dll au lieu de kernel32.dll pourrait s'avérer plus rapide lors de la liaison de deux terminaux via WinAPI, puisque toutes les implémentations que j'ai rencontrées utilisaient kernel32.dll.

 
fxsaber:

A quoi sert la vitesse ?

Je suis désolé, je n'ai pas compris la question.
Vous vous demandez pourquoi vous avez besoin de la vitesse du pont entre les terminaux.

 
Nikolai Semko:

Je suis désolé, je n'ai pas compris la question.
Vous vous demandez pourquoi vous avez besoin de la rapidité de l'échange de données entre les terminaux ?

Oui.

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

Particularités du langage mql5, trucs et astuces

Nikolai Semko, 2018.09.21 13:20

Mais jusqu'à présent, à première vue, tout cela est certes high-tech, mais follement lent, car la fonction CryptEncode est exécutée deux ordres de grandeur plus lentement(microsecondes contre dizaines de nanosecondes) que ce qu'on appelle ici des tambourins :