Problem der Mehrfachbestellung - Seite 2

 

Hallo Raptor;

Während im Tester alle Orders geschlossen werden, wenn der TrailingStop schließt, wird in der Demo nur die durch den TrailingStop geschlossene Order geschlossen, alle anderen offenen Orders bleiben offen.

Wenn Sie den folgenden Code zusätzlich zu dem von Ihnen empfohlenen verwenden, ergibt sich folgende Logik;

"Finde heraus, was die Bedingung der letzten Order ist, wenn es ein Close war, dann führe den Code aus, um alle verbleibenden offenen Orders zu schließen."

Haben Sie eine Ahnung, warum das passiert?

Mit freundlichen Grüßen

Luis

int OrdType, GLError;
   double OrderClosed;
   RefreshRates();
   
    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--) 
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()== MagicNumber
        && OrderSymbol()== Symbol())
        {//29
        OrderClosed = OrderCloseTime();
        if(OrderClosed!=0)
           {//30                                  
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
      if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber()== MagicNumber 
         && OrderSymbol()== Symbol())                                       
         {//31
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
           {//32
           if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
               GLError = GetLastError();
           }//32                                         
          }//31
       }//30
     }//29 
    
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
  return(0);
  }//0 
 
luisneves:

Hallo Raptor;

Während im Tester alle Orders geschlossen werden, wenn der TrailingStop schließt, wird in der Demo nur die durch den TrailingStop geschlossene Order geschlossen, alle anderen offenen Orders bleiben offen.

Wenn Sie den folgenden Code zusätzlich zu dem von Ihnen empfohlenen verwenden, ergibt sich folgende Logik;

"Finde heraus, was die Bedingung der letzten Order ist, wenn es ein Close war, dann führe den Code aus, um alle verbleibenden offenen Orders zu schließen."

Haben Sie eine Ahnung, warum das passiert?

Sie können das nicht tun...

    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--)    // OrdersTotal is the total of open orders
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)        //  this is looping through the closed orders

. . . es macht keinen Sinn, die Anzahl der offenen Orders als Startbedingung für die Schleife zu verwenden, um die geschlossenen Orders zu durchlaufen . Vielleicht wollten SieOrderssHistoryTotal() verwenden? aber die OrderCloseTime() einer geschlossenen Order wird niemals == 0

 
luisneves:

.....

Ich verwende BuyTicket und SellTicket im Code, um das Öffnen von mehreren Aufträgen zu vermeiden, aber das scheint nicht die richtige Methode zu sein...

.....

Ein Problem entsteht, wenn eine Bedingung zum Öffnen einer dritten Bestellung kommt und so weiter. Hier sind die Bedingungen zum Öffnen jedoch vorhanden und der Code hat die zweite Öffnung gut gemeistert, warum funktioniert der Code hier nicht?

Ich verstehe, dass Sie das ursprüngliche Thema leicht verändert haben und vielleicht ist die erste Frage schon zu Ende diskutiert (für mich ist das ok)
Wenn Sie das ursprüngliche Thema noch weiterverfolgen wollen, müssen Sie es etwas anders erklären, weil ich nicht wirklich verstehe, wonach Sie suchen.

Das erste Snippet, das ich angepasst habe, verhindert, dass der Code mehrere Bestellungen öffnet. Sie schienen damit nicht zufrieden zu sein, deshalb haben Sie es entfernt (oder einfach nicht hinzugefügt), sondern machen das gleiche mit BuyTicket und SellTicket.
Dann sprechen Sie von einer dritten Bestellung... Suchen Sie etwas in dieser Art?

Kaufen->Verkaufen->Kaufen->Verkaufen->Kaufen
aber verhindern Sie
Kaufen->Kaufen->Verkaufen->Kaufen->Kaufen

Mit anderen Worten, wenn der letzte geöffnete Auftrag ein Kaufauftrag ist, muss der nächste ein Verkaufsauftrag sein und umgekehrt?

Oder was ist die maximale Anzahl von Aufträgen, die Ihr EA öffnen sollte? Sind es 2, eine Verkaufsorder und wenn die Bedingung für eine gegenteilige Order erfüllt ist, eine Kauforder, aber keine Verkaufsorder mehr, wenn sie wieder vom Kauftrigger abprallt?
Wenn dies der Fall ist, was war dann das Problem mit dem OpenOpposite-Zähler, den ich in Ihrem ursprünglichen Code hinzugefügt habe?

bearbeiten:

Die dritte Möglichkeit, die ich mir vorstellen kann, ist, dass Sie eine weitere entgegengesetzte Order öffnen wollen, wenn die erste entgegengesetzte Order ausgestoppt wurde?
Also etwa so:

Kaufen->Verkaufen->wenn Verkaufen ausgestoppt wurde->Verkaufen->wenn Verkaufen ausgestoppt wurde->Verkaufen

 
kronin:

Ich verstehe, dass Sie das ursprüngliche Thema leicht geändert haben und vielleicht ist das erste Problem zu Ende diskutiert (für mich ist es ok)
Wenn Sie das ursprüngliche Thema noch weiterverfolgen wollen, müssen Sie es ein wenig anders erklären, denn ich verstehe nicht wirklich, wonach Sie suchen.

Das erste Snippet, das ich angepasst habe, verhindert, dass der Code mehrere Bestellungen öffnet. Sie schienen damit nicht zufrieden zu sein, deshalb haben Sie es entfernt (oder einfach nicht hinzugefügt), sondern machen das gleiche mit BuyTicket und SellTicket.
Dann sprechen Sie von einer dritten Bestellung... Suchen Sie etwas in dieser Art?

Kaufen->Verkaufen->Kaufen->Verkaufen->Kaufen
aber verhindern Sie
Kaufen->Kaufen->Verkaufen->Kaufen->Kaufen

Mit anderen Worten, wenn der letzte geöffnete Auftrag ein Kaufauftrag ist, muss der nächste ein Verkaufsauftrag sein und umgekehrt?

Oder was ist die maximale Anzahl von Aufträgen, die Ihr EA öffnen sollte? Sind es 2, ein Verkauf und wenn die Bedingung für eine entgegengesetzte Order erfüllt ist, ein Kauf, aber nicht mehr ein Verkauf, wenn es vom Kauftrigger wieder abprallt?
Wenn dies der Fall ist, was war dann das Problem mit dem OpenOpposite-Zähler, den ich in Ihrem ursprünglichen Code hinzugefügt habe?

bearbeiten:

Die dritte Möglichkeit, die ich mir vorstellen kann, ist, dass Sie eine weitere entgegengesetzte Order öffnen wollen, wenn die erste entgegengesetzte Order ausgestoppt wurde?
Also etwa so:

Kauf->Verkauf->wenn Verkauf ausgestoppt wurde->Verkauf->wenn Verkauf ausgestoppt wurde->Verkauf


Hallo Kronin,

Vielen Dank im Voraus für Ihre Zeit, um mich in dieser Frage zu unterstützen.

Die Strategie folgt dieser Logik;

Angenommen, der erste zu eröffnende Auftrag ist ein Kaufauftrag und soll mit Hilfe des TrailingStop geschlossen werden. Wenn jedoch der Bid-Kurs einige Pips unter denOrderOpenPrice(ReturnDistance) fällt, wird ein Sell-Kurs eröffnet und soll mit Hilfe des TrailingStop geschlossen werden, und wenn der Ask-Kurs wieder einige Pips über den OrderOpenPrice steigt, wird ein Buy-Kurs eröffnet. Dieser Ping-Pong-Prozess endet, wenn die letzte zu eröffnende Order durch den TrailingStop geschlossen wird oder die maximale Order-Einstellung von 7 erreicht ist (man kann dies extern anpassen).

Das Problem mit den mehrfachen Eröffnungen tritt auf, wenn der Preis nach oben und unten geht und den OrderOpenPrice kreuzt. Wenn wir also einen Kaufauftrag haben, kann der nächste Auftrag nur ein Verkauf sein und so weiter.

Bezüglich Ihrer vorherigen Hilfe habe ich vielleicht nicht gut erklärt, was mein Problem war. Jede Hilfe, die ich bekomme, ist für mich von größtem Wert.

Mit besten Grüßen

Luis

 

