[ ... fonction de hachage ... ]
Pour mémoire, fbj a déjà fait quelque chose de similaire en utilisant la célèbre fonction de hachage djb2 : https://www.mql5.com/en/forum/120034/page2
le djb2 mentionné dans votre lien ci-dessus pourrait être écrit sans toutes les centaines de lignes qui l'entourent simplement comme :
int djb2(string key){ int i, h, k; for (i=0; i<StringLen(key); i++){ k = StringGetChar(key, i); h = (h << 5) + h + k; } return(h); }
le djb2 mentionné dans votre lien ci-dessus pourrait être écrit sans toutes les centaines de lignes qui l'entourent simplement comme : [...]
Je ne suis pas un expert en algorithmes de hachage, et encore moins en djb2 en particulier, mais je crois me souvenir que l'initialisation de la valeur de hachage (la variable h dans votre version) à 5381 est considérée comme significative, bien que personne ne sache exactement pourquoi.
* magic = makeMagicNumber(name+ Symbol() + Period());Je ne veux pas pinailler, mais vous devriez pouvoir l'utiliser également :
* magic = makeMagicNumber(WindowExpertName() + Symbol() + Period());Merci d'avoir posté le code (et l'article sur le hachage !).
Question - Je travaille sur une méthode pour ouvrir et fermer plusieurs ordres sur le même graphique, le même algorithme, etc.
Je l'aborde en 2 étapes
1) générer un MN de base (ce que le code ci-dessus semble faire) comme un entier. La base serait toujours la même pour chaque graphique/symbole/trame temporel.
2) générer un suffixe spécifique exprimé sous la forme d'un point décimal pour chaque ordre spécifique, une fois qu'un suffixe devient inutilisé, il devient à nouveau disponible.
Le MN serait donc XXXXXX.YYY où X est la base et Y le suffixe spécifique. Les suffixes commenceraient à .001 et seraient incrémentés de .001 pour chaque nouvel envoi. À chaque fin de commande, le suffixe le plus bas actuellement inutilisé serait attribué. De cette façon, je peux récupérer le MN plus tard en régénérant le MN de base et en passant en revue les suffixes.
Cela semble un peu trop compliqué. Existe-t-il une meilleure façon de procéder ?
Je posterai ce que j'ai quand ce sera terminé.
J'utilise simplement les 5 premiers chiffres pour la version de l'EA # et les 4 derniers pour le nombre de minutes sur lequel il est négocié.
En tant que NuB, je ne vois pas pourquoi vous voudriez ou auriez besoin d'un MagicNumber "crypté" ?
J'utilise simplement les 5 premiers chiffres pour la version de l'EA # et les 4 derniers pour le nombre de minutes sur lequel il est négocié.
Comment, dans votre exemple, le Symbol() peut-il faire partie du MN ? Vous avez un numéro d'EA et un numéro de Timeframe, mais qu'en est-il du symbole ?
J'identifie mes ordres par MN uniquement, mes boucles sur la liste des ordres ne comparent que OrderMagicNumber(), les vôtres devraient également vérifier le nom du symbole. J'ai quelques autres scripts indépendants qui font des choses avec la liste des ordres, par exemple tracer des graphiques d'équité des EA ou copier les transactions sur une autre plateforme, ils ont tous besoin uniquement du numéro magique pour identifier les transactions d'un EA spécifique sur une paire spécifique et une période spécifique.
Je n'utilise pas du tout de numéros de série pour mes différents EAs, j'utilise des noms courts de 4 ou 5 lettres pour tous mes EAs. Un EA nommé snowball.mq4 par exemple sera nommé "snow". Ce nom est câblé dans le code et n'est jamais modifié. J'utilise également ce nom court pour les commentaires d'ordre.
J'ai donc 3 éléments : le nom court, le symbole et la période. La façon la plus pratique de convertir cela en un MN est un hash. Je pourrais donner des numéros à mes EA au lieu de noms, mais il n'y aurait toujours pas de moyen facile de convertir le nom du symbole en un nombre. Un hash résout simplement tous ces problèmes à la fois.
En tant que NuB, je ne vois pas pourquoi vous voudriez ou auriez besoin d'un MagicNumber 'crypté' ?
J'utilise simplement les 5 premiers chiffres pour la version de l'EA # et les 4 derniers pour le nombre de minutes sur lequel il est négocié.
Vous devriez aussi voir ceci -> https://www.mql5.com/en/forum/120034
Le problème que je rencontre avec cette approche est que j'ai parfois des experts/symboles/horaires identiques sur le même compte. C'est pourquoi je préfère régler la magie elle-même manuellement.
Le problème que je rencontre avec cette approche est que j'ai parfois un expert/symbole/horaire identique sur le même compte. C'est pourquoi je préfère régler la magie elle-même manuellement.
Pourquoi ne pas utiliser les secondes ? TimeCurrent() renvoie un nombre qui sera toujours unique - du moins, en dehors de cette durée de seconde...
- Attribuez un numéro d'identification GlobalVariable à votre expert. Retournez-le avec WindowExpertName().
- Concaténer cet ID avec un compteur d'incrémentation (si vous attachez le même expert) et TimeCurrent().
- Si le nombre retourné par TimeCurrent() dépasse la taille autorisée. Il faut alors éliminer le nombre d'années et de mois jusqu'à ce que nous ayons le module de jours, heures, minutes et secondes.
Pourquoi ne pas utiliser les secondes ? TimeCurrent() renvoie un numéro qui sera toujours unique - du moins en dehors de cette seconde.
- Attribuez un numéro d'identification à votre expert. Renvoyez-le avec WindowExpertName().
- Concaténer cet ID avec un compteur d'incrémentation et TimeCurrent()
- Si le nombre retourné par TimeCurrent() dépasse la taille autorisée. Alors éliminez le nombre d'années et de mois jusqu'à ce que nous ayons le module de jours, heures, minutes et secondes.
Parce qu'alors vous devez garder un niveau de persistance pour cette magie. Que se passe-t-il si votre terminal redémarre ? La magie serait différente...
Parce qu'alors vous devez garder un niveau de persistance pour cette magie. Que se passe-t-il si votre terminal redémarre ? La magie serait différente...
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation