Schleifen und Schließen oder Löschen von Aufträgen - Seite 4

 
ggekko:

Hallo Experten, was ist Ihre Meinung zu dieser Lösung?

while(OrdersTotal()>0)
Es bedeutet, dass es mit jedem anderen EA (einschließlich sich selbst) und manuellem Handel inkompatibel ist. (Trades auf anderen Charts)
 
WHRoeder:
ggekko:

Hallo Experten, was ist Ihre Meinung zu dieser Lösung?

Es bedeutet, dass es mit jedem anderen EA (einschließlich sich selbst) und manuellem Handel inkompatibel ist. (Trades auf anderen Charts)

Ja, natürlich. Dies ist ein totaler Abschluss aller.

Manchmal gibt es Situationen (z.B. wenn man zu viele offene Trades sofort schließen will), in denen die "Original"-Version nicht funktioniert. Diese Version ist dafür gut geeignet.

 
ggekko:

Ja, natürlich. Dies ist eine vollständige Schließung aller.

Manchmal gibt es Situationen (z.B. wenn Sie zu viele offene Geschäfte sofort schließen wollen), in denen die "Original"-Version nicht funktioniert. Diese Version ist gut für diese.

Warum versuchen Sie nicht, auf Fehler zu reagieren? Sollten Sie nicht den Fehler analysieren und entsprechend reagieren? bei einigen Fehlern können Sie es erneut versuchen, bei anderen müssen Sie den Versuch abbrechen.
 

Hallo!


ich habe eine Frage zu while-Schleifen. Ich möchte den aktuellen EA in einer Schleife so häufig wie möglich ausführen. Also, mein Gedanke ist, den aktuellen Code innerhalb einer while-Schleife mit einer sleep-Funktion enthalten, die bewirkt, dass die while nur alle 1 Millisekunde ausgeführt.


Wenn ich dies jedoch getan habe (ich habe einige Print("...")-Funktionsaufrufe eingefügt, die verfolgen, was in jeder Schleife passiert), sehe ich, dass der Code einfriert und nicht mehr auf dem Bildschirm ausgegeben wird.

Ich frage mich, was das Problem sein könnte. Ist es in Ordnung, den EA in einer Schleife mit einer Frequenz von 1 ms laufen zu lassen? Wäre es ein Problem, wenn man versuchen würde, das letzte Bid/Ask zum Beispiel jede Millisekunde vom Server zu erhalten? Würde dies zu viel Last auf den Server bringen und das Einfrieren verursachen?

Möglicherweise ist etwas anderes mein Algorithmus tut dies verursacht, ich bin mir nicht sicher.


Ich habe es mit 200ms-Zyklen laufen lassen und habe immer noch das gleiche Problem (wenn auch nicht so unmittelbar). Könnte es ein Problem mit der Ausgabe von zu vielen Zeilen in der Protokolldatei geben?



Danke für jeden Ratschlag.

Mit freundlichen Grüßen,


C.

 
Es kann ein Code-Problem sein - aber ohne den Code zu kennen?
 

14967057:

Ich habe eine Frage zu while-Schleifen. Ich möchte den aktuellen EA so oft wie möglich in einer Schleife laufen lassen.

Mein Gedanke ist also, den aktuellen Code in eine while-Schleife mit einer darin enthaltenen sleep-Funktion zu setzen, die bewirkt, dass die while-Schleife nur alle 1 Millisekunde ausgeführt wird.

Könnte es ein Problem mit dem Versuch geben, das letzte Bid/Ask zu erhalten.

Könnte es ein Problem damit geben, zu viele Zeilen in die Protokolldatei zu drucken?

  1. In diesem Thread ging es um das Schließen und Löschen von Aufträgen. Entführen Sie keine Threads für themenfremde Fragen. Schreiben Sie einen neuen.
  2. Warum wollen Sie eine Endlosschleife laufen lassen? Es ändert sich nichts. Sie verschwenden damit nur CPU-Zeit.
  3. Kehren Sie vom Start zurück und wenn sich Bid/Ask ändert, wird Ihr Start so schnell wie möglich aufgerufen.
  4. Ja, Sie haben den gesamten verfügbaren Arbeitsspeicher mit den Zeilen gefüllt, und zwar schneller als Windows sie auf der Festplatte ablegen kann. Alle Programme werden ausgelagert. Alles bleibt hängen.
 

Hallo,

Es stellte sich heraus, dass das Problem, das ich hatte, nicht auf die Kapselung meines EA-Codes innerhalb einer while-Schleife mit einem 1ms-Schlaf zurückzuführen war. Dieser Teil scheint in Ordnung (unabhängig davon, wo ich auf dem Bildschirm drucken oder nicht), wie ich es jetzt für die letzte halbe Stunde ohne Fehler ausgeführt haben.


Das Problem lag an einem anderen heimtückischen while, das ich im Code hatte und das schließlich dazu führte, dass der EA in einer Endlosschleife gefangen wurde.

Vielen Dank für den Beitrag gooly und Roesder.

Grüße,

 

Hallo zusammen. Ich habe dieses Thema gelesen und ich habe eine Frage. Ich versuche einen Code zu erstellen, der eine schwebende Order löscht (nur STOP, kein LIMIT), aber nur wenn eine andere schwebende Order aktiviert wurde (Start ist OP_SELL oder OP_BUY). Also Code ist dies (aber es gibt einen Fehler, aber ich weiß nicht, wo). Könnten Sie sich bitte meinen Code ansehen?

 bool   result;
   int   i, j, cmd, cmd2,total;

   total=OrdersTotal();

   for(i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         
         if(cmd!=OP_BUYSTOP && cmd!=OP_SELLSTOP)  //take an orders which was activated 
           {
           for(j=0; j<total; j++)   //another variable j 
     { 
     if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){ cmd2=OrderType();
     if(cmd2!=OP_BUY && cmd2!=OP_SELL)
           {
            
            OrderPrint();
            
            result=OrderDelete(OrderTicket());  //first pending order become to OP_SELL or OP_BUY, second pending order will be delete
            if(result!=TRUE) Print("LastError = ", GetLastError());
            break;
           }
        }
       }
     }
     }
   }
 

OrdersTotal() nicht korrekt...

Ich bin überrascht, dass eine Schleifencode-Sequenz, die OrdersTotal() verwendet, keine korrekten Ergebnisse liefert (beobachtet bei zwei verschiedenen Brokern).

Ich verwende MT4 Version 1090 auf einem Linux Ubuntu-MATE 16.04 Desktop, auf dem WINE 3.0 läuft.

Hier ist, was ich verwendet habe...

for(int cc = 0; cc < OrdersTotal(); cc++)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) weiter;
if (OrderSymbol() != Symbol() ) continue;
if (OrderType() > 1) continue; //--ignore pending trades

OpenTradecnt++; //--zählt für jede Live-Position dieses Symbols, die existiert
Print("Anzahl der offenen Trades dieses Symbols ist: ", OpenTradecnt);
}

Ich habe bei zwei verschiedenen Brokern festgestellt, dass der Wert von OrdersTotal() nicht immer mit dem Wert übereinstimmt, der in der Registerkarte "Handel" des MT4-Brokers angezeigt wird. Zunächst dachte ich, dass es am Broker liegt, dass OrdersTotal() nicht richtig funktioniert. Als ich das beim zweiten Broker bemerkte, begann ich mich zu fragen, ob MT4 ein internes Problem hat oder ob mein Code falsch ist ODER ob es ein Problem mit der korrekten Synchronisierung von MT4 mit dem Server.... ist.

Nachdem ich diesen Forumsthread gelesen habe, frage ich mich, ob sich die Ergebnisse ändern, wenn ich die for..-Schleife zum Lesen ändere:

for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
...........
}

ODER gibt es ein Flag oder eine Codezeile, die sicherstellt, dass OrdersTotal() während eines OnTick()-Ereignisses korrekt synchronisiert wird?

Jede Klärung dieses Problems wäre sehr hilfreich und wird sehr geschätzt!

 

Bitte verwenden Sie die Schaltfläche </>, um Ihren Code einzufügen.


Grund der Beschwerde: