SQ 3.8.0 Erreur 129 prix invalide dans le trading réel
14 réponses
mikeyc
Il y a 9 ans #113353
Bonjour Mark,
J'ai créé, testé et exporté le MQL4 pour une stratégie qui semble prometteuse sur l'EURUSD H1 timeframe. Elle utilise l'option de position de marché inversée, mais échoue lorsqu'elle est testée sur un compte réel :
2015.02.16 17:59:59.599 Stratégie 9.7 EURUSD,H1 : 2015.02.16 20:00:09 Erreur d'ouverture d'ordre : 129 : prix invalide
2015.02.16 17:59:59.599 Stratégie 9.7 EURUSD,H1 : 2015.02.16 20:00:09 Ordre d'ouverture, direction : 0, prix : 1.13572, Ask : 1.13572, Bid : 1.13548
2015.02.16 17:59:55.489 Stratégie 9.7 EURUSD,H1 : 2015.02.16 20:00:05 Erreur d'ouverture de l'ordre : 129 : prix invalide
2015.02.16 17:59:55.489 Stratégie 9.7 EURUSD,H1 : 2015.02.16 20:00:05 Ordre d'ouverture, direction : 0, prix : 1.13572, Ask : 1.13572, Bid : 1.13548
2015.02.16 17:59:52.067 Stratégie 9.7 EURUSD,H1 : 2015.02.16 20:00:01 Erreur d'ouverture d'ordre : 129 : prix invalide
2015.02.16 17:59:52.067 Stratégie 9.7 EURUSD,H1 : 2015.02.16 20:00:01 Ordre d'ouverture, direction : 0, prix : 1.13572, Ask : 1.13572, Bid : 1.13548
2015.02.16 17:59:52.052 Stratégie 9.7 EURUSD,H1 : clôture #164716296 vendre 0.10 EURUSD à 1.14383 au prix de 1.13572
Savez-vous pourquoi l'EA ne semble pas être en mesure d'ouvrir la direction opposée après la fermeture d'une transaction ?
Merci,
Mike
mikeyc
Il y a 9 ans #128868
Marquer,
En regardant la logique de trading dans l'EA généré, il me semble qu'il réessaie quelle que soit la cause de l'erreur, et dans le cas de l'erreur 129, il devrait rafraîchir l'offre/la demande car le prix a évolué au-delà du slippage.
Voir http://forum.mql4.com/61528
Pour mes propres EA, j'utilise une bibliothèque appelée OrderReliable pour gérer les erreurs délicates.
https://github.com/keyguy/TradersTech/blob/master/OrderReliable_2011.01.07.mqh
Peut-être cela sera-t-il inclus dans la prochaine version du modèle SQ pour MQ4 ?
Voir aussi,
Mike
Mark Fric
Il y a 9 ans #128890
Merci de m'avoir signalé cette erreur et cette bibliothèque, je vais m'en occuper.
Marque
StratégieArchitecte de Quantités
mikeyc
Il y a 9 ans #129627
Je vois l'erreur de slippage assez souvent avec certains brokers (hello FXDD :angry : ). Je pense que la meilleure solution est d'éviter ces courtiers avec un mauvais slippage.
geektrader
Il y a 9 ans #129666
Choisissez un courtier ECN, cette erreur est typique d'un courtier market maker en ce sens qu'il refuse d'accepter votre ordre au prix qu'il affiche dans MT4. C'est ce qu'on appelle des requotes et elles sont là pour permettre au courtier de gagner plus grâce à vos pertes :) Cela n'arrivera jamais sur un bon et honnête courtier ECN. Il y en a beaucoup, ma recommandation est Global Prime en Australie.
Matusiak Adrian
Il y a 9 ans #129687
Cela n'arrivera jamais sur un bon et honnête courtier ECN.
Vous vous trompez... Il y a beaucoup d'autres choses qui provoquent des requêtes. Simplement, essayez de faire une transaction sans requotes avec un ping vers le serveur de trading > 300ms. Même avec un courtier honnête, vous n'obtiendrez jamais le prix que vous voyez, car ce prix n'existe déjà pas.
geektrader
Il y a 9 ans #129701
Bien sûr, mais ce n'est pas une requote, c'est du slippage et cela ne provoquera pas d'erreur à l'EA comme le fait une requote - la transaction sera ouverte dans tous les cas, mais avec un prix glissé. Je préfère encore cela aux requotes. Btw, il est clair que vous ne devriez pas avoir un ping de 300 ms vers le serveur du courtier. Je travaille pour un courtier ECN, et même pour les petits comptes, vous devriez louer un VPS pour exécuter vos stratégies.
Matusiak Adrian
Il y a 9 ans #129704
Même pour les petits comptes, vous devriez louer un VPS pour exécuter vos stratégies.
Tout à fait D'ACCORD.
Dan
Il y a 8 ans #133511
Bonjour Mark,
J'obtiens la même erreur que MickeyC, c'est-à-dire que parfois, lorsque mon AE va placer une transaction, j'obtiens le message "Error opening order 129 : invalid price" (erreur dans l'ouverture de l'ordre 129 : prix non valide). Est-ce qu'il y a un code pour rafraîchir le prix quand il essaie de remplacer l'ordre que je peux insérer et est-ce que c'est quelque chose que SQ4 va résoudre.
Merci pour votre aide
tomas262
Il y a 8 ans #133524
Dan
Il y a 8 ans #133528
Bonjour Thomas,
Je préfère ne pas partager mon AE et résoudre le problème en partant du principe qu'il s'agit d'un problème de logique SQ, qui devrait rafraîchir le prix lorsqu'il a dépassé le montant du slippage. MIckeyC a déjà signalé ce problème sur ce fil de discussion et Mark allait s'en occuper. Est-ce que Mark a fait des changements pour corriger cette erreur dans la prochaine édition de SQ ? J'ai suivi le lien fourni par MickeyC sur le site MQL4. http://forum.mql4.com/61528 et il est dit que pour corriger le code d'erreur 129 prix invalide, il faut placer RefreshRates() ; avant l'envoi de la commande. Je ne suis pas un programmeur, mais j'ai tout de même essayé d'insérer cela dans l'AE. En gras vers le bas, j'ai ajouté le code de taux de rafraîchissement, je ne suis pas sûr que cela fonctionnera, c'est là que j'aurais besoin de votre expertise. Je précise que l'erreur ne s'est produite que deux fois et qu'il a réessayé de passer la commande trois fois par la suite, avec à chaque fois l'erreur invalid price error129 qui n'a pas abouti.
Merci pour votre aide
// ouverture d'un ordre avec gestion des erreurs et nouvelles tentatives
int ticket = 0 ;
tentatives = 3 ;
while(true) {
retries- ;
if(retries < 0) return ;
if(getMarketPosition() != 0) return ;
if(sqIsTradeAllowed() == 1) {
ticket = openOrderWithErrorHandling(orderType, orderLots, openPrice, stopLoss, profitTarget, comment, MagicNumber) ;
if(ticket > 0) {
if(tradeDirection > 0) {
ObjectSetText("lines", "Last Signal : Long, ticket : "+ticket, 8, "Tahoma", LabelColor) ;
} else {
ObjectSetText("lines", "Last Signal : Short, ticket : "+ticket, 8, "Tahoma", LabelColor) ;
}
retour ;
}
}
if(ticket == -130 || ticket == -129) {
// stops ou volume non valides, nous ne pouvons pas ouvrir la transaction
retour ;
}
Sleep(1000) ;
}
retour ;
}
//+——————————————————————+
int openOrderWithErrorHandling(int orderType, double orderLots, double openPrice, double stopLoss, double profitTarget, string comment, int magicNumber) {
//—————————————
// envoyer l'ordre
int error, ticket ;
Log("Ordre d'ouverture, direction : ", orderType, ", price : ", openPrice, ", Ask : ", Ask, ", Bid : ", Bid) ;
ticket = OrderSend(Symbol(), orderType, orderLots, openPrice, MaxSlippage, 0, 0, comment, magicNumber, 0, Green) ;
if(ticket < 0) {
// la commande a échoué, l'erreur est consignée dans le journal
error = GetLastError() ;
Log("Erreur d'ouverture de commande : ", error, " : ", ErrorDescription(error)) ;
retour(-erreur) ;
Sleep(1000) ;
//actualiser les données sur les prix
RefreshRates() ;
}
rettmp = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ;
Log("Order opened : ", OrderTicket(), " at price :", OrderOpenPrice()) ;
stopLoss = getSpecialSL(stopLoss) ;
profitTarget = getSpecialPT(profitTarget) ;
if(EmailNotificationOnTrade) {
SendMail("GB Strategy - Order opened", getNotificationText()) ;
}
Dan
Il y a 8 ans #133543
Bonjour Tomas, j'ai besoin de votre intelligence et de vos conseils pour résoudre le problème que je rencontre.
Dan
Il y a 8 ans #133561
Thomas n'obtiendra-t-il pas de réponse ? ? ???
Mark Fric
Il y a 8 ans #133566
Désolé pour cette réponse tardive. Malheureusement, ce n'est pas si simple, car le prix d'une transaction est fixé un certain temps avant que cette fonction ne soit appelée, y compris pour les ordres de marché.
Mais vous pouvez ajouter le morceau de code suivant juste après l'appel de sqIsTradeAllowed().
Il actualisera le prix du marché juste avant l'envoi de l'ordre.
if(orderType == OP_BUY || orderType == OP_SELL) {
Marque
StratégieArchitecte de Quantités
Dan
Il y a 8 ans #133576
Bonjour Mark,
Merci d'avoir répondu, je vais ajouter le bout de code et voir si cela fonctionne........ Merci encore pour votre réponse.
Affichage de 14 réponses de 1 à 14 (sur un total de 14)