Détection de 5 chiffres

 
double pointsPerPip(){
   string suffix = StringSubstr(Symbol(), 6);
   int digits = MarketInfo("EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0){
      digits = MarketInfo("EURUSD", MODE_DIGITS);
   }
   if (digits == 0){
      return(1);
   }else{
      if (digits == 5){
         return(10);
      }
   }
   return(1);
}
J'essaie actuellement de trouver le moyen le plus sûr de détecter si nous avons besoin de 1 ou 10 comme multiplicateur de pip. Il y a des courtiers où ce symbole est appelé EURUSDm ou EURUSDiam ou d'autres absurdités bizarres ajoutées par les courtiers sans autre raison que de casser notre code et aussi il y a des noms de symboles qui n'ont pas exactement 6 caractères, comme GOLD ou GOLDm par exemple et le ci-dessus ne peut pas gérer cela.

Quelqu'un a-t-il un algorithme encore plus sophistiqué pour trouver les chiffres corrects ? Je pense que tout se résume au problème de trouver d'abord comment est exactement le nom du symbole de l'EURUSD et ensuite le reste est facile. Existe-t-il par exemple un moyen facile d'énumérer tous les symboles disponibles afin que je puisse rechercher un nom qui contient ou commence par "EURUSD" ?
 

D'habitude, je ne le vérifie qu'une fois dans la section de l'unité :

int mypoint;
int init()
{
if(MarketInfo(Symbol(), MODE_DIGITS)==3||MarketInfo(Symbol(), MODE_DIGITS)==5)
mypoint=10;
else mypoint=1;
}
...
 
Roger:

En général, je ne le vérifie qu'une fois dans la section init :

Votre code n'est pas infaillible, il y a des symboles avec 1 ou 2 (or) ou d'autres nombres de chiffres.

J'ai trouvé une meilleure méthode (je dois encore la tester avec d'autres courtiers). Il lit symbols.raw dans le dossier historique pour trouver le nom de eurusd et ensuite utiliser MarketInfo() ;

/**
* determine the pip multiplier (1 or 10) depending on how many
* digits the EURUSD symbol has. This is done by first
* finding the exact name of this symbol in the symbols.raw
* file (it could be EURUSDm or EURUSDiam or any other stupid name
* the broker comes up with only to break other people's code) 
* and then usig MarketInfo() for determining the digits.
*/
double pointsPerPip(){
   int i;
   int digits;
   double ppp = 1;
   string symbol;
   int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ);
   int count = FileSize(f) / 1936;
   for (i=0; i<count; i++){ 
      symbol = FileReadString(f, 12);
      if (StringFind(symbol, "EURUSD") != -1){
         digits = MarketInfo(symbol, MODE_DIGITS);
         if (digits == 4){
            ppp = 1;
         }else{
            ppp = 10;
         }
         break;
      }
      FileSeek(f, 1924, SEEK_CUR);
   }
   FileClose(f);
   return (ppp);
}
 

C'était un code pour une seule devise. Si vous voulez utiliser votre EA pour plusieurs devises, vous devez le calculer pour chaque cas séparément.

 
7bit:
J'ai trouvé une meilleure méthode (il faut encore la tester avec d'autres courtiers). Il lit les symboles.raw dans le dossier historique pour trouver le nom de eurusd et ensuite utiliser MarketInfo() ;

Cette méthode serait cassée si le fichier symbols.raw était modifié (et pourrait ne pas fonctionner avec les anciennes versions de MT4... bien que ce ne soit probablement pas un problème).

 
J'utilise une méthode identique à celle de Roger et cela ne m'a pas encore posé de problème.
Cela fonctionnera dans la plupart des cas. Si, à l'avenir, vous trouvez un modèle qui ne convient pas, il vous suffira de traverser le pont quand vous le trouverez.

CB
 
//++++ These are adjusted for 5 digit brokers.
double  pips2points,    // slippage  3 pips    3=points    30=points
        pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int init() {
    if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
 
WHRoeder:
if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.

Vous ne faites que répéter la même chose que j'ai déjà trouvé insuffisante. L'utilisation de la variable Digits seule n'aide pas le problème (le problème a été défini par moi dans le premier message) car elle ne prend pas en compte le symbole sur lequel elle fonctionne actuellement et le nombre de chiffres que ce symbole devrait avoir. Il peut y avoir n'importe quel nombre de chiffres de 0 à 5 sur certaines paires exotiques, pas seulement 5 ou 3 contre 4 ou 2. Si c'était si simple, je n'aurais pas ouvert ce fil de discussion. C'est pourquoi je n'utilise plus que les chiffres d'eurusd, quelle que soit la paire sur laquelle il fonctionne. Trouver le nom réel d'eurusd était le plus gros problème, et jusqu'à présent la méthode symbols.raw semble être la plus simple et la plus fiable.
 
cloudbreaker:
Si vous en trouvez un qui ne convient pas à l'avenir, il vous suffit de traverser ce pont quand vous le trouverez.

J'essaie d'écrire un code infaillible qui ne se casse pas. Écrire (sciemment) du code bogué et attendre qu'il se casse avant de le réparer ne correspond pas à ma philosophie sur la façon dont le développement de logiciels devrait être fait.
 
7bit wrote >>
J'essaie d'écrire un code infaillible qui ne se casse pas. Écrire (sciemment) du code bogué et attendre qu'il se casse avant de le corriger ne correspond pas à ma philosophie sur la façon dont le développement de logiciels devrait être fait.


Je ne dirais pas que le code ci-dessus est "bogué" - il a simplement ... des limitations, dont les utilisateurs sont bien conscients.
La beauté de la philosophie est qu'elle peut fonctionner de manière asynchrone avec l'aspect pratique :)
-BB-
 
Ne s'agit-il pas simplement (peut-être pas si simple en termes de mathématiques) de déterminer ce que représente un point par rapport à un prix donné, puis de décider dans quel chiffre il se trouve par rapport aux chiffres du prix ?
Une façon simple d'y parvenir pourrait être de prendre un prix, d'ajouter un point et de le comparer à votre multiplicateur + le même prix ; si le résultat n'est pas le même, augmentez votre multiplicateur en boucle jusqu'à ce qu'ils correspondent.