Mein EA macht einen doppelten Eintrag - Seite 3

 
doshur:
Oje. Also hilft Schlaf nicht?

Was können wir tun, um dies zu vermeiden?

Bei mir hat es geholfen. Ich habe snelle_modas Tipp plus den Schlaf benutzt. Das hat funktioniert.

Aber seitdem habe ich die Art und Weise, wie die Trades geöffnet werden, überarbeitet. Jetzt brauche ich beide Lösungen nicht mehr. Hier ist, was ich gestern an angevoyageur geschrieben habe. Ich hoffe, es hilft:

Hallo,

das letzte Mal, als ich das Problem gelöst habe, habe ich die Sleep-Funktion nach dem Handel verwendet. Aber mit meinem neuen Bot ist das nicht mehr nötig. Vielleicht liegt es daran, dass das Eröffnen eines Trades jetzt anders gehandhabt wird. Der erste Bot, mit dem ich dieses Problem hatte (vielleicht hatten auch andere EAs diese Art der Handelseröffnung und deshalb auch das Problem (z.B. metaquant)), verwendete diese Methode:

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


Jetzt eröffne ich die Aufträge so, wie ich es in der Dokumentation gelernt habe und habe dieses Problem nicht mehr:

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


Vielleicht hilft das. Ich sehe, dass doshur eine ähnliche Methode zum Eröffnen von Trades verwendet, wie ich es tat, als es dieses Verhalten verursachte.

Mit freundlichen Grüßen
 
Also gibt es ein Problem mit der Klasse ctrade?

Kann jemand dies bestätigen, bevor ich meinen Code ändere?
 
doshur:
Es gibt also ein Problem mit der Klasse ctrade?

Kann mir das jemand bestätigen, bevor ich meinen Code ändere?

Ich kann nur sagen, dass ich dieses Problem nicht mehr habe, nachdem ich ctrade class entfernt habe.

Vielleicht möchten Sie eine zweite Version des EA erstellen, die die "altmodische" Art der Eröffnung eines Handels verwendet und sehen, ob es hilft.


Andererseits hat die sleep-Funktion das Problem auch bei mir gelöst.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
Es gibt also ein Problem mit der Klasse ctrade?

Kann jemand dies bestätigen, bevor ich meinen Code ändere?
Bitte haben Sie Geduld, ich werde Ihnen so bald wie möglich antworten. Ich werde versuchen, das Problem zu reproduzieren, wenn der Markt geöffnet ist.
 
Ich weiß nicht, ob Broker spielt auseinander hier, aber es scheint, unser Broker ist das gleiche. Alpari.

Pls entfernen Makler Name, wenn nötig.
 
Klammeraffe:

Ich kann nur sagen, dass ich dieses Problem nicht mehr habe, nachdem ich ctrade class entfernt habe.

Vielleicht möchten Sie eine zweite Version des EA erstellen, die die "altmodische" Art und Weise der Eröffnung eines Handels verwendet und sehen, ob es hilft.


Andererseits hat die sleep-Funktion das Problem auch bei mir gelöst.

Das ist ein interessanter Punkt.

Ich verwende die ctrade-Klasse für die Anpassung des Stoploss-Wertes.

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


Die Eröffnung der Position selbst erfolgt auf die "altmodische" Weise.

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

Ist es möglich, dass die ctrade-Klasse einen neuen Doppelauftrag sendet, wenn ich den Stoploss-Auftrag anpasse? Das erscheint mir seltsam.

 
Klammeraffe:

Ich kann nur sagen, dass ich dieses Problem nicht mehr habe, nachdem ich die ctrade-Klasse entfernt habe.

Vielleicht möchten Sie eine zweite Version des EA erstellen, die die "altmodische" Art der Eröffnung eines Handels verwendet und sehen, ob es hilft.


Andererseits hat die sleep-Funktion das Problem auch bei mir gelöst.

Wenn Sie sich die Klasse ctrade ansehen. Gibt es einen Unterschied zwischen der Verwendung dieser Klasse und der mqltraderequest Methode?
 
snelle_moda:

Das ist ein guter Punkt. Vielleicht sollte ich nur die Veränderung des BID-Preises verwenden.

Ein BAR auf dem Chart basiert auch auf dem BID-Kurs?


Für das Triggersignal meines EA interessiert mich nur die Veränderung des Preises, auf dem der 1-Minuten-BAR basiert.

Snelle_moda erhalten Sie immer noch eine doppelte Eingabe, wenn Sie mqltraderequest zum Senden der Order verwenden?
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
 

Kann ich fragen, ob PositionSelect() die Client-Seite oder die Server-Seite überprüft?

Ich habe das starke Gefühl, dass das Problem durch die Verzögerung verursacht wird, wenn der Server (Broker-Seite) die Anfrage verarbeitet und die Client-Seite nicht aktualisiert, weshalb PositionSelect() erneut ausgeführt wird.

Ich bin der festen Überzeugung, dass es keinen Unterschied zwischen cTrade und MqlTradeRequest gibt und dass die Sleep-Funktion dazu beitragen sollte, alles zu verzögern, damit unsere Client-Seite "aktualisiert" wird, bevor PositionSelect() erneut ausgeführt wird und einen doppelten Eintrag verursacht. Überprüfen von meinem Journal Tab, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

Wenn ich mehr als 400 schlafe, sollte das sicher sein.

What do you think?

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 erhalten Sie immer noch doppelte Einträge, wenn Sie mqltraderequest zum Senden von Aufträgen verwenden?


Ich habe seit dem 10.03.2013 1 weiteren Doppeleintrag erhalten. Ich verwende beide Methoden zum Senden meiner Bestellung. Siehe meinen vorherigen Beitrag.