Répondre

SQ 3.8.0 Erreur 129 prix invalide dans le trading réel

14 réponses

mikeyc

Client, bbp_participant, communauté, 877 réponses.

Visiter le profil

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

0

mikeyc

Client, bbp_participant, communauté, 877 réponses.

Visiter le profil

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

0

Mark Fric

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

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

0

mikeyc

Client, bbp_participant, communauté, 877 réponses.

Visiter le profil

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.

0

geektrader

Customer, bbp_participant, community, 522 replies.

Visiter le profil

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.


🚀 Unlock Your Edge in Automated Forex Strategy Development 🚀

Historical Forex Data Starting From 1987, 28 Pairs, M1, 99% Error-Free, Lifetime Free Updates

0

Matusiak Adrian

Client, bbp_participant, communauté, 300 réponses.

Visiter le profil

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. 

btn_viewmy_160x33.png

0

geektrader

Customer, bbp_participant, community, 522 replies.

Visiter le profil

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.


🚀 Unlock Your Edge in Automated Forex Strategy Development 🚀

Historical Forex Data Starting From 1987, 28 Pairs, M1, 99% Error-Free, Lifetime Free Updates

0

Matusiak Adrian

Client, bbp_participant, communauté, 300 réponses.

Visiter le profil

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.

btn_viewmy_160x33.png

0

Dan

Client, bbp_participant, communauté, 31 réponses.

Visiter le profil

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

0

tomas262

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 8 ans #133524

Dan,

 

Pouvez-vous télécharger cette stratégie ou l'envoyer à [email protected]?

0

Dan

Client, bbp_participant, communauté, 31 réponses.

Visiter le profil

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()) ;
   }

0

Dan

Client, bbp_participant, communauté, 31 réponses.

Visiter le profil

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.

0

Dan

Client, bbp_participant, communauté, 31 réponses.

Visiter le profil

Il y a 8 ans #133561

Thomas n'obtiendra-t-il pas de réponse ? ? ???

0

Mark Fric

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

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.

 

 

   …
   // 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) {
         
         if(orderType == OP_BUY || orderType == OP_SELL) {
            RefreshRates() ;
            openPrice = NormalizeDouble(getTradeOpenPrice(tradeDirection), Digits) ;
         }
 
         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 ;
         }
      }

 

 

Marque
StratégieArchitecte de Quantités

0

Dan

Client, bbp_participant, communauté, 31 réponses.

Visiter le profil

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.

0

Affichage de 14 réponses de 1 à 14 (sur un total de 14)