Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'ai appelé ma fonction DoubleRound avec MODE_TICKVALUE (qui est 12,50) au lieu de MODE_TICKSIZE (0,25).
Je l'ai corrigé, mais cela n'a pas fait disparaître le #130
.
Voici un journal de l'erreur avec la ligne DoubleRound mise à jour :
pour comparaison, voici un log où cela a fonctionné :
en tout cas, cela semble fonctionner plus souvent maintenant, nous nous rapprochons définitivement :)
En tout cas, cela semble fonctionner plus souvent maintenant, nous nous rapprochons définitivement :)
Je ne vois pas pourquoi la modification a échoué... Avez-vous obtenu un nouvel ordre d'achat ou de vente entre l'ordre d'envoi et l'ordre de modification ?
Tout ce que je peux suggérer maintenant, c'est que lorsque vous obtenez une erreur 130... imprimez tout à nouveau, l'offre, la demande (en utilisant MarketInfo), l'OOP, le niveau d'arrêt, le SL que vous essayez de définir, etc, etc...
J'ai appelé ma fonction DoubleRound avec MODE_TICKVALUE (qui est 12,50) au lieu de MODE_TICKSIZE (0,25).
L'erreur stoploss #130 n'apparaît plus. Les dernières étapes semblent avoir permis de cerner le problème.
Je vais poster un autre message après celui-ci, résumant toutes les étapes suivies. Ainsi, les autres personnes du forum qui luttent contre l'erreur #130 pourront utiliser ce fil de discussion comme référence.
Merci pour votre aide continue :).
shinobi
Merci pour votre aide permanente :).
shinobi
La technique la plus importante pour lutter contre les erreurs est la journalisation excessive. Produisez des sorties pour tout ce qui pourrait être lié de près ou de loin à l'erreur. Si vous définissez une fonction de journalisation que vous pouvez activer et désactiver, vous pouvez conserver le code après avoir résolu le problème.
Lors de l'initialisation de votre conseiller expert, vous devez consigner toutes les informations que MarketInfo peut vous communiquer : https://docs.mql4.com/constants/marketinfo.
Veillez également à toujours vérifier les valeurs de retour des fonctions, par exemple pour OrderModify :
Les courtiers ECN exigent que vous passiez des ordres séparés pour l'achat/la vente et le stoploss/le takeprofit. Vous devez donc diviser votre code en deux ordres comme ceci :
Pour les ordres de vente, vous devez remplacer OP_BUY par OP_SELL. Vous devez également vérifier les valeurs de retour de OrderSelect et OrderModify (voir Conseils généraux ci-dessus).
Certains courtiers exigent que le stoploss, le takeprofit et le slippage soient ajustés à 4/5 chiffres. Vous pouvez faire cela en mettant le code suivant dans votre fonction init() (merci WHRoeder) :
Ensuite vous devez multiplier stoploss, takeprofit et slippage avec pips2db1 avant de les envoyer au Broker.
Une autre cause possible est que les taux du marché ont changé entre le moment où le tick a activé l'Expert Advisor (EA), et celui où l'EA OrderSend() ou OrderModify() a été exécuté. Pour éviter ce problème, il y a deux solutions possibles :
La première consiste à utiliser : RefreshRates() avant d'utiliser des variables de marché prédéfinies comme : Ask et Bid. (ces variables obtiennent leurs valeurs lorsque le tick active l'EA).
La seconde consiste à ne pas utiliser du tout les variables de marché prédéfinies. Au lieu de cela, vous pouvez utiliser les valeurs actuelles du marché avec MarketInfo(). Au lieu de Ask, Bid et Point, utilisez
Si le stoploss ou le takeprofit sont trop proches du prix d'entrée, l'ordre sera rejeté. Afin d'éviter ce problème, vous devez tenir compte de l'écart actuel entre le Ask et le Bid. Là encore, il existe deux solutions :
La première consiste à calculer le spread et à l'ajouter/soustraire à votre stoploss/takeprofit.
La deuxième solution consiste à prendre implicitement en compte l'écart entre l'offre et la demande, lors du calcul du stoploss ou du takeprofit :
Les courtiers ont un certain niveau de stop. Si votre stoploss est inférieur à ce niveau, votre ordre sera rejeté. Vous pouvez vérifier le niveau stop avec MarketInfo(Symbol(), MODE_STOPLEVEL).
Pour éviter cela, vérifiez votre stoploss par rapport au niveau stop du courtier et ajustez-le si nécessaire :
Le Freeze Level est un concept similaire. Votre stoploss doit également être supérieur au niveau de gel du courtier. Vous pouvez vérifier le niveau de gel par MarketInfo(Symbol(), MODE_FREEZELEVEL).
Pour éviter cela, vérifiez à nouveau votre stoploss par rapport au niveau de gel du courtier :
Enfin, votre stoploss ou takeprofit peut être rejeté, car le symbole ne supporte que les stoploss/takeprofit qui correspondent à son ticksize. Le ticksize est la distance minimale sur laquelle le prix du symbole peut monter et descendre. Par exemple, si le prix est de 1000 et le ticksize de 0,25, alors le prix ne peut monter ou descendre que d'un multiple de 0,25 (0,25 * n, où n est un nombre naturel). Le prix peut donc monter de 0,25 pour atteindre 1000,25 ou descendre de 1,75 pour atteindre 998,25.
Pour tenir compte du ticksize, vous avez besoin d'une fonction pour arrondir les valeurs doubles à une certaine valeur de pas (par exemple, le 0,25 le plus proche). Voici une telle fonction :
Par exemple, appeler DoubleRound avec nombre = 1023.81234 et pas = 0.25 renverrait 1023.75. Si vous l'appelez avec 1023.967834, vous obtiendrez 1024.00.
Maintenant, avant d'envoyer le stoploss ou le takeprofit, arrondissez-le à la taille de tick du symbole avec :
Voici un petit exemple complet prenant en compte toutes les contre-mesures ci-dessus :
J'espère que cela vous aidera à vous débarrasser du numéro 130. Si la modification de votre code ne fonctionne pas, utilisez d'abord un exemple minimal, comme celui ci-dessus. Et ensuite, lorsque l'erreur disparaît, reprenez la modification dans votre code.
Bonne chance,
shinobi
Mes remerciements à Raptor, WHRoeder, SDC, BigAl, gjol et 35806 pour m'avoir aidé à me débarrasser de l'erreur et à mettre en place cette référence.