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
La meilleure façon d'obtenir un stoploss correct est de penser correctement à l'écart. Le spread est la distance entre le Ask et le Bid. Ainsi, lorsque vous ajoutez un stoploss à un ordre d'achat en utilisant Bid - SL, le spread est automatiquement inclus et vous n'avez pas besoin de le coder, ce qui vous permet d'ignorer totalement le spread. Pour une transaction de vente, l'utilisation de Ask + SL a le même effet. Cependant, ATTENTION --- en période de faible volume de transactions, le spread s'élargit et vous pouvez vous retrouver avec un SL bien loin de l'endroit où vous l'attendez --- vous pouvez donc ajouter un code pour empêcher l'ajout du SL au-dessus d'une taille de spread définie.
Maintenant que la question de l'écart est réglée, la prochaine cause principale d'erreur 130 est que les prix ont changé alors que votre EA est toujours en cours d'exécution. Cela peut être dû à un EA qui prend beaucoup de temps à s'exécuter ou au fait que le serveur est très occupé à traiter les transactions, ce qui retarde l'exécution de votre EA. Le résultat est qu'un tick a provoqué le début de l'exécution de votre EA mais qu'un autre tick est arrivé avant la fin de l'exécution et que les prix sont maintenant invalides.
Dans tous les cas, vous devez rafraîchir les prix en utilisant RefreshRates : while (RefrshRates() == 1) Sleep(5) ; ------ ou ce que vous voulez comme temps d'attente.
Dans les deux cas, vous devez rafraîchir les prix en utilisant RefreshRates : while (RefrshRates() == 1) Sleep(5) ; ------ ou ce que vous voulez comme temps d'attente.
AFAIK RefreshRates() n'a rien à voir avec l'erreur 130
Point pris RaptorUK et je suis d'accord que l'utilisation de MODE_ASK etc. éliminerait la nécessité de RefreshRates() mais j'ai supposé que comme dans l'exemple de code de shinobi .....
J'envoie un ordre avec par exemple :
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green) ;
la variable prédéfinie ASK est utilisée et donc la valeur ask/bid ainsi que la valeur de l'écart peuvent avoir changé donnant l'erreur 130. Dans un tel cas, RefreshRates() pourrait être utilisé immédiatement avant l'envoi de l'ordre.
Point pris RaptorUK et je suis d'accord que l'utilisation de MODE_ASK etc. éliminerait la nécessité de RefreshRates() mais j'ai supposé que comme dans l'exemple de code de shinobi .....
J'envoie une commande avec par exemple
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green) ;
la variable prédéfinie ASK est utilisée et donc la valeur ask/bid ainsi que la valeur de l'écart peuvent avoir changé donnant l'erreur 130. Dans un tel cas, RefreshRates() pourrait être utilisé immédiatement avant l'envoi de l'ordre.
Je suis un peu occupé en ce moment, mais dès que j'en aurai l'occasion, j'essaierai toutes vos suggestions, puis j'écrirai un billet récapitulatif pour tous ceux qui pourraient tomber sur ce fil de discussion avec le même problème.
Merci, et prenez soin de vous !
shinobi
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green) ;
ne dit pas tout. Comment calculez-vous initial_stop - en utilisant Bid ?
Comment calculez-vous le SLIPPAGE - en tenant compte des courtiers à 4/5 chiffres ?
J'ai dû faire une pause pendant un certain temps (déménagement dans une nouvelle ville, nouveau travail).
Mais maintenant je voudrais reprendre ce fil de discussion, et enfin trouver une solution pour cette maudite erreur #130 stoploss.
Je vous suis reconnaissant pour tous vos conseils et j'ai essayé de les intégrer tous :
1 : Spread.
2 : Changing Market Rates
3 : 4-5 Digits-Broker
J'ai donc intégré toutes les suggestions, mais l'erreur persiste. Pour autant que je puisse dire, elle se produit aussi souvent qu'avant, il doit donc y avoir une autre cause.
Voici un journal récent :
tickvalue : 12.50000000
pos size : 37.00000000
Ask/Bid 1262.00000000/1261.75000000
stoploss:12.59610000
position_size : 37
Spread 0.25000000
Error could not take long position. L'erreur est : #130 invalid stops
La ligne de code OrderSend ci-dessus a été utilisée avec les valeurs enregistrées pour essayer de prendre une position longue.
Avez-vous d'autres idées, quelle pourrait être la cause ?
Merci !
shinobi
Est-ce un courtier ECN ?
Sur les courtiers ECN, vous devez ouvrir et ensuite fixer des stops.
pour éliminer la cause possible du nombre invalide de chiffres, j'ai arrondi le stoploss selon le code de WHRoeders :
Faites simplement
extern double StopLoss = 50 ;
extern double TakeProfit = 50 ;
puis pour les achats :
double SL=Bid - StopLoss*Point;
double TP=Bid + TakeProfit*Point;
int Ticket=OrderSend(Symbol(),0,1,Ask,2,SL,TP,"",12345);
if( Ticket<0) print("error="GetLastError()) ;
pour les ventes :
double SL=Ask + StopLoss*Point;
double TP=Ask - TakeProfit*Point;
int Ticket=OrderSend(Symbol(),1,1,Bid,2,SL,TP,"",12345);
if( Ticket<0) print("error="GetLastError()) ;
puis envoyez le fichier journal si cela ne fonctionne pas.
SDC :
J'ai essayé votre code comme ceci :
La seule différence est que j'ai remplacé Point, Ask et Bid par MarketInfo pour éviter le problème RefreshRates mentionné par Raptor et BigAI.
Le problème persiste avec ce simple exemple. J'obtiens toujours
#ESZ1,M5 : Position d'ouverture
#ESZ1,M5 : tickvalue : 12.50000000
#ESZ1,M5 : taille de la position : 1.00000000
#ESZ1,M5 : Demande/offre 1244.50000000/1244.25000000
#ESZ1,M5 : Ecart 0.25000000
#ESZ1,M5 : SL : 1244.00000000
#ESZ1,M5 : TP : 1245.00000000
#ESZ1,M5 : error=130
Raptor :
J'utilise actuellement UWC-Trader avec un compte de démonstration pour les tests.
Comme mentionné précédemment, je négocie des Futures. Par exemple, ESZ1 et FDXZ1.
WHRoeder :
Désolé, je n'arrondis pas non plus. Remplacez "arrondir" par "ajuster pour les courtiers à 4/5 chiffres". I.E. Je viens d'appliquer votre code.
J'ai également affiché l'OrderSend tel que je l'utilise dans ma réponse précédente. Et les valeurs de toutes les variables impliquées. Je ne sais pas quelle autre partie du code serait intéressante.
Comme le mini-exemple, suggéré par SDC, l'a montré, l'erreur peut être décomposée à ce simple code. Elle doit donc être plus fondamentale.
Je ne négocie pas de métaux, donc l'arrondi ne devrait pas être important.
Je vais essayer la prochaine fois :
d'ouvrir (sans stoploss) puis de modifier (en fixant le stoploss) plus tard.
Merci encore pour vos réflexions,
shinobi