Mon EA fait une double entrée - page 3

 
doshur:
Omg. Donc dormir n'aide pas ?

Que pouvons-nous faire pour éviter cela ?

Cela m'a aidé. J'ai utilisé le conseil snelle_modas plus le sommeil. Cela a fonctionné.

Mais depuis, j'ai revu la façon dont les transactions sont ouvertes. Maintenant, je n'ai besoin d'aucune de ces deux solutions. Voici ce que j'ai écrit à angevoyageur hier. J'espère que cela vous aidera :

Bonjour,

La dernière fois que j'ai résolu le problème, j'ai utilisé la fonction de veille après la transaction. Mais avec mon nouveau robot, ce n'est plus nécessaire. Peut-être que c'est parce que l'ouverture d'une transaction est maintenant gérée différemment. Le premier robot avec lequel j'ai eu ce problème (peut-être que d'autres EAs avaient aussi cette façon d'ouvrir une transaction et c'est pourquoi j'ai eu le problème aussi (par exemple metaquant)) utilisait cette méthode :

void SetOrder(ENUM_ORDER_TYPE type, double lot)
{
   int ticket = -1;
   ResetLastError();
   double price = 0;
   double ask, bid;
   ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   if (maxSpread != 0 && NormalizeDouble(ask - bid, _Digits) >= NormalizeDouble(maxSpread * point, _Digits)) return; 
   if (type == ORDER_TYPE_BUY) price = ask;
   if (type == ORDER_TYPE_SELL) price = bid;
   trade.PositionOpen(Symbol(), type, lot, price, 0, 0, "");
   Sleep(1000);
   int err = GetLastError();
   if (err > 0) Print(ErrorDescription(err));
}


Maintenant j'ouvre les ordres comme je l'ai appris dans la documentation et je n'ai plus ce problème :

void open_sell(double xlot, int xTP)
{
         MqlTradeRequest mrequest;
         MqlTick latest_price;      
         MqlTradeResult mresult;   
            if(!SymbolInfoTick(Symbol(),latest_price))
              {
               Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
               return;
              }
         ZeroMemory(mrequest);
         mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.bid,Digits());           // latest Bid price
         if (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Loss
         if (xTP!=0) mrequest.tp = NormalizeDouble(latest_price.bid - xTP*point,Digits()); // Take Profit
         mrequest.symbol = Symbol();                                          // currency pair
         mrequest.volume = xlot;                                              // number of lots to trade
         mrequest.magic = EA_Magic;                                          // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
          // Print("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Print("The Sell order request could not be completed -error:",GetLastError());
            ResetLastError();
            return;
           }
}


Peut-être que cela aide. Je vois que doshur utilise une méthode similaire pour ouvrir des trades comme je l'ai fait quand cela a causé ce comportement.

Cordialement
 
Il y a donc un problème avec la classe ctrade?

Quelqu'un peut-il confirmer cela avant que je ne modifie mon code ?
 
doshur:
Il y a donc un problème avec la classe ctrade ?

Quelqu'un peut-il le confirmer avant que je ne modifie mon code ?

Je peux simplement dire que je n'ai plus ce problème après avoir supprimé la classe ctrade.

Vous pourriez créer une deuxième version de l'EA qui utilise la méthode "à l'ancienne" pour ouvrir une transaction et voir si cela aide.


D'un autre côté, la fonction sommeil a résolu le problème pour moi aussi.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
Il y a donc un problème avec la classe ctrade ?

Quelqu'un peut-il confirmer cela avant que je ne modifie mon code ?
Soyez patient, je vous répondrai dès que possible. Je vais essayer de reproduire le problème lorsque le marché sera ouvert.
 
Je ne sais pas si le courtier joue à part ici mais il semble que notre courtier soit le même. Alpari.

Veuillez supprimer le nom du courtier si nécessaire.
 
Klammeraffe:

Je peux simplement dire que je n'ai plus ce problème après avoir supprimé la classe ctrade.

Vous pourriez créer une deuxième version de l'EA qui utilise la méthode "à l'ancienne" pour ouvrir une transaction et voir si cela aide.


D'autre part, la fonction sleep a également résolu le problème pour moi.

C'est un point intéressant.

J'utilise la classe ctrade pour ajuster la valeur du stoploss.

      
My_Trade.PositionModify(Symbol(), 
                        NormalizeDouble(dPositionStoploss,   Digits()), 
                        NormalizeDouble(dPositionTakeProfit, Digits())
                        ); 


L'ouverture de la position elle-même se fait à l'ancienne.

mrequest.action         = TRADE_ACTION_DEAL;                            // immediate order execution stoploss en takeprofit worden aangepast mrequest.price          = NormalizeDouble(Latest_Price.ask, Digits());  // latest ask price mrequest.symbol         = Symbol();                                     // currency pair mrequest.volume         = dTradePosition_Size;                          // number of lots to trade mrequest.magic          = EA_Magic_Number;                              // Order Magic Number mrequest.type           = ORDER_TYPE_BUY;                               // Buy Order mrequest.type_filling   = ORDER_FILLING_RETURN;                         // Order execution type mrequest.deviation      = 1000;                                         // Max prijs afwijking                                                                                                        OrderSend(mrequest,mresult); //--- send order

Est-il possible que la classe ctrade envoie un nouvel ordre double lorsque j'ajuste l'ordre stoploss ? Cela semble étrange.

 
Klammeraffe:

Je peux juste dire que je n'ai plus ce problème après avoir supprimé la classe ctrade.

Vous pourriez créer une deuxième version de l'EA qui utilise la méthode "à l'ancienne" pour ouvrir une transaction et voir si cela aide.


D'un autre côté, la fonction sleep a résolu le problème pour moi aussi.

Si vous examinez la classe ctrade. Y a-t-il une différence entre cette classe et la méthode mqltraderequest ?
 
snelle_moda:

C'est un bon point. Je devrais peut-être utiliser uniquement la variation du prix BID.

Une barre sur le graphique est également basée sur le prix BID ?


Pour le signal de déclenchement de mon EA, je ne suis intéressé que par la variation du prix sur lequel est basé le BAR 1 minute.

Snelle_moda, obtenez-vous toujours une double entrée en utilisant mqltraderequest pour envoyer l'ordre ?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 

Puis-je demander si PositionSelect() vérifie le côté client ou le côté serveur ?

J'ai le fort sentiment que le problème est causé par le retard où le serveur (côté courtier) traite la demande et n'a pas mis à jour le côté client, c'est pourquoi PositionSelect() s'exécute à nouveau.

J'ai le sentiment qu'il n'y a pas de différence entre cTrade et MqlTradeRequest et que la fonction Sleep devrait aider à retarder tout ce qui est nécessaire pour que le côté client soit "mis à jour" avant que PositionSelect() ne s'exécute à nouveau, causant une double entrée. Vérification à partir de mon onglet journal, >2013.12.20 08:35:00 Trades '800****' : exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

mettre en sommeil plus de 400 devrait être sûr ???

Que pensez-vous ?

Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 
doshur:
Snelle_moda obtenez-vous toujours une double entrée en utilisant mqltraderequest pour envoyer l'ordre ?


J'ai encore une double entrée depuis le 03-10-2013. J'utilise les deux méthodes pour envoyer mon ordre. Voir mon post précédent.