Ich habe "Open" anstelle von "Time" verwendet, weil der Open-Wert eines Balkens, wenn er einmal eingetreten ist, für immer feststeht und sich nie mehr ändern wird. Es wird nicht nach zwei aufeinanderfolgenden Balken gesucht - es ist derselbe Balken und es wird gefragt, ob der Open des aktuellen Balkens, in dem der Tick gerade stattgefunden hat, mit dem in ThisBarOpen gespeicherten Open-Wert übereinstimmt. Außerdem hätte ich gedacht, dass Open unkomplizierter ist als Time, weil es sich um eine einfache Datenabfrage handelt, während Time möglicherweise auf etwas anderes verweisen und eine Art von Berechnung durchführen muss.
Re Counter--; Ich habe das nicht geändert, weil ein anderer EA nicht in der Lage wäre, eine Order zu schließen, weil der Code zuerst überprüft, ob die MagicNumber und das Symbol() gleich sind.
Ich verstehe natürlich den Punkt, dass ein Stromausfall den Inhalt von BuyTicket auslöscht, aber das ist während meiner Tests nicht passiert und mein Code läuft immer noch sehr langsam. Daher kann ich mir auch nicht vorstellen, dass das die Ursache sein könnte.
Meine Hauptfrage ist im Moment, warum es so lange dauerte, die EAs aus den Fenstern auf dem Terminal zu entfernen, die offene Positionen hatten, und überhaupt keine Zeit, sie aus dem Terminal zu entfernen, das keine offenen Positionen hatte. Vielleicht ist es Zufall - aber alle vier Fenster?
Letztes Mal hatte ich das gleiche Problem und eigentlich ist es, wie Sie den ea Code. Vielleicht ist es Zeit Ihre ea muss von Grund auf neu geschrieben werden. v2 zum Beispiel.
Ich weiß nicht, ob dies wirklich relevant für Ihr Problem ist, aber Sie beschränken Ihren Handel auf 1 Kauf, 1 Verkauf pro EA, warum also all dies tun?
if(SellTicket!=0)
{if(SmallMA>MediumMA)
{for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
{SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
{Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
if(Closed) SellTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");
}
Counter--;
}}}}
Wenn Sie diese zu einem statischen Wert machen, können Sie Ihren Auftrag explizit mit dieser Ticketnummer schließen, ohne den Auftragspool danach zu durchsuchen.
Re Counter--; Ich habe das nicht geändert, weil ein anderer EA nicht in der Lage wäre, eine Order zu schließen, weil der Code zuerst überprüft, ob die MagicNumber und das Symbol() gleich sind.
Meine Hauptfrage ist im Moment, warum es so lange dauerte, die EAs aus den Fenstern auf dem Terminal zu entfernen, die offene Positionen hatten, und überhaupt keine Zeit, sie aus dem Terminal zu entfernen, das keine offenen Positionen hatte. Vielleicht ist es Zufall - aber alle vier Fenster?
Haben Sie verstanden, wie Schleifen funktionieren?
if(BuyTicket!=0)
{
if(SmallMA<MediumMA)
{
for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
{
SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
{
// while(IsTradeContextBusy()) Sleep(10);
Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
if(Closed) BuyTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");
}
Counter--;
}
}
}
Angenommen, Sie haben 3 Aufträge offen
Beim ersten Durchlauf ist der Zähler = 0, also wird der Auftrag mit dem Index 0 ausgewählt.
Am Ende der Schleife verringern Sie den Zähler um 1, also Zähler== -1.
Bevor die Schleife erneut ausgeführt wird, wird der Zähler im Rahmen der for-Funktion um 1 erhöht. Also Zähler ==0
Beim nächsten Durchlauf der Schleife ist zähler==0 und so weiter und so fort.
Du steckst in einer Endlosschleife fest, die immer wieder den Ordnungsindex 0 überprüft.
Die einzige Möglichkeit, die Schleife zu beenden, ist, wenn es keine offenen Aufträge gibt, denn dann ist OrdersTotal - 1 gleich -1 und 0 ist nicht <= -1
Vielen Dank, GumRaj - Sie haben mein Problem gelöst!! Es funktioniert jetzt gut. Dies ist das erste Mal, dass ich Code in MQL4 geschrieben habe, also ist es ein Lernprozess für mich. Ich war verwirrt darüber, wie die for-Schleife funktioniert.
Sneck55: GumRaj - Sie haben mein Problem gelöst! Es funktioniert jetzt gut.
Und wie haben Sie es gelöst? Wenn Sie nicht herunterzählen, haben Sie immer noch ein Problem (#3) - nur versteckt, bis Sie mehrere Aufträge oder mehrere EAs haben.
Es muss dekrementiert werden, wenn ein Auftrag geschlossen wird, um mit den Vorgängen im Pool übereinzustimmen, aber nicht, wenn kein Auftrag geschlossen wird. Wenn er dekrementiert, ohne einen Auftrag zu schließen, gerät er in eine Endlosschleife.
Sie haben noch Zähler.
Siehe GumRai's Kommentar https://www.mql5.com/en/forum/151167/page2#954622
Vielen Dank für Ihre Beiträge.
Ich habe "Open" anstelle von "Time" verwendet, weil der Open-Wert eines Balkens, wenn er einmal eingetreten ist, für immer feststeht und sich nie mehr ändern wird. Es wird nicht nach zwei aufeinanderfolgenden Balken gesucht - es ist derselbe Balken und es wird gefragt, ob der Open des aktuellen Balkens, in dem der Tick gerade stattgefunden hat, mit dem in ThisBarOpen gespeicherten Open-Wert übereinstimmt. Außerdem hätte ich gedacht, dass Open unkomplizierter ist als Time, weil es sich um eine einfache Datenabfrage handelt, während Time möglicherweise auf etwas anderes verweisen und eine Art von Berechnung durchführen muss.
Re Counter--; Ich habe das nicht geändert, weil ein anderer EA nicht in der Lage wäre, eine Order zu schließen, weil der Code zuerst überprüft, ob die MagicNumber und das Symbol() gleich sind.
Ich verstehe natürlich den Punkt, dass ein Stromausfall den Inhalt von BuyTicket auslöscht, aber das ist während meiner Tests nicht passiert und mein Code läuft immer noch sehr langsam. Daher kann ich mir auch nicht vorstellen, dass das die Ursache sein könnte.
Meine Hauptfrage ist im Moment, warum es so lange dauerte, die EAs aus den Fenstern auf dem Terminal zu entfernen, die offene Positionen hatten, und überhaupt keine Zeit, sie aus dem Terminal zu entfernen, das keine offenen Positionen hatte. Vielleicht ist es Zufall - aber alle vier Fenster?
Ich weiß nicht, ob dies wirklich relevant für Ihr Problem ist, aber Sie beschränken Ihren Handel auf 1 Kauf, 1 Verkauf pro EA, warum also all dies tun?
Sie haben hier bereits Ihre Ticketnummer:
Wenn Sie diese zu einem statischen Wert machen, können Sie Ihren Auftrag explizit mit dieser Ticketnummer schließen, ohne den Auftragspool danach zu durchsuchen.
Vielen Dank für Ihre Beiträge.
Re Counter--; Ich habe das nicht geändert, weil ein anderer EA nicht in der Lage wäre, eine Order zu schließen, weil der Code zuerst überprüft, ob die MagicNumber und das Symbol() gleich sind.
Meine Hauptfrage ist im Moment, warum es so lange dauerte, die EAs aus den Fenstern auf dem Terminal zu entfernen, die offene Positionen hatten, und überhaupt keine Zeit, sie aus dem Terminal zu entfernen, das keine offenen Positionen hatte. Vielleicht ist es Zufall - aber alle vier Fenster?
Haben Sie verstanden, wie Schleifen funktionieren?
Angenommen, Sie haben 3 Aufträge offen
Beim ersten Durchlauf ist der Zähler = 0, also wird der Auftrag mit dem Index 0 ausgewählt.
Am Ende der Schleife verringern Sie den Zähler um 1, also Zähler== -1.
Bevor die Schleife erneut ausgeführt wird, wird der Zähler im Rahmen der for-Funktion um 1 erhöht. Also Zähler ==0
Beim nächsten Durchlauf der Schleife ist zähler==0 und so weiter und so fort.
Du steckst in einer Endlosschleife fest, die immer wieder den Ordnungsindex 0 überprüft.
Die einzige Möglichkeit, die Schleife zu beenden, ist, wenn es keine offenen Aufträge gibt, denn dann ist OrdersTotal - 1 gleich -1 und 0 ist nicht <= -1