Discussion de l'article "L'utilisation de ORDER_MAGIC pour trader avec différents Expert Advisors sur un seul instrument"

 

Un nouvel article L'utilisation de ORDER_MAGIC pour trader avec différents Expert Advisors sur un seul instrument a été publié :

Cet article examine les questions du codage de l’information, en utilisant l’identification magique, ainsi que la division, l’assemblage et la synchronisation du trading automatique des différents Expert Advisors. Cet article sera intéressant pour les débutants, ainsi que pour les traders les plus expérimentés, car il traite la question des positions virtuelles, ce qui peut être utile dans l’implémentation des systèmes complexes de synchronisation d’Expert Advisors et de diverses stratégies.

Maintenant, nous allons essayer d’exécuter cet EA, mais sur plusieurs délais d’un instrument (pour les expériences, nous avons choisi un instrument aléatoire, qui est EURUSD: o)

Figure 2. Le conflit de deux Expert Advisors sur le même instrument sur des délais différents

Figure 2. Le conflit de deux Expert Advisors sur le même instrument sur des délais différents

Étant donné que les deux Expert Advisors fonctionnent sur un seul instrument et que le code n’indique pas le partage des positions, donc les deux Expert Advisors tentent de corriger la position de trading, en fonction des lectures de leurs indicateurs, et par conséquent, - un conflit surgit. L’Expert Advisor qui fonctionne sur M1, tente de faire tourner la position dans la Cellule, tandis que son rival cherche à l’arrêter. Il est évident que nous avons besoin d’un calcul séparé des positions, ce que nous allons faire maintenant.

Auteur : Nikolay Demko

 

Je ne sais pas qui ou comment, je préfère spécifier explicitement les numéros d'identification lorsque je crée mes propres énumérations (même si ce n'est pas nécessaire).

Par exemple, comme ceci :

enum Emagic
{
ENUM_DIGITAL_NAME      = 0, // nom numérique du conseiller
ENUM_CODE_INTERACTION  = 1, // code d'interaction
ENUM_EXPERT_SYMBOL     = 2  // le symbole sur lequel l'EA est lancé
};

Cela peut également être utile lors de la migration depuis MQL4, par exemple, c'est l'énumération que j'utilise pour travailler avec les commandes.

//ENUM_MT4_ORDER_TYPE
enum ENUM_MT4_ORDER_TYPE
//Types d'opérations commerciales
{
OP_BUY  = 0, //Achat 
OP_SELL = 1, //Vente 
OP_BUYLIMIT  = 2, // Ordre BUY LIMIT en attente 
OP_SELLLIMIT = 3, //Ordre en attente LIMITE DE VENTE 
OP_BUYSTOP   = 4, /Ordre d'achat STOP en attente 
OP_SELLSTOP  = 5  /Ordre de vente STOP en attente 
};

Cette approche est pratique, car quelle que soit la position de l'identifiant dans l'énumération, son code (valeur numérique) ne changera pas)....

Cette approche est également pratique si l'énumération doit contenir des identificateurs ayant une valeur négative.


PS

Article très intéressant, merci à l'auteur...

 
Interesting:

Je ne sais pas qui ou comment, je préfère spécifier explicitement les numéros d'identification lorsque je crée mes propres énumérations (même si ce n'est pas nécessaire).

Par exemple, comme ceci :

Cela peut également être utile lors de la migration depuis MQL4, par exemple, c'est l'énumération que j'utilise pour travailler avec les commandes.

Cette approche est pratique, car quelle que soit la position de l'identifiant dans l'énumération, son code (valeur numérique) ne changera pas)....

Cette approche est également pratique si l'énumération doit contenir des identificateurs ayant une valeur négative.


PS

Article très intéressant, merci à l'auteur...


Pour moi, ce n'est pas crucial, car lors de la déclaration d'une énumération, les valeurs sont assignées dans l'ordre automatiquement,

bien que je reconnaisse que votre variante est plus claire (surtout si les énumérations sont longues, disons plus de 3-4).

 

Avec une telle approche du magicien, il est nécessaire d'écrire la même instruction pour l'utilisateur - de sorte que l'utilisateur puisse clairement savoir quels magiciens seront occupés et lesquels sont libres. Les utilisateurs de conseillers experts n'utilisent pas uniquement les conseillers experts d'un seul développeur, et il est peu probable que la méthode soit incluse dans les normes utilisées par tous les rédacteurs de conseillers experts. Si les développeurs du terminal avaient divisé cet ulong en plusieurs variables, de sorte qu'il y ait plusieurs images, par exemple quatre de deux octets.

request.magic
request.id1
request.id2
request.id3

Ou au moins compléter le terminal avec une bibliothèque, de sorte qu'il puisse d'une manière ou d'une autre être inclus dans les normes.

SetMagic(Magic,Id1,Id2,Id3) 
 
Integer:

Avec une telle approche du magicien, il est nécessaire d'écrire la même instruction pour l'utilisateur - de sorte que l'utilisateur puisse clairement savoir quels magiciens seront occupés et lesquels sont libres. Les utilisateurs de conseillers experts n'utilisent pas uniquement les conseillers experts d'un seul développeur, et il est peu probable que la méthode soit incluse dans les normes utilisées par tous les rédacteurs de conseillers experts. Si les développeurs du terminal avaient divisé cet ulong en plusieurs variables, de sorte qu'il y ait plusieurs images, par exemple quatre de deux octets.

Ou au moins compléter le terminal avec une bibliothèque, de sorte qu'il puisse d'une manière ou d'une autre être inclus dans les normes.

Il n'est pas du tout certain que l'utilisateur doive rédiger des instructions sur le travail avec MAGIK, même si cela ne va pas au-delà de la description de la manière dont MAGIK est formé....

Je pense qu'il s'agit actuellement de l'un des meilleurs articles sur l'automatisation du commerce. Je dirai même plus - je suis moi-même un partisan du codage de MAGIC à un niveau plus sérieux que 777777 ou 555555, même si je préfère peut-être y mettre des informations plus détaillées que de dire que c'est l'auteur qui l'a fait.

Mais je n'ai pas réalisé qu'il fallait utiliser des structures (puisque l'idée de coder existe depuis MQL4), même si j'étais probablement sur le point de le faire....

Je ne pense pas non plus qu'il soit nécessaire d'"écrire" dans MAGIC des informations sur les symboles sur lesquels les opérations de transaction sont effectuées (cela est dû au fait que ces informations sont déjà stockées ailleurs et qu'elles ne changent pas depuis le moment de l'ordre jusqu'au moment de la clôture complète de la position). Je pense également qu'il suffira d'attribuer les trois derniers chiffres du MAGIC (à défaut d'utiliser le code de sécurité) au MARQUEUR (OU MARQUEUR, je ne dirai pas exactement ce qu'il en est dans le génie génétique) de l'EXPERT.

En effet, dans le PREMIER de ces chiffres, vous pouvez encoder 9 à 10 classes de base d'experts, et dans les deux autres son numéro unique du point de vue de l'utilisateur ou du développeur. Par conséquent, vous obtiendrez normalement entre 900 et 1000 combinaisons.

Je préfère également un algorithme dans lequel le conseiller expert reconnaît au moins les ordres définis par le trader et les code en conséquence.

PS

Je ne pense pas qu'il faille craindre que plusieurs EA confondent le MAGIC codé, du moins je pense qu'avec une certaine approche, ce n'est pas aussi dangereux (et probablement probable) qu'il n'y paraît à première vue. En particulier, il n'est pas important que tous ces experts (même s'ils appartiennent à des auteurs différents) soutiennent cette méthodologie de cryptage du MAGIC et prennent en compte les actions des autres. Dans l'idéal, un seul expert devrait négocier sur telle ou telle paire.....

 

L'article donne un exemple d'utilisation de codes, tous les chiffres ne sont pas utilisés et le codage est manifestement excédentaire,

Si nécessaire, même ces 9 bits occupés peuvent être compressés.

Outre l'identification du magicien (ces 9 bits restants), il est également possible de transférer l'état de la balance au moment de passer une commande.

Comme il est peu probable que le solde prenne plus de 6 bits, il y a encore de la place pour un codage quelconque.

 
Urain:

L'article donne un exemple d'utilisation de codes, tous les chiffres ne sont pas utilisés et le codage est manifestement excédentaire,

Si nécessaire, même ces 9 bits occupés peuvent être compressés.

Outre l'identification du magicien (ces 9 bits restants), il est également possible de transférer l'état de la balance au moment de passer une commande.

Comme il est peu probable que le solde prenne plus de 6 bits, il reste de la place pour un codage quelconque.

A tout cela, il faut ajouter 1000 ou 10000 et les soustraire avant le décodage, de façon à garantir une plage de magies non occupée par votre méthode.

 
Integer:

A tout cela, il faut ajouter 1000 ou 10000, et avant le décodage, soustraire, de sorte qu'il y a une plage garantie de non occupée par votre méthode de magiks.

Eh bien, comment faire cela sans douleur décrit dans l'article (juste besoin d'un peu de travail pour étendre la gamme de cryptage),

Je ne vois aucun problème.

PS le seul point mince ne doit pas oublier de traduire le solde en entier sinon la virgule va donner un glitch, comment le faire devrait être vu sur le binding si le compte cent alors multiplier par 100 si une telle précision n'est pas nécessaire alors la traduction en int avec trimming.

 
Urain:

Eh bien, la façon de le faire sans douleur est décrite dans l'article (il suffit d'une petite mise au point pour étendre la gamme de cryptage),

Je ne vois aucun problème.

PS le seul point faible ne doit pas oublier de traduire le solde en entier sinon la virgule va donner un pépin, comment le faire devrait regarder la liaison si le compte est cent alors multiplier par 100 si une telle précision n'est pas nécessaire alors la traduction en int avec l'écrêtage.

S'il n'y a pas de problème, donnez une instruction courte et claire, comment garantir la non-intersection des magies encodées par votre système et non encodées.

 
Integer:

Si ce n'est pas un problème, donnez une instruction courte et claire sur la manière de garantir la non-intersection des magiks codés par votre système et non codés.

Pour que ma réponse ne ressemble pas à une excuse, je dirai tout de suite que cette question n'est pas prise en compte, mais qu'elle est autorisée.

Voici la valeur maximale de ulong 18 446 744 073 709 551 615 ces 17*10^18 a tous les champs libres. Стоит добавить при кодировании 17 000 000 000 000 000 и поставить при декодировании проверку содержит ли 20 и 19 разряд числа 1 и 7 и вы гарантировано пределите кодированый ли магик или нет.

//+------------------------------------------------------------------+
//| La fonction renvoie un magik préfabriqué assemblé à partir des données d'entrée ||
//+------------------------------------------------------------------+
ulong Cmagic::SetMagic_request(int digital_name=0,int code_interaction=0)
  {
   if(digital_name>=1000)Print("Le nom numérique du conseiller est mal défini (supérieur à 1000)");
   if(code_interaction>=1000)Print("Code d'identification extraterrestre incorrect (supérieur à 1000).");
   mag.digital_name     =digital_name;
   mag.code_interaction =code_interaction;
   mag.expert_symbol    =symbolexpert();
   mag.magicnumber      =17000000000000000000+// вот эта вставка даст 20 разрядов магику
                         mag.digital_name*(int)pow(1000,2)+
                         mag.code_interaction*(int)pow(1000,1)+
                         mag.expert_symbol;
   return(mag.magicnumber);
  }

et dans le décodeur.

//+------------------------------------------------------------------+
//| La fonction divise le magik en trois parties de trois chiffres ||
//|| et renvoie la partie pointée par la catégorie |
//+------------------------------------------------------------------+
int Cmagic::decodeMagic_result(int category)
  {
   string string_value=(string)mag.magicnumber;
   int rem=(int)MathMod(StringLen(string_value),3);
   if(rem!=0)
     {
      rem=3-rem;
      string srem="0";
      if(rem==2)srem="00";
      string_value=srem+string_value;
     }
   int start_pos=StringLen(string_value)-3*category;
   string value=StringSubstr(string_value,start_pos,3);
   if(StringLen(string_value)!=20)return((int)StringToInteger("0"));//если магика не 20 разрядов значит не кодированный
   return((int)StringToInteger(value));
  }

c'est comme ça, et n'oublie pas Dimitri que celui qui veut faire cherche une opportunité et celui qui ne veut pas faire cherche une raison, j'ai ouvert une fenêtre en ton pouvoir pour en faire une fenêtre ou même une porte.

D'ailleurs, j'utilise ce

(int)pow(1000,2)

mais personne n'interdit de le réécrire en chaîne de caractères, simplement dans l'article je voulais montrer les deux méthodes et si possible les faire correspondre organiquement (donc l'encodage passe par int et le décodage par chaîne de caractères).

Et en général, je voulais montrer les possibilités et ne pas donner un convertisseur de boîte noire (il vaut mieux donner une pelle à un homme qu'un seau de porridge).

PS ici dit une chose en a codé une autre, ( j'ai un orage qui fait que le réseau est régulièrement mis hors service) codé la vérification pas 1 et 7 en 20 et 19 chiffres et la présence de ces mêmes chiffres ceux si le magik 20 chiffres signifie utilisé le codage, mais vous comprenez la vérification peut être rejouée.

 

1. merci à l'auteur pour cet article.
2.Que signifie l'expression (int) et quelle valeur elle prend en int DIGITS=(int)-log10(SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP)) ; if(DIGITS<0)DIGITS=0 ;
3.Pourquoi, lors des tests, l'expression (int) et SYMBOL_VOLUME_STEP prennent-elles les valeurs Unknown identifier et comment cela affecte-t-il le résultat int DIGITS ?
4. Comment fonctionne le code d'interaction ?
Le code d'interaction a-t-il une importance lorsque les EA travaillent sur le même instrument, où il suffit de définir des noms numériques identiques ou différents pour les EA.