[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 858

 

Es ist eine einfache Frage, aber mir fällt nichts ein.

Zu einem bestimmten Zeitpunkt gibt es 4 offene Stellen. Ich versuche, sie alle auf folgende Weise zu schließen:

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

Aber sie sind nicht alle geschlossen, sondern durch einen. Sie haben nämlich die folgenden Nummern: 2,4,6,7. Die Plätze 2 und 6 sind also geschlossen.

Was ist der Trick?

 
usver:

Es ist eine einfache Frage, aber mir fällt nichts ein.

Zu einem bestimmten Zeitpunkt gibt es 4 offene Stellen. Ich versuche, sie alle auf folgende Weise zu schließen:

Aber sie sind nicht alle geschlossen, sondern durch einen. Sie haben nämlich die folgenden Nummern: 2,4,6,7. Die Plätze 2 und 6 sind also geschlossen.

Wo ist der Haken?


Der Trick ist, dass sich nach dem Schließen der Position die Nummerierung im OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ändert und gleichzeitig nicht alle geschlossen werden können

HH: Mir hat fts I. sehr geholfen. Kim, ich habe ein wenig geändert - zusätzliche Klammern entfernt und in eine Zeile gezogen:

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

Suchen Sie im Forum - Sie werden die Originale finden

 
IgorM:


nach dem Schließen einer Position ändert sich die Nummerierung in OrderSelect(i,SELECT_BY_POS,MODE_TRADES) und es können nicht alle gleichzeitig geschlossen werden

SZY: fts I hat mir sehr geholfen. Kim, ich habe ein wenig geändert - zusätzliche Klammern entfernt und eine Zeile eingezogen:

Suchen Sie im Forum - Sie werden das Original finden


Danke für den Tipp und das Beispiel. Ich werde mich damit befassen.

Auf dem Weg dorthin werde ich eine weitere Frage stellen.

Die Aufgabe ist folgende: Ich muss feststellen, welcher Auftragstyp durch einen Stop Loss geschlossen wurde, und einen zukünftigen Auftrag, der durch einen Stop Loss geschlossen wurde, mit einem früheren vergleichen (d.h. ihre Typen vergleichen). Bei der Durchsicht der Dokumentation konnte ich nichts über die Verarbeitung des letzten Ereignisses finden.

Zu diesem Zeitpunkt habe ich diese Operation als Schließung einer Order implementiert, wenn sie eine bestimmte Grenze erreicht (Bid-OrderOpenPrice() >=TP*Point). So konnte ich in einer Variablen den Typ der zuletzt abgeschlossenen Bestellung speichern und mit der gerade abgeschlossenen vergleichen ( if(type==OrderType()) ). Beim Testen funktioniert alles einwandfrei, aber ich würde es gerne noch mit Stop Losses umsetzen.

Ich habe versucht, mit OrderSelect() und dem Argument MODE_HISTORY einen abgeschlossenen Auftrag aus der Historie auszuwählen. Da es keine Bedingungen für das Schließen von Aufträgen gibt, kann eine Änderung der Variable OrdersTotal() als Auslöser für einen Stop-Loss betrachtet werden. Aber ich bin auf ein Problem gestoßen: Ich kann die Nummer der letzten abgeschlossenen Bestellung nicht finden (da sich ihre Nummer ständig ändert), oder ich habe einfach nicht herausgefunden, wie ich das machen soll.

Die Frage ist: Wie kann man das mit Stop-Losses umsetzen? Vielleicht gibt es einfachere Wege? Nun, wenn die Denkrichtung richtig ist, wie finden wir dann die letzte geschlossene Bestellung?

 
IgorM:


die Nummerierung in OrderSelect(i,SELECT_BY_POS,MODE_TRADES) nach dem Schließen einer Position geändert wird und nicht alle Positionen gleichzeitig geschlossen werden können

SZS: Die Funktionen von I. Kim haben mir sehr geholfen, ich habe sie ein wenig verändert - ich habe die zusätzlichen Klammern entfernt und sie in eine einzige Zeile gezogen:

Suchen Sie im Forum - Sie werden das Original finden

Du hast genug gesagt... alle auf einen Haufen.
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

Es ist eine einfache Frage, aber mir fällt nichts ein.

Zu einem bestimmten Zeitpunkt gibt es 4 offene Stellen. Ich versuche, sie alle auf folgende Weise zu schließen:

Aber sie sind nicht alle geschlossen, sondern durch einen. Sie haben nämlich die folgenden Nummern: 2,4,6,7. Die Plätze 2 und 6 sind also geschlossen.

Was ist das Problem?

Reden Sie von Nummern in der Reihenfolge oder von Tickets?

 
abolk:

Reden Sie von Nummern in der Reihenfolge oder von Tickets?


Ich bin selbst schon verwirrt. Es handelt sich um Eintrittskarten, aber ich habe sie gegeben, um die Situation zu verdeutlichen. Sie schließen eine nach der anderen.
 

Hurra, ich habe es geschafft!!!


Victor, vielen Dank, ich hatte einen Fehler, ich habe den Namen des Indikators nicht richtig geschrieben.

 
abolk:
Was du gerade gesagt hast... alles auf einen Haufen
https://docs.mql4.com/ru/trading/OrderSelect


Versuchen Sie, Mitnahmen oder Stopps in einer Gruppe von Aufträgen zu ändern/zu entfernen - die Aufgabe ist einfach, aber ich bin darauf gestoßen, dass sich bei der Auftragsauswahl mit OrderSelect(i,SELECT_BY_POS,MODE_TRADES) die Auftragsnummerierung direkt im Schleifenkörper änderte und ich es schaffte, einen bereits geänderten Auftrag (ohne Mitnahme) mehrmals zu ändern - Fehler Nr. 1, weshalb ich vorschlug, dass wever ein ähnliches Problem hatte

Bitte raten Sie mir, wie ich den Indikator am Ende mehrerer Balken neu berechnen lassen kann, zum Beispiel: Ich möchte, dass der Indikator alle 5 neuen Balken neu berechnet wird.

 
IgorM:


Bitte um Ratschläge, wie man einen Indikator am Ende mehrerer Balken neu berechnen kann, z. B.: Ich möchte, dass der Indikator alle 5 neuen Balken neu berechnet wird.

Sie kennen sich mit Programmierung aus.

Dies ist eine logische Aufgabe, für deren Lösung man nicht besonders schlau sein muss. Denken Sie mit Ihrem Kopf.

Es gibt verschiedene Fälle. Wo genau soll sie umgelenkt werden, mit welcher TF, wie die Umlenkung erfolgen soll, usw.. Wie beantworte ich Ihre Frage?

Notieren Sie die Zeit des Taktes und setzen Sie diese Zeit nach fünf Takten zurück und notieren Sie sie erneut. Zum Zeitpunkt der Nullstellung können Sie eine Bedingung für die Neuberechnung eingeben. Die Funktion iTime(NULL,0,0) ist hilfreich. Der Rest ist reine Logik.

 
IgorM:


Bitte um Ratschläge, wie man einen Indikator am Ende mehrerer Balken neu berechnen kann, z. B.: Ich möchte, dass der Indikator alle 5 neuen Balken neu berechnet wird.


Die Methode ist wahrscheinlich nicht die zuverlässigste, aber sie wird funktionieren, um die Idee auszuprobieren (z. B. einen Entwurf).

Verwenden Sie die Variable Bars und verfolgen Sie ihre Veränderung. Erhöht um 5, erinnert, usw.