Discussion de l'article "Échange de Données entre les Indicateurs : C'est facile"

 

Un nouvel article Échange de Données entre les Indicateurs : C'est facile a été publié :

Nous souhaitons créer un tel environnement, qui donnerait accès aux données d'indicateurs attachés à un graphique, et aurait les propriétés suivantes : absence de copie de données ; modification minimale du code des méthodes disponibles, si nous devons les utiliser ; Le code MQL est préférable (bien sûr, nous devons utiliser des DLL, mais nous n'utiliserons qu'une douzaine de chaînes de code C++). L'article décrit une méthode simple pour élaborer un environnement de programme pour le terminal MetaTrader, qui fournirait des moyens d'accès aux tampons d'indicateurs d'autres programmes MQL.

Comme on le voit, ce n'est pas difficile. Obtenez la liste des descripteurs par une sous-chaîne et lisez les valeurs du tampon indicateur à l'aide de nos fonctions. Et enfin, écrivons quelles foutaises là-bas (dans notre exemple, nous écrivons les valeurs qui correspondent à l'index de l'élément du tableau).

Exécutons maintenant l'indicateur de test (notre ATR cible doit toujours être attaché au graphique). Comme nous le voyons sur la Fig.3, les valeurs d' ATR sont dans la sous-fenêtre inférieure (dans notre indicateur de test), nous voyons la ligne droite à la place - en fait, elle est remplie des valeurs correspondant aux index du tableau.


Auteur : Alexey Subbotin

 
Il existe un avertissement très sérieux pour ceux qui utilisent fréquemment des fonctions DLL telles que Get/Set.


Pour des raisons de sécurité du système, chaque appel de DLL passe par un stripper spécial, qui ralentit l'exécution. L'appel d'une fonction DLL n'est pas un banal appel XXXX, mais un enveloppement complexe avec masquage d'adresse, contrôle de la pile et crashs à l'intérieur de la DLL. MQL5 fait en sorte que si une fonction à l'intérieur de la DLL perturbe la pile ou se bloque, l'exécution du script s'arrête sans bloquer le terminal lui-même.

Conseil général sur l'utilisation des fonctions DLL : essayez de faire de rares appels avec une grande quantité de travail à l'intérieur, plutôt que des dizaines de milliers d'appels par seconde avec de petits résultats.

 

Je m'interroge. Pourquoi ne pas aller plus loin ?

Comme Renat l'a souligné, appeler des fonctions bon marché à partir d'une dll est coûteux.

Alors pourquoi ne pas copier les données directement dans le tableau prévu à cet effet ?

 
TheXpert:

Je m'interroge. Pourquoi ne pas aller plus loin ?

À qui s'adresse la question : à l'auteur ou aux développeurs ?

Si c'est aux développeurs, que suggérez-vous exactement ?

 

Y a-t-il une erreur dans la fonction StringExplode ? Dans sa forme actuelle, elle ne copie pas le dernier composant de la chaîne s'il n'y a pas de délimiteur après lui (c'est-à-dire à la fin de la chaîne). Selon moi, la fin de la chaîne devrait être prise en compte même s'il n'y a pas de délimiteur à la fin. Exemple : nous introduisons la chaîne"EURUSD,EURJPY" avec le délimiteur "," et la fonction ne sélectionne plus que EURUSD.

Voici la version corrigée de la fonction, pour des raisons de commodité, j'ai renvoyé le nombre d'éléments :

int StringExplode(string s, string separator, string &result[])
{
  int i, pos;
  ArrayResize(result, 0);
   
  for(i = 0; ; i++)
  {
    ArrayResize(result, ArraySize(result) + 1);
    pos = StringFind(s, separator);
    if(pos >= 0)
    {
      result[i] = StringSubstr(s, 0, pos);
      s = StringSubstr(s, pos + StringLen(separator));
    }
    else
    {
      result[i] = s;
      i++;
      break;
    }
  }
  
  return(i);
}
 
Renat:
Il existe un avertissement très sérieux pour ceux qui utilisent fréquemment des fonctions DLL telles que Get/Set.


Pour des raisons de sécurité du système, chaque appel de DLL passe par un stripper spécial, qui ralentit l'exécution. L'appel d'une fonction DLL n'est pas un banal appel XXXX, mais un enveloppement complexe avec masquage d'adresse, contrôle de la pile et crashs à l'intérieur de la DLL. MQL5 fait en sorte que si une fonction à l'intérieur de la DLL perturbe la pile ou se bloque, l'exécution du script s'arrête sans bloquer le terminal lui-même.

Conseil général sur l'utilisation des fonctions DLL : essayez de faire des appels rares avec une grande quantité de travail à l'intérieur, plutôt que des dizaines de milliers d'appels par seconde avec le transfert de petits résultats.

À propos, une dernière remarque sur les appels multiples à la DLL : lors des tests, j'ai remarqué que des fuites de mémoire de plusieurs octets se produisaient à chaque appel.

marketeer:

N'y a-t-il pas d'erreur dans la fonction StringExplode ? Dans sa forme actuelle, elle ne copie pas le dernier composant de la chaîne s'il n'y a pas de délimiteur après lui (c'est-à-dire à la fin de la chaîne). Selon moi, la fin de la chaîne devrait être prise en compte même s'il n'y a pas de délimiteur à la fin. Exemple : nous introduisons la chaîne"EURUSD,EURJPY" avec le délimiteur "," et la fonction ne sélectionne plus que EURUSD.

Voici la version corrigée de la fonction, pour des raisons de commodité, j'ai renvoyé le nombre d'éléments :


Merci, je n'avais pas fait attention. Vous pouvez voir que le dernier élément du descripteur est un nombre aléatoire, qui n'a aucune signification.

---------

Je vous remercie ! Je mettrai en œuvre toutes les suggestions d'amélioration dans la mesure du possible. L'idée en elle-même est bonne, j'aimerais qu'elle ne soit pas bloquée.

 
Renat:

À qui s'adresse la question - à l'auteur ou aux développeurs ?

Si elle s'adresse aux développeurs, que suggérez-vous exactement ?

L'auteur. Vous pouvez passer la taille du tableau en même temps que lui, puis vous pouvez organiser une copie unique du tableau directement de la mémoire à la mémoire - c'est très bon marché et cela permet de contourner les problèmes de MQL4 avec les références élément par élément. J'ai beaucoup de choses à faire maintenant, sinon j'aurais écrit un exemple.... J'espère que vous avez compris l'essentiel.

Par avance... -- si vous utilisez des verrous et que vous implémentez le transfert correctement, cette approche devrait être sûre.

 

Comme c'est compliqué !...

Avec l'aide d'Ilnur, il y a un an, j'ai écrit une bibliothèque en MQL4 pour travailler avec la mémoire. Vous pouvez allouer de la mémoire, déplacer des pointeurs, écrire et lire, transférer le nom d'une zone de mémoire à un autre programme.

Tout est basé sur le mapping. Elle est beaucoup plus simple que celle proposée.

 
Zhunko:

Comme c'est compliqué !...

Avec l'aide d'Ilnur, il y a un an, j'ai écrit une bibliothèque en MQL4 pour travailler avec la mémoire. Vous pouvez allouer de la mémoire, déplacer des pointeurs, écrire et lire, transférer le nom d'une zone de mémoire à un autre programme.

Tout est basé sur le mapping. C'est beaucoup plus simple que l'approche proposée.

En effet, dans l'approche proposée, il n'est pas nécessaire d'allouer de la mémoire et de déplacer des pointeurs. Les lectures et les écritures sont organisées directement dans la mémoire tampon. C'est beaucoup plus simple que le mapping.
 
Renat:
Il existe un avertissement très sérieux pour ceux qui utilisent fréquemment des fonctions DLL telles que Get/Set.


Pour des raisons de sécurité du système, chaque appel de DLL passe par un stripper spécial, qui ralentit l'exécution. L'appel d'une fonction DLL n'est pas un banal appel XXXX, mais un enveloppement complexe avec masquage d'adresse, contrôle de la pile et crashs à l'intérieur de la DLL. MQL5 fait en sorte que si une fonction à l'intérieur de la DLL perturbe la pile ou se bloque, l'exécution du script s'arrête sans bloquer le terminal lui-même.

Conseil général sur l'utilisation des fonctions DLL : essayez de faire de rares appels avec une grande quantité de travail à l'intérieur, pas des dizaines de milliers d'appels par seconde avec de petits résultats.

Correction : depuis la version 240, les retards sur les appels de DLL ont été supprimés. Maintenant, ils se déroulent pratiquement sans délai, comme en mode natif.
 

Merci beaucoup à l'auteur, ce n'est pas une petite bibliothèque, avec une bonne utilisation et des croisements qui ne contredisent pas les lois de la génétique, on peut obtenir de bons résultats.

et "des croisements qui ne contredisent pas les lois de la génétique", on peut obtenir de bons résultats.

J'ai, par exemple, finalement "tiré" des données de graphiques hors ligne, en mode en ligne))). Plateforme MT4.


Une cuillerée de goudron)))

Plus d'une fois, il y a eu des situations où dans la liste des variables globales

dans la liste des variables globales étaient "anciennes" pour une raison quelconque et n'étaient pas supprimées.

Je n'ai pas encore trouvé la raison de ce phénomène.