Problem der Mehrfachbestellung - Seite 4

 
luisneves:

Hallo Kronin,

Ihre Änderung funktioniert. Du hast die maximale Anzahl der Aufträge begrenzt, aber ist es möglich, sie stattdessen alle zu schließen?

Ich habe versucht, das mit dem folgenden Code zu tun, aber scheint nicht zu funktionieren.

Mit besten Grüßen

Luis

Hmmm, ich bin nicht sicher, ob ich verstehe, was Sie meinen...
Meinst du, anstatt die letzte Bestellung zu öffnen (Bestellung 7, wenn MaxOrders auf 7 gesetzt ist), alle Bestellungen zu schließen?

Ich bin mir ziemlich sicher, dass Sie nicht warten wollen, bis MaxOrders erreicht ist und dann sofort alle schließen. Der letzte Auftrag würde in den meisten Fällen (oder immer) mit einem Verlust enden.
Übrigens: Haben Sie die PM über Spread Controller gesehen?

 
kronin:

Hmmm, ich bin nicht sicher, ob ich verstehe, was Sie meinen...
Meinen Sie, dass Sie, anstatt den letzten Auftrag zu öffnen (Auftrag 7, wenn MaxOrders auf 7 gesetzt ist), alle Aufträge schließen?

Ich bin mir ziemlich sicher, dass Sie nicht warten wollen, bis MaxOrders erreicht ist und dann sofort alle schließen. Der letzte Auftrag würde in den meisten Fällen (oder immer) mit einem Verlust enden.
Übrigens: Haben Sie die PM über Spread Controller gesehen?


Hallo Kronin,

Vielen Dank für Ihre prompte Antwort.

Sagen Sie, dass nach einem Ping-Pong-Zyklus von n Aufträgen (MaxOrders) alle offenen Aufträge geschlossen werden sollten, ich weiß, dass könnte nicht sinnvoll sein, aber selbst so.

Ich versuche, Code für die Wiederaufnahme der Bestellung einzubauen, falls sie fehlschlägt, und habe Zweifel, ob das sinnvoll ist, weil es bereits den Code von IsContextBusy () Sleep (10) gibt. Soweit ich verstehe, ist die Bedeutung "wenn der Server beschäftigt ist oder andere EA in der Plattform versucht zu kommunizieren, dann 10 Millisekunden warten und erneut versuchen". Ich nehme also an, dass der EA dieses Verhalten beibehalten wird, bis ein Ticket eingegangen ist, habe ich Recht?

Bezüglich des PM-Problems ist es in diesem Fall besser, den Test am Wochenende nicht zu nutzen oder die Plattform offline zu betreiben: ....

Ich habe Zeile 5 eingefügt, denke aber, dass das nicht notwendig ist, weil Sie das in Zeile 1 bereits getan haben, habe ich Recht?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

Ein anderes Problem,

Im folgenden Stück Code die Zeilen in Bold, wo ist sym und mn nicht sollte man es mit Symbol() und MagicNumber ersetzen?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

Hier, im folgenden Code habe ich Filter wie von Ihnen empfohlen eingefügt;

(//Phil:

//Check the total amount of orders. Ich würde einen Filter für Markt, Magie und Symbol hinzufügen...//<----------- Bin mir nicht sicher, was Sie mit Marktfilter meinen..... (Phil: Marktaufträge, keine schwebenden Aufträge)

//.... aber ich bin jetzt faul..... es ist etwas für Sie zu tun.

Ist das richtig?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


Mit besten Grüßen

Luis

 

Ich kommentiere die Verwendung von Funktionen nicht. RaptorUK hat das schon ein paar Beiträge vorher gemacht. Lesen Sie wieder und verstehen, warum Sie nicht brauchen, um etwas in den Code gegeben zu ändern. Noch besser, verstehen Sie, warum Sie es so verwenden können, wie es in anderen EAs ist.

OrdersTotal() gibt eine Anzahl von Aufträgen zurück. Sie wollen wahrscheinlich wissen, ob die Orders zu Ihrem EA oder zum manuellen Handel gehören oder ob es sich um schwebende Orders oder bereits gehandelte Orders handelt. Ich würde eine Funktion (int) erstellen, die die Anzahl der Aufträge zurückgibt, die der EA erstellt hat.

if(OTLastTick >= 2 //<------Könnten Sie die Bedeutung dieser Zeile kommentieren?
Wenn Sie nur eine Order offen haben (weniger als 2), macht es keinen Sinn, die Funktion CloseAllOnSL aufzurufen..... die einzige offene Order ist offensichtlich nicht ausgestoppt.

 
kronin:

Ich kommentiere die Verwendung von Funktionen nicht. RaptorUK hat das schon ein paar Beiträge vorher gemacht. Lesen Sie wieder und verstehen, warum Sie nicht brauchen, um etwas in den Code gegeben zu ändern. Noch besser, verstehen Sie, warum Sie es so verwenden können, wie es in anderen EAs ist.

OrdersTotal() gibt eine Anzahl von Aufträgen zurück. Sie wollen wahrscheinlich wissen, ob die Orders zu Ihrem EA oder zum manuellen Handel gehören oder ob es sich um schwebende Orders oder bereits gehandelte Orders handelt. Ich würde eine Funktion (int) erstellen, die die Anzahl der Aufträge zurückgibt, die der EA erstellt hat.

if(OTLastTick >= 2 //<------könnten Sie die Bedeutung dieser Zeile kommentieren?
Wenn Sie nur einen Auftrag offen haben (weniger als 2), macht es keinen Sinn, die Funktion CloseAllOnSL aufzurufen..... der einzige offene Auftrag ist offensichtlich nicht ausgestoppt.


Hallo Kronin,

Vielen Dank für Ihre Antwort auf meine Fragen.

Ich werde meine Aufmerksamkeit auf Ihren Code als auch RaptorUK beraten vor gegeben.

Mit freundlichen Grüßen

Luis

 

Hallo Kronin,

Es ist ein Problem aufgetreten, das mit der Verwendung von zwei EA's zu tun hat. Wenn ich zwei EA's in verschiedenen Charts und mit verschiedenen magischen Zahlen einsetze, funktionieren sie nicht gleichzeitig. Ich erhalte einen Fehler als uninit Grund 5, aber mit einem Blick in das Forum kann nicht finden, Informationen, die mich in die richtige Richtung, um mit diesem Problem umzugehen setzt.

Haben Sie irgendwelche ergänzenden Informationen?

Mit besten Grüßen

Luis

 
luisneves:

Hallo Kronin,

Es ist ein Problem aufgetreten, das mit der Verwendung von zwei EA's zu tun hat. Wenn ich zwei EA's in verschiedenen Charts und mit verschiedenen magischen Zahlen einsetze, funktionieren sie nicht gleichzeitig. Ich erhalte einen Fehler als uninit Grund 5

https://docs.mql4.com/constants/uninit
 

Hallo RaptorUK,

vielen Dank für Ihre schnelle Antwort.

In dem angegebenen Link habe ich gefunden,

GRUND_PARAMETER5Inputs Parameter wurde vom Benutzer geändert.

Aber mit dieser Information kann man nichts machen (soweit ich weiß). Kann nicht verstehen, welche Eingaben Parameter geändert wurden. Die ea ist die gleiche, nur ändern die magische Zahl, um Konflikte zwischen den anderen ea zu vermeiden.

Durch die Art und Weise, wenn Sie hier sind, könnten Sie mir sagen, wenn in den folgenden Code muss man Code einführen, um die Aufträge wurden wieder gesendet, während Ticket nicht das gleiche für die Schließung von Aufträgen erhalten haben?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

Beste Grüße

Luis

 
luisneves:

Hallo RaptorUK,

vielen Dank für Ihre schnelle Antwort.

In dem angegebenen Link habe ich gefunden,

GRUND_PARAMETER5Inputs Parameter wurde vom Benutzer geändert.

Aber mit dieser Information kann man nichts machen (soweit ich weiß). Kann nicht verstehen, welche Eingaben Parameter geändert wurden. Die ea ist die gleiche, nur die magische Zahl ändern, um Konflikte zwischen den anderen ea zu vermeiden.

Wenn Sie die magische Zahl geändert haben...

extern int    MagicNumber    = 08012013;

. . . und es ist ein Externer dann haben Sie einen Parameter geändert, der EA startet neu und gibt Grund 5

Wenn Sie Ihren EA auf mehreren Paaren laufen lassen wollen, schlage ich vor, dass Sie zwei Dinge tun: Erstens, dass Ihr EA auf einem Paar korrekt funktioniert, testen Sie ihn vollständig, damit Sie wissen, dass er funktioniert, und zweitens, dass Sie einen Mutex einführen, damit Ihre Trades behandelt werden, wenn der andere EA nicht versucht, dasselbe zu tun.

 
RaptorUK:

Wenn Sie die Magic Number geändert haben...

. . . und es ist ein Externer, dann haben Sie einen Parameter geändert, der EA startet neu und gibt Grund 5

Wenn Sie Ihren EA auf mehreren Paaren laufen lassen wollen, schlage ich vor, dass Sie zwei Dinge tun: Erstens, dass Ihr EA auf einem Paar korrekt funktioniert, testen Sie ihn vollständig, damit Sie wissen, dass er funktioniert, und zweitens, dass Sie einen Mutex einführen, damit Ihre Trades behandelt werden, wenn der andere EA nicht versucht, dasselbe zu tun.


Hallo RaptorUk,

Vielen Dank für Ihre Antwort über den Fehler, ich nehme an, dass ich den Namen und die magische Zahl geändert habe und den zweiten EA in den Chart gesetzt habe, ohne die Plattform zu schließen.

In Bezug auf das andere Problem über Re-Entry-Aufträge, die mit einem Fehler in der Bestellung schließen, die einen Fehler als Timeout zurückgegeben zu tun haben. das ist, warum ich nicht weiß, ob der Code, wie es ist, wird die Bestellung schließen oder Bestellung senden wieder eingeben.

Mit besten Grüßen

Luis

 
luisneves:


Hallo RaptorUk,

Vielen Dank für Ihre Antwort über den Fehler, ich nehme an, dass haben Namen und magische Zahl ändern und setzen Sie die zweite ea in Chart ohne schließen Sie die Plattform.

In Bezug auf das andere Problem über die Wiedereinreise Aufträge, die mit einem Fehler in der Bestellung schließen, die einen Fehler als Timeout zurückgegeben zu tun haben. das ist, warum ich nicht weiß, ob der Code, wie es ist, wird die Bestellung schließen oder Bestellung senden wieder eingeben.

Mit besten Grüßen

Luis

Lesen Sie sich die Ausführungsfehlercodes durch und passen Sie Ihren Code an die dort gegebenen Informationen an, z.B.

ERR_TRADE_TIMEOUT128Die Zeitüberschreitung für den Handel wurde erreicht. Vor dem erneuten Versuch(zumindest in der Zeitspanne von 1 Minute) muss sichergestellt werden, dass die Handelsoperation nicht wirklich erfolgreich war (es wurde keine neue Position eröffnet, oder die bestehende Order wurde nicht geändert oder gelöscht, oder die bestehende Position wurde nicht geschlossen)
Grund der Beschwerde: