Détection de 5 chiffres - page 6

 
cameofx 2010.07.29 10:52

I use below functions now, and it's usable across different brokers & instruments.

double vPoint; 
if(Digits == 2 || Digits == 4) vPoint = Point; else
if(Digits == 3 || Digits == 5) vPoint = Point*10; // I use this for my indies; call once on init() & use where Point supposed to be used in start() 

double Poin() 
{ 
   int d = Digits;
   switch(d){
   case 2 : {return(Point); break;}
   case 4 : {return(Point); break; }
   case 3 : {return(Point*10); break;}
   case 5 : {return(Point*10); break:}
   default : return;
} // I just come up with this. Untested but should be ok/robust. To be used to replace Point for trade parameters calculations. 

cheers, ~ cameo

Voici une solution alternative au problème que j'utilise...

int init()
  {
   double SymPoint;
   if (Point == 0.00001) SymPoint = 0.0001; //5 digits
   else if (Point == 0.001) SymPoint = 0.01; //3 digits
   else SymPoint = Point; //Normal
   
   return(0);
  }

Il suffit alors d'utiliser la variable SymPoint à la place de la variable Point. Très similaire à Cameo

 

Pour embrouiller un peu plus les choses, BrocoTrader a des titres avec 0 à 5 chiffres pour leurs différents titres...

 
kennyhubbard:

Bonjour 7bit,

Je pense que vous avez raison d'essayer de créer un code à l'épreuve des balles....... mais il y aura toujours des limites.

Il suffit de regarder le flux de démonstration de The Collective FX, où ils testent un flux indépendant combiné de différents fournisseurs de liquidités (par opposition à un flux unique agrégé de plusieurs sources), chacun avec son propre suffixe de paire de devises (avons-nous enfin trouvé une utilité au suffixe ?), pour réaliser l'ampleur du problème. Cela signifie qu'au sein d'une même plateforme, vous pourrez choisir entre EURUSD_fx ou EURUSDm ou EURUSD_dbfx à votre guise. Rien que cela va créer un trou énorme dans votre stratégie, car certains de ces prix sont à 4 chiffres et d'autres à 5 chiffres.

Le "if (Digits == 3 || Digits == 5)" est à peu près le plus complet que vous puissiez trouver car il fonctionne sur la simple prémisse que vous n'avez que 2 types de courtiers : ceux qui ont des flux de pip entiers et ceux qui ont des flux de 1/10ème de pips. Ce cas couvre les paires de devises et les courtiers 2/3/4/5.

Pour ma propre information, avez-vous vu un cas qui serait une exception ? Dans le cas de l'or, il a toujours été coté à 2 chiffres et les nouveaux courtiers à 1/10ème de pips le cotent à 3 chiffres, donc même ce cas est bien couvert.

Je suggérerais de traiter simplement toutes les exceptions que vous trouvez comme telles et peut-être de coder en dur ce problème particulier plutôt que d'essayer de trouver une solution de fortune.


Une chose que j'ai remarquée lorsque cette conversation est abordée, c'est que les gens parlent d'un suffixe, mais jamais d'un préfixe. Il est possible d'avoir également un préfixe. J'ai rencontré un courtier qui avait un préfixe.

Je veux des produits aussi solides que possible pour mes clients, je ne veux pas prendre le risque de coder davantage pour réparer plus tard. L'ensemble de mon code pourrait être enveloppé autour de cette seule modification et cela pourrait me coûter plusieurs heures de travail pour parcourir des milliers de lignes de code afin de le modifier. Donc, faire les choses correctement dès la première fois réduit le risque et les frais de devoir revenir en arrière pour corriger le problème. Je suis également d'accord sur le fait qu'il s'agit d'un bug, mais pas tant un bug dans notre code qu'une faiblesse de MQL.

Cependant, j'ai également réfléchi à une solution. Une de mes solutions était de parcourir la liste des symboles et de trouver EURUSD en utilisant la sous-chaîne pour l'atteindre. Ensuite, j'ai obtenu la valeur de l'offre. Une fois que j'avais la valeur de l'offre, je pouvais faire un doubletostr, puis trouver un moyen de compter les caractères dans la chaîne, comme strlen ou quelque chose comme ça. C'est pénible, mais cela pourrait me donner une détermination à 4 ou 5 chiffres qui serait assez solide. A partir de là, je pourrais établir ma base pour les bizarreries comme Gold.

C'est juste une théorie, je n'ai pas encore essayé. Je suis trop occupé à essayer de mener à bien les projets en cours.

 

dans mon EA j'utilise ce code pour le calcul du Pip - ce Pip je l'utilise partout où j'ai affaire à des bools externes entrés en pips comme SL, TP, TS ou je veux voir le profit en pips ... testé sur 3 courtiers différents - pas de problème sur différentes paires, DAX 1/2 nombres décimaux ... oui je sais que cela ressemble aux posts précédents, mais c'est fonctionnel en direct ...


Pip = Point;
if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;
else if( Digits==1 || Digits==3 || Digits==5) Pip = 10*Point; 

dans mes autres indis j'essaie de chercher le symbole JPY aussi ... :-)

Tmp_int = StringFind(Symbol(), "JPY", 0);
if(Tmp_int<0) Pip = 10000;
else Pip = 100;
 
seic:

dans mon EA j'utilise ce code pour le calcul du Pip - ce Pip je l'utilise partout où j'ai affaire à des bools externes entrés en pips comme SL, TP, TS ou je veux voir le profit en pips ... testé sur 3 courtiers différents - pas de problème sur différentes paires, DAX 1/2 nombres décimaux ... oui je sais que cela ressemble aux posts précédents, mais c'est fonctionnel en direct ...


dans mes autres indis j'essaie de chercher le symbole JPY aussi ... :-)

Au lieu de chercher le JPY, je voudrais trouver le "Point" pour chaque devise. C'est ce que j'ai essayé :

  ObjectSetText("pi_Pair01",MarketInfo(Pair01,MODE_POINT));

L'attente serait de donner la valeur respective pour la paire stockée dans Pair01. Pourtant, cela ne renvoie que 0. Pourquoi cela ? Dans mon exemple, Pair01 est "AUDCAD" et l'indicateur est attaché à un graphique EURUSD.

En poursuivant mes expériences, je constate que cela fonctionne pour certaines devises, mais pas pour d'autres. C'est assez déroutant. MODE_DIGITS semble mieux fonctionner. Comment cela se fait-il ?

pi

 
seic:

dans mon EA j'utilise ce code pour calculer le Pip - ce Pip je l'utilise partout où j'ai affaire à des bools externes entrés en pips comme SL, TP, TS ou je veux voir le profit en pips ... testé sur 3 courtiers différents - pas de problème sur différentes paires, DAX 1/2 nombres décimaux ... oui je sais que ça ressemble à ce qui a été posté avant, mais c'est fonctionnel en direct ...

if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;

Seulement parce que vous êtes sur un courtier à 5 chiffres. Sur un courtier à 4 chiffres, PIP et Point sont les mêmes.
Qu'est-ce qu'un TICK ?-MQL4 et MetaTrader 4 - Forum de programmation MQL4

 

Et InstaForex a 4 chiffres pour USDSEK et USDNOK, et 5 pour EURUSD.


Je pense donc que vous devez avoir un tableau avec un paramètre pour chaque devise cotée pour obtenir le montant des pips et non des ticks.

Raison: