Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1853

 
EVGENII SHELIPOV #:

Ich habe verstanden, Rostislav

Ich verstehe nicht, warum, wenn ich die Flagge in dieser Funktion zu blockieren, der Expert Advisor beginnt zu öffnen und zu schließen 100-200 Aufträge zu einer Zeit

Denn wenn das Flag nicht gleich "0" ist, ruft es ständig die Funktion ClosseAll() auf
 
EVGENII SHELIPOV #:

Ich verstehe nicht, warum, wenn ich die Flagge in dieser Funktion zu blockieren, wird die EA öffnen und schließen 100-200 Aufträge zu einer Zeit

Lassen Sie mich das anhand Ihres Codes erklären:

Zu Beginn wird ein Flag gesetzt.

int flag_close=0;
//+------------------------------------------------------------------+

Dann öffnet sie Aufträge

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

Wenn eine enge Auftragsbedingung eintritt (Sie haben drei davon)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

Dieses Flag erhält den Wert "1" und beginnt, die Aufträge zu schließen

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

Sobald alle Aufträge abgeschlossen sind, wird das Kennzeichen auf "0" gesetzt.

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
Denn wenn das Flag nicht "0" ist, ruft es ständig die Funktion ClosseAll() auf

Dies kann der Fall sein, wenn der Befehl zur Eröffnung eines Auftrags gegeben wird. Es findet also eine Art "CHECKING" statt.

 
EVGENII SHELIPOV #:

Dies kann der Fall sein, wenn der Befehl zur Eröffnung eines Auftrags gegeben wird. Es findet also eine Art "BERECHNUNG" statt.

Haben Sie eine Kreditkarte?

Du gehst in ein Geschäft und kaufst eine Flasche Bier nach der anderen, und jedes Mal bezahlst du mit der Karte, bis du "0" auf der Karte hast,

Dann füllst du die Karte auf und holst noch ein Bier.

 
Mihail Matkovskij #:

Ja, aber das Schloss öffnet sich mit demselben Los. Und zwei unterschiedlich gerichtete Aufträge werden gleichzeitig eröffnet. Und Hedging ist, wenn ein Handel in einen Drawdown eingetreten ist und der Händler eine Position mit einem größeren Lot in der gleichen Richtung eröffnet (mit verschiedenen Richtungen habe ich mich vertan), was bedeutet, dass der Preis sich umkehren wird, um einen Gewinn bei einem Handel mit einem größeren Lot zu erzielen und den Verlust eines Handels mit einem kleineren Lot oder einen Durchschnitt von 0 zu decken.

Hedging ist absolut keine Sperre oder Teilsperre, sondern ein völlig anderes System.

 
Vitaly Muzichenko #:

Hedging ist absolut keine Sperre oder Teilsperre, sondern ein völlig anderes System.

Aber ich behaupte nicht, dass es eine Niete ist. Ich war gestern einfach verwirrt (ich sagte: Sie sollten eine entgegengesetzte Position anstelle einer unidirektionalen Position eröffnen). Es war schon spät. Und heute habe ich verstanden, wo ich falsch lag.

 
Mihail Matkovskij #:

Aber ich behaupte nicht, dass es eine Niete ist. Ich war gestern einfach verwirrt (ich sagte: Sie sollten eine entgegengesetzte Position anstelle einer unidirektionalen Position eröffnen). Es war schon spät. Und heute wurde mir klar, wo ich falsch lag.

Dann macht es Sinn, es passiert :)

 
EVGENII SHELIPOV #:

Dies kann der Fall sein, wenn der Befehl zur Eröffnung eines Auftrags gegeben wird. Es findet also eine Art "KLICKEN" statt.

Wir müssen eine Liste von Aufträgen mit Ticks erstellen, die zu schließen sind (wie viele hier bereits gesagt haben). Wenn der Roboter ein Ausstiegssignal erkannt hat, sollten die entsprechenden Aufträge (Tickets) der Liste zum Schließen hinzugefügt werden. Die Liste wird von einem Zyklus übergeben, der Abschlussanfragen (OrderClose) sendet. Dann müssen wir ständig überprüfen, ob es offene Aufträge mit den Tickets gibt, die der Liste hinzugefügt wurden. Wenn ein oder mehrere Tickets nicht gefunden werden, sollten wir sie aus der Liste löschen. Auf diese Weise wird die Funktion keine Aufforderung zum Schließen von Aufträgen senden, die nicht existieren.

Was ist mit neuen Signalen und Aufträgen zu tun, die während des Zeitraums der gefüllten Liste erschienen sind? Sie können sie auch der Liste hinzufügen, die durch ein Ausstiegssignal geschlossen werden soll. Auf diese Weise werden sie ihrerseits auch geschlossen. Das ist alles. Erstellen Sie eine solche Liste und schließen Sie Aufträge zyklisch über das Ticket ab. Sie können dies mit einem Intervall von einer Sekunde oder einigen Sekunden pro Durchgang des Zyklus tun. Wir müssen nur diesen Algorithmus umsetzen, und alles wird funktionieren.

 
Mihail Matkovskij #:

Wir müssen eine Liste von Aufträgen erstellen, die wir mit Tickets abschließen können (wie viele hier bereits gesagt haben). Wenn der Roboter ein Ausstiegssignal erkennt, werden die entsprechenden Aufträge (Tickets) in die Abschlussliste aufgenommen. Die Liste wird in einer Schleife übergeben, die eine Abschlussanforderung (OrderClose) sendet. Dann sollten Sie ständig überprüfen, ob es offene Aufträge mit den Tickets gibt, die in die Liste aufgenommen worden sind. Wenn ein oder mehrere Tickets nicht gefunden werden, sollten wir sie aus der Liste löschen. Auf diese Weise wird die Funktion keine Aufforderung zum Schließen von Aufträgen senden, die nicht existieren.

Was ist mit neuen Aufträgen zu tun, die während des Zeitraums der gefüllten Liste eingegangen sind? Sie können sie auch in die Abschlussliste aufnehmen. Auf diese Weise werden sie auch ihrerseits geschlossen. Das ist alles. Erstellen Sie eine solche Liste, und schließen Sie die Aufträge auf dem Knigge zyklisch. Sie können dies mit einem Intervall von einer Sekunde oder einigen Sekunden pro Zyklusdurchlauf tun. Wir müssen nur diesen Algorithmus umsetzen und alles wird funktionieren.

Wenn das Gitter so lang ist, werden die richtigen geschlossen.
Wenn der letzte Auftrag geschlossen wird, kann es vorkommen, dass es 10 Aufträge gibt, die geschlossen werden müssen, und er wird sie alle nacheinander schließen, was unendlich lange dauert.

 
Alexander Avksentyev #:

Wenn das Netz so lange braucht, wird es die rechten Seiten der Reihe nach schließen.
Wenn Sie den letzten Auftrag abschließen, kann es vorkommen, dass es 10 Aufträge gibt, die abgeschlossen werden müssen, so dass sie alle nacheinander abgeschlossen werden, was unendlich lange dauert.

Dies ist nicht der Fall. Alle Aufträge werden vom Terminal nacheinander abgeschlossen. Im OrderSend-Zyklus kann er mehrmals pro Sekunde ausgelöst werden (abhängig von Ihrer Hardware). OrderSend fügt jedoch nur die entsprechenden Befehle in die abschließende Warteschlange ein. Dann sendetdas Terminal diese Befehle in einem bestimmten Intervall oder nach Erhalt der Antwort des Servers auf die vorherige Anfrage an den Server, nicht sofort. Eine große Anzahl von Aufträgen (Positionen) wird also ohnehin viel langsamer geschlossen als ein einzelner Auftrag.

Grund der Beschwerde: