créer un numéro magique - page 4

 
7bit:

Non, ils peuvent être ce que vous voulez. tout comme le commentaire. voyez-les comme une sorte de commentaire numérique. Toutes les transactions manuelles ouvertes avec l'interface utilisateur MT4 normale auront le chiffre magique 0, de sorte que vous pouvez par exemple boucler sur tous les ordres et fermer/supprimer toutes les transactions manuelles et les ordres tout en laissant toutes les transactions EA intactes.

Pour identifier de manière unique un certain ordre, il existe le numéro de ticket.

Merci d'avoir éclairci ce point et d'avoir partagé votre point de vue. Fwiw, j'ai beaucoup appris...

 
7bit:
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = MathPow(2, count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}

Je n'ai pas besoin de MathPow(), pourquoi personne n'a vu cela ?
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
Je mets à jour le premier message maintenant.
 
7bit:
Je n'ai pas besoin de MathPow(), pourquoi personne n'a vu cela ?

Trois raisons principales me viennent à l'esprit :

  • Toute personne qui utilise déjà une fonction de hachage est peu susceptible de la remplacer par votre code, et ne se souciera donc pas des détails de votre code.
  • Les personnes qui n'utilisent pas encore de fonction de hachage, mais qui pensent que cela pourrait être une bonne idée, vont probablement se fier à un code comme le vôtre et ne se soucier que de savoir s'il fonctionne ou non, et non de savoir s'il est élégant ou optimisé.
  • Votre remplacement de MathPow() par une opération sur les bits fera gagner beaucoup moins d'une milliseconde par appel à makeMagicNumber(). Vous suggérez que makeMagicNumber() n'est appelé qu'une seule fois pendant la durée de vie d'un EA, dans init(). Par conséquent, votre changement économise moins d'une milliseconde par durée de vie de l'EA. C'est un changement tout à fait trivial (et qui réduit sans doute la clarté du code).
 
jjc: réduit sans doute la clarté du code

Je ne dirais pas que cela réduit la clarté. Mon intention principale est la clarté, l'élégance et la précision, pas la performance.

Je pourrais aussi utiliser la puissance, la multiplication, la division (et le modulo) pour faire le décalage de bits sans utiliser d'opérateurs bit à bit. Mais par souci d'élégance (et aussi de clarté), je devrais le faire exclusivement avec l'un ou l'autre, mais pas de manière mixte. Et puisque le sens de la fonction est de déplacer des bits, je ne ferais qu'obscurcir le code si je faisais des déplacements de bits avec des multiplications.

De plus, alors que l'addition et la multiplication peuvent être faites avec des entiers, la fonction MathPow() utilise en interne des logarithmes, sent l'approximation et est incroyablement complexe par rapport à ce que j'en ai besoin, elle utilise et renvoie une valeur double et cela n'a rien à voir avec une fonction entière qui ne doit déplacer que n bits.

J'aurais peut-être dû poser la question : pourquoi n'ai-je pas vu cela ? Pourquoi ai-je utilisé MathPow() en premier lieu ? Je ne le sais pas. La dernière fois que j'ai fait de l'assembleur c'était il y a 15 ans, aujourd'hui j'ai l'habitude de penser aux problèmes dans des abstractions plus élevées. Peut-être que c'était la raison. Quelque part dans mon cerveau, il y a une forte connexion avec le nième bit étant 2^n, j'ai juste écrit cela sans y penser une seconde. Un programmeur assembleur n'aurait jamais fait ça. Décaler à gauche est multiplier par 2, multiplier par 2 est décaler à gauche.

 
Hé les gars, je suis juste curieux de savoir pourquoi vous avez besoin de plus d'un expert exécutant le même tf, et le même symbole avec les mêmes paramètres ?

Ma solution pour la persistance est d'utiliser les 32 bits de l'int pour contenir les tf que j'utilise (10 d'entre eux), la version de l'expert ou la méthode de transaction qui a ouvert l'ordre (j'en ai 4). Il y a encore beaucoup de bits en réserve si j'en ai besoin. J'utilise les opérations bit à bit et quelques fonctions de conversion pour gérer cela. Je sais que d'autres font cela ou quelque chose de similaire, mais comme cela ne semble pas être suffisant pour vos situations, j'essaie toujours de comprendre la question que j'ai posée.
 
7bit:

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 ?

Ce ne serait pas le cas, mais le money management que j'utilise se base sur le MN. Donc dans ce cas, j'ai besoin qu'ils soient tous identiques pour que le MM prenne en compte toutes les transactions ouvertes. Je place toujours l'EA, y compris la version et les paramètres de priorité que j'utilise, dans le champ Commentaire de transaction afin de savoir quelle version et quelle période l'EA que je développe utilise et se connecte au testeur de stratégie MQL4 et peut les trier avec le numéro de transaction, la paire de devises ou le champ de commentaire. Lorsque je consulte le journal, il m'indique la devise de la transaction. Lorsque je les transfère dans Excel pour les analyser, je peux les trier selon le champ de mon choix.
Je vois les avantages de votre approche et je l'utiliserai peut-être à l'avenir. Mais étant un NuB, j'utilise MM à partir de la base de code de MQL4.Com. Donc, à ce stade de mon apprentissage de la programmation, MM n'est pas ma priorité. Cependant, si je trouve une meilleure méthode que je peux intégrer, je le ferai jusqu'à ce que MM devienne une priorité pour moi, je ne suis pas opposé à son utilisation. Nous, les NuBs, avons besoin de toute l'aide que nous pouvons obtenir !
En ce qui concerne le nom et/ou le numéro de version, le MN n'autorise que les chiffres et non les lettres.
Je n'ai pas parcouru votre code mais je suppose que votre algorithme convertit le nom en une partie de votre MN, auquel cas il ne vous indiquerait pas immédiatement la paire de devises à laquelle vous vous adressez.
 
FourX:
votre algorithme convertit le nom en une partie de votre MN, auquel cas il ne vous indiquerait pas immédiatement de quelle paire de devises vous vous adressez.

Il convertira de manière fiable toute chaîne de caractères en un nombre entier unique. Cette conversion est à sens unique, mais je n'ai jamais besoin de la reconvertir.

Tout ce dont j'ai besoin, c'est de savoir si les transactions portant le même numéro sont liées entre elles. Il s'agit simplement d'un numéro d'identification permettant de trouver facilement toutes les transactions de cette combinaison EA/symbole/TF spécifique avec un seul if() dans la boucle. La seule chose à savoir sur ce numéro est qu'il est unique pour chaque combinaison EA/symbole/trame temporel et qu'il est déterministe et ne changera pas si mon PC décide de se planter.

Toutes les transactions appartenant logiquement ensemble auront le même MN. Si, par la suite, j'ai besoin de savoir sur quel symbole ils ont été effectués (par exemple pour faire des statistiques à la fin du mois), je peux simplement utiliser OrderSymbol() sur ces ordres.

 
circlesquares wrote >>
Hé les gars, je suis juste curieux de savoir pourquoi vous avez besoin de plus d'un expert exécutant le même tf, et le même symbole avec les mêmes paramètres ?

Ma solution pour la persistance est d'utiliser les 32 bits de l'int pour contenir les tf que j'utilise (10 d'entre eux), la version de l'expert ou la méthode de transaction qui a ouvert l'ordre (j'en ai 4). Il y a encore beaucoup de bits en réserve si j'en ai besoin. J'utilise les opérations bit à bit et quelques fonctions de conversion pour gérer cela. Je sais que d'autres font cela ou quelque chose de similaire, mais comme cela ne semble pas être suffisant pour vos situations, j'essaie toujours de comprendre la question que j'ai posée.


Je ne peux pas parler pour les autres, mais j'ai un EA qui peut prendre un certain temps pour fermer un ordre, et il manque de nouveaux points d'entrée parce qu'il n'est pas encore fermé par l'ordre précédent. J'aimerais qu'il traite chaque entrée indépendamment et qu'il suive chaque transaction selon les règles qui lui sont propres (sl mobile, fermeture de la moitié lorsque le tp est atteint pour la première fois, etc).
 
joetrader:


Je ne peux pas parler pour quelqu'un d'autre, mais j'ai un EA qui peut prendre un certain temps pour fermer un ordre, et il manque de nouveaux points d'entrée parce qu'il n'est pas encore fermé de l'ordre précédent. J'aimerais qu'il traite chaque entrée de manière indépendante et qu'il suive chaque transaction selon les règles qui lui sont propres (sl mobile, clôture à moitié lorsque le tp est atteint pour la première fois, etc).

Je vois. Donc il est bloqué en attendant la réponse du serveur, et pendant ce temps vous pourriez ouvrir d'autres ordres ?

Mais, le fait que le contexte de la transaction soit occupé n'empêche-t-il pas toute action liée à l'ordre ?

Je suppose que tant que cela fonctionne, c'est tout ce qui compte vraiment.

 

Pas tant la réponse du serveur, mais le fait qu'un ordre soit ouvert. Ainsi, l'EA peut recevoir un signal d'achat et acheter, puis rester ouvert. Quelques heures plus tard, un autre signal d'achat arrive, mais comme l'EA a déjà une position ouverte, il n'achète pas car il attend de fermer le premier ordre. Mais il n'y a aucune raison de supposer que le premier signal d'achat sera plus rentable que le second ou qu'il y a quelque chose à gagner à attendre la clôture du premier avant de permettre à l'EA d'ouvrir des ordres supplémentaires. Mais je travaille encore dessus, donc pour moi c'est encore de la théorie :)

Raison: