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.
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).
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; }
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.
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 corriger ne correspond pas à ma philosophie sur la façon dont le développement de logiciels devrait être fait.
La beauté de la philosophie est qu'elle peut fonctionner de manière asynchrone avec l'aspect pratique :)
-BB-
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.
- 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
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" ?