Luis, ich habe ziemlich viel Zeit mit deinem Code verbracht, aber ehrlich gesagt bin ich mir nicht sicher, ob er das tut, was du willst.

Finalisieren/ändern Sie es, testen Sie es, verstehen Sie es.... und sagen Sie mir, dass es zumindest in der Nähe, ähnlich oder ganz anders, zu dem, was Sie suchen, funktioniert. Ich bin mir über die Strategie noch nicht ganz sicher.
Bitte fügen Sie noch keine neue Funktion hinzu (fügen Sie das Martingal nicht wieder ein). Der Code ist groß genug und Sie haben noch eine Menge Arbeit vor sich, um ihn zuverlässig zum Laufen zu bringen.
Ich muss sagen, dass der Code nicht viel übersichtlicher ist. Ich wollte deine laufenden Teile nicht verändern (auch wenn du ein besseres Errorhandling brauchst). Ich habe Teile auskommentiert und Teile verschoben, aber es ist alles noch da...


Viel Spaß damit...

 
kronin:

Luis, verbrachte ich ziemlich viel Zeit auf Ihren Code, aber ehrlich gesagt bin ich nicht wirklich sicher, ich tut, was Sie wollen.

Siehe Anhang. Finalisieren/ändern Sie es, testen Sie es, verstehen Sie es.... und sagen Sie mir, dass es zumindest in der Nähe, ähnlich oder ganz anders, zu dem, was Sie suchen, funktioniert. Ich bin mir bei der Strategie noch nicht ganz sicher.
Bitte fügen Sie noch keine neue Funktion hinzu (fügen Sie das Martingal nicht wieder ein). Der Code ist groß genug und Sie haben noch eine Menge Arbeit vor sich, um ihn zuverlässig zum Laufen zu bringen.
Ich muss sagen, dass der Code nicht viel übersichtlicher ist. Ich wollte deine laufenden Teile nicht verändern (auch wenn du ein besseres Errorhandling brauchst). Ich habe Teile auskommentiert und Teile verschoben, aber es ist alles noch da...


Viel Spaß damit...


Hallo Kronin,

Vor allem meine bis meisten danken Ihnen für die Zeit in Unterstützung meiner Probleme verbracht.

Während ich glaube, dass Sie Ihr Bestes getan haben, um die Strategie zu verstehen, sind einige Dinge nicht ganz reagieren (natürlich aufgrund meines Mangels an Verständnis in dieser Angelegenheit).

Ich habe einige Änderungen vorgenommen, um Ihren Rat zu befolgen, bin mir aber nicht sicher, ob ich es richtig gemacht habe.

Zwei Fragen;

1 - Die Idee ist, sobald der Handel mittels TrailingStop geschlossen wurde, sollten alle verbleibenden offenen Aufträge geschlossen werden. Die Aufträge sollen nicht beim TakeProfit geschlossen werden (der TakeProfit ist nur da, weil ich sicher sein will, dass er außerhalb der Freeze Zone liegt). Also dachte ich mir, dass ich die CloseAll-Funktion mit dem Close der letzten Order ausführe (beim Versuch, das zu tun, kommen einige dumme Dinge heraus...). Sie verwenden das Last Closed Ticket, um die Schließung von offenen Aufträgen auszuführen, aber ich verstehe nicht, ob das passiert, wenn der Handel mit Hilfe von TrailingStop geschlossen wird...

2 - Das "ping pong" funktioniert nicht, zumindest im Tester.

Im Anhang befindet sich die Datei, in der die Änderungen vorgenommen wurden, soweit ich sie verstanden habe.

Ich danke Ihnen im Voraus für Ihre Geduld und die aufgewendete Zeit. (mehr in privater Nachricht)

Mit besten Grüßen

Luis

 

Ok, ich habe den Algorithmus geändert, um alle Aufträge am SL statt am TP zu schließen. (Die Änderung wurde '<' durch '>' ersetzt - Sie sollten herausfinden, wo)

Das Ping Pong funktioniert bei mir und ich habe es im Tester nur im Visual Mode laufen lassen. Aber ich habe die Eingabeparameter so angepasst, dass nicht alle Orders zur gleichen Zeit geöffnet werden. Vielleicht müssen Sie die Standard-Parameter noch einmal überprüfen.

Es beginnt mit der ersten Order (ich habe die print()-Anweisung geändert) und führt dann entgegengesetzte Orders aus.

EURUSD,M1: open #1 Kauf 0.01 EURUSD bei 1.43310 ok
EURUSD,M1: Inital Buy Auftrag platziert # 1
EURUSD,M1: modify #1 buy 0.01 EURUSD at 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: Eröffnen #2 verkaufen 0,01 EURUSD bei 1,43200 ok
EURUSD,M1: Gegenläufige Verkaufsorder platziert # 2
EURUSD,M1: ändern #2 verkaufen 0.01 EURUSD bei 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: eröffnen #3 kaufen 0.01 EURUSD bei 1.43300 ok
EURUSD,M1: Gegenläufige Buy-Order platziert # 3
EURUSD,M1: modify #3 buy 0.01 EURUSD at 1.43300 sl: 1.42800 tp: 1.43500 ok

Ich habe Return zu OpenOppositeOrder() hinzugefügt, wenn ich eine Order geöffnet habe. Zusammen mit den Einstellungen war es möglich, eine Kauforder zu öffnen und im selben Tick eine Verkaufsorder. Dieser Hinweis auf MaxOrder ist nicht zuverlässig.
Vielleicht wäre es besser, die Funktion in 2 Funktionen aufzuteilen oder der Funktion einen Parameter zu geben, damit sie nur bei Kauf- oder Verkaufsaufträgen ausgeführt wird.

btw. der Code, den Sie hochgeladen haben, hat nicht funktioniert! Alle Trades scheiterten wegen 'invalid LotSize'....

 

Hallo Kronin,

Vielen Dank für die Zeit, die Sie sich genommen haben, um mich zu unterstützen.

Bezüglich des Problems "Der Code, den Sie hochgeladen haben, hat nicht gehandelt! Alle Trades schlugen wegen 'ungültiger LotSize'.... ", das ist passiert, nachdem ich den MM-Code an das Ende der Datei verschoben habe. Ich habe den Aufruf der Funktion mit MM(); am Anfang des Codes getan, scheint, dass diese Art von Aktion nicht funktioniert, aber der letzte Code, den Sie gesendet haben, funktioniert und die MM()-Funktion ist immer noch an der gleichen Stelle und funktioniert, so hier bin ich verloren....

Über die Ordereröffnung zum gleichen Tick;

Wenn der EA in den Chart einsteigt, muss er bis zum Preis gehen, der mehr (oder weniger) als der Preis in diesem Moment ist, d.h. wenn der Preis nach oben (oder unten) geht, muss die OpenDistance eine Kauf- (oder Verkaufs)-Order auslösen. Von hier aus kann die nächste Eröffnung nur erfolgen, wenn der Preis nach unten springt (wenn die letzte Order ein Kauf ist), und zwar ab dem OrderOpenPrice minus ReturnDistance. Vielleicht muss ein Limit eingerichtet werden, um zu verhindern, dass eine Order aus dieser Logik heraus geöffnet wird.

Beste Grüße

Luis

 
//mine
LotSize = (RiskAmount / StopLoss) / TickValue;              //Phil: LotSize is defined in global scope

//yours
double LotSize = (RiskAmount / StopLoss) / TickValue;


Sie haben LotSize im globalen Bereich definiert und mit 0 initialisiert. In der void-Funktion MM() berechnen Sie eine LotSize, die nur in dieser Funktion gültig ist. Ich habe nur die Initialisierung entfernt, so dass die Variable im globalen Bereich aktualisiert wird.

Könnten Sie bitte für jeden dieser Werte den Wert in Pips angeben?

extern double StopLoss       =  50;
extern double TakeProfit     =  20;
extern double TrailingStop   =   2;
extern int    MinimumProfit  =   3;
extern int    Slippage       =   3;
extern double OpenDistance   =   2;
extern double ReturnDist     =   1;
extern double MinStop        =   1;

Wie hoch ist der Spread für das Symbol, mit dem Sie den EA ausführen möchten?

Aber ich habe Ihre Eingabeparameter so angepasst, dass nicht alle Aufträge fast zur gleichen Zeit geöffnet werden.Vielleicht müssen Sie die Standard-Parameter überprüfen.

Versuchen Sie, dasselbe zu tun und lassen Sie es im Tester im visuellen Modus laufen.

 
kronin:


Sie haben LotSize im globalen Bereich definiert und mit 0 initialisiert. In der void-Funktion MM() berechnen Sie eine LotSize, die nur in dieser Funktion gültig ist. Ich habe nur die Initialisierung entfernt, damit die Variable im globalen Bereich aktualisiert wird.

Könnten Sie bitte für jeden dieser Werte den Wert in Pips angeben?

Wie hoch ist der Spread für das Symbol, mit dem Sie den EA ausführen möchten?

Aber ich habe Ihre Input-Parameter so angepasst, dass nicht alle Aufträge fast gleichzeitig geöffnet werden.Vielleicht müssen Sie die Standard-Parameter überprüfen.

Versuchen Sie das Gleiche und lassen Sie es im Tester im visuellen Modus laufen.


Hallo Kronin,

Ja, ich habe eine Menge zu lernen....Jetzt verstehen, dass, wenn es eine Notwendigkeit der einen Wert von außerhalb einer Funktion, die auf Global sein muss zugegriffen werden.

Die Werte, die auf extern sind, werden mit 10 multipliziert, weil der EA auch auf 5-stelligen Brokern laufen muss. Ich benutze diesen Code-Block, um das automatisch zu bekommen, aber ich bekomme einen Rat von WHRoeder, der nicht mit Metallen kompatibel ist.

int init ()// Adjust for 4 or 5 digits.
   {
   if (Digits == 2 || Digits == 4) <------- not compatible with metals
      {
      pt = Point;
      RealSlippage = Slippage;
      }    
   if (Digits == 3 || Digits == 5) 
      {
      pt = Point * 10;
      RealSlippage = Slippage * 10;
      }

Der Spread des Paares könnte variabel sein. Deshalb verwende ich den Code, um aus dem Stop Level herauszukommen.

Zu diesem Thema: "Aber ich habe Ihre Eingabeparameter so angepasst, dass nicht alle Aufträge fast zur gleichen Zeit geöffnet werden. Vielleicht müssen Sie die Standardparameter überprüfen."

Soweit ich sehen kann (sorry, wenn nicht...), OpenDistance erhalten als 2 Pips und ReturnDistance ist jetzt mit 2 als gut. Was ich im Moment sehe, ist, dass die Bestellung öffnet, aber nicht bei 2 Pips Unterschied. Dies läuft mit einem Tester auf einer Plattform eines ECN-Brokers (IC Markets). Könnte dies eine Bedeutung haben?

In der Tat öffnen die Orders nicht zur gleichen Zeit, aber es scheint, dass Open Distance und ReturnDist nicht berücksichtigt werden, um den richtigen Abstand zu den offenen Orders zu erhalten.

Sie haben im Code das;

OTLastTick=OTCurrentTick;                      //shift OrderTotal
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal
  if(OTCurrentTick>0)Trail();                    //Trail
  if(OTLastTick>=2                               //if OrderTotal has changed
     &&OTCurrentTick<OTLastTick
     &&OTCurrentTick>0){CloseAllOnSL();return;}  //Check order closed on SL level
  if(OTCurrentTick>=MaxOrders)return;            //Dont open more orders. Trail and return.
                                                 //Actually we have nothing more to do.
                                                 //Only call opposite if the initial order of the serie is open
  if(OTCurrentTick>0)OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
  MM();                //<--------------------- include this line to call function (not sure if this the right method to do it...)
                        
  if(OTCurrentTick==0){//init serie
     BuyAllowed=true;
     SellAllowed=true; 

Ich habe die fettgedruckte Zeile eingefügt, um die Funktion OpenOppositeOrder aufzurufen und bin mir nicht sicher, ob dies richtig ist. Für die andere Seite kann nicht sehen, wo ist der Vergleich der aktuellen Tick mit dem letzten Tick, die 2 Pips vor (OpenDistance) passiert.

Entschuldigung, wenn ich anfange, Sie mit meinen Problemen zu langweilen.

Beste Grüße

Luis

Grund der Beschwerde: