[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 563

 
rigonich:


Das Problem ist folgendes: Da Sie OrderSelect() in dieser Funktion nicht haben, scheint es irgendwo in der Schleife mit einer Suche von Aufträgen verwendet zu werden. Wenn diese Schleife die Suche von null bis zum letzten Auftrag organisiert, dann ändert sich nach der Änderung des ersten Auftrags oder wenn ein Auftrag bereits auf diesem Tick begraben wurde, beim nächsten Aufruf vonOrderSelect() die Reihenfolge der Aufträge, und die Funktion wählt möglicherweise einen Auftrag aus, der bereits geändert wurde. Daher sollten wir prüfen, ob der Wert der Order StopLoss gleich dem Wert ist, den wir an die OrderModify()-Funktion senden


Nein, das Problem des Änderns der Positionsauftragsnummer, wenn einer von ihnen geschlossen ist, wurde gelöst, ich habe mehr als einmal überprüft, weil ich dachte, dass dort ein Fehler vorliegen könnte, aber dort ist alles in Ordnung, der gewünschte Auftrag ist ausgewählt und der Stoploss wird dafür korrekt berechnet, aber der Auftrag will nicht geändert werden...
 

delf:

Der letzte Auftrag muss in eine beliebige Richtung geschlossen werden und der nächste Auftrag muss in die andere Richtung eröffnet werden (wenn die Bedingungen erfüllt sind).

Strengere Option

#define OrderBuy  0
#define OrderSell 1
int NewOrder;
int RezultatSend; 

int start()
{
... 
... 

if(OrdersTotal()==0)
{
if(NewOrder==OrderBuy)
   {
   if(/*Условие для Buy*/)
      { RezultatSend=OrderSend(/*...buy*/);     //Ставим Buy
        if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла
      }
   }
 else
   {
   if(/*Условие для Sell*/)
      { RezultatSend=OrderSend(/*...*/);       //Ставим Sell
        if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла
      }
   }
}

...
...

}  
 

abeiks:

Seit einiger Zeit versuche ich , den Kaufabschlussblock so zu überarbeiten, dass nur die letzten beiden Kaufpositionen geschlossen werden , aber das schlägt fehl. Können Sie mitteilen, wie man den Block umgestaltet ?

Es ist einfacher und bequemer, eine Funktion (Block) zum Schließen einer letzten Position zu erstellen. Und lassen Sie es zweimal laufen. In einer Schleife oder einfach in einer Reihe.
 
abeiks:

Seit einiger Zeit versuche ich , den Kaufabschlussblock so zu überarbeiten, dass nur die letzten beiden Kaufpositionen geschlossen werden , aber das schlägt fehl. Können Sie mitteilen, wie man den Block umgestaltet ?

Vor einiger Zeit habe ich Ihnen einen Lösungsalgorithmus zur Ermittlung der letzten Positionen vorgestellt. Und dann ist es WICHTIG, was mit ihnen zu tun ist: STOPs zählen, löschen, ändern. Wenn Sie nicht in der Lage sind, Code zumindest "nach dem Bild und Gleichnis" zu schreiben, gehört er nicht Ihnen (Programmierung)...
 
rigonich:



Ich danke Ihnen!

 
peshihod:
Es ist einfacher und bequemer, eine Funktion (Block) zu erstellen, um eine letzte Position zu schließen. Und lassen Sie es zweimal laufen. In einer Schleife oder einfach in einer Reihe.

Danke, das ist eine gute Option, die ich auch ausprobieren werde.

 
delf:

Ich habe mich wohl falsch ausgedrückt :(

Es gibt einen Algorithmus für die Eröffnung von Aufträgen.

Ich benötige, dass bei jeder Variante der Schließung des letzten Auftrags, der folgende in anderer Richtung geöffnet wurde (wenn die Bedingungen entsprechend erscheinen).

Alles funktioniert, aber wenn ich durch einen Stop-Loss geschlossen haben, zum Beispiel für den Verkauf, und die Bedingungen, um einen Verkauf in diese Richtung zu öffnen, die Öffnung weiter. Wir müssen die Bedingungen für den Kauf abwarten.

Das heißt, wir müssen den letzten geschlossenen Auftrag überprüfen, damit er nicht mit dem Eröffnungsauftrag zusammenfällt (Kauf-Verkauf-Kauf-Verkauf-Wechsel). Es ist nur ein Befehl oder ein Warten auf ein Signal in Betrieb.

Ich verstehe, dass wir wahrscheinlich OrdersHistoryTotal() verwenden sollten, aber wie würde es in einem funktionierenden EA aussehen?

Ich danke Ihnen.


Dies ist wahrscheinlich irgendwo der Fall. Wenn jedoch viele Aufträge in der Historie vorhanden sind, ist es besser, Ihr eigenes Auftragsbuch zu verwenden. https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

Eine strengere Option

Vielen Dank an alle, die geantwortet haben. Das Ergebnis ist gelungen, genau das, was ich brauchte.
 
delf:

Ich habe mich wohl falsch ausgedrückt :(

Es gibt einen Algorithmus für die Eröffnung von Aufträgen.

Ich benötige, dass bei jeder Variante der Schließung des letzten Auftrags, der folgende in anderer Richtung geöffnet wurde (wenn die Bedingungen entsprechend erscheinen).

Alles funktioniert, aber wenn ich durch einen Stop-Loss geschlossen haben, zum Beispiel für den Verkauf, und die Bedingungen, um einen Verkauf in diese Richtung zu öffnen, die Öffnung weiter. Wir müssen die Bedingungen für den Kauf abwarten.

Das heißt, wir müssen den letzten geschlossenen Auftrag überprüfen, damit er nicht mit dem Eröffnungsauftrag zusammenfällt (Kauf-Verkauf-Kauf-Verkauf-Wechsel). Es ist nur ein Befehl oder ein Warten auf ein Signal in Betrieb.

Ich verstehe, dass wir wahrscheinlich OrdersHistoryTotal() verwenden sollten, aber wie würde es in einem funktionierenden EA aussehen?

Ich danke Ihnen.

Wenn Sie programmieren lernen wollen, können Sie sich entweder den Code anderer ansehen (dafür gibt es CodaBase) oder von dem Algorithmus zur Lösung des Problems ausgehen. Sie zu bitten, einen Code für Sie zu schreiben, ist die hoffnungsloseste Art zu lernen. In den meisten Fällen erhalten Sie eine schlecht programmierte Lösung für Ihr Problem, etwa so, als ob (sinnbildlich gesprochen) Ihr Nachbar jede Minute an der Tür anruft und fragt: "Wie heißen Sie?" - hier geht es um unnötige (überflüssige) Berechnungen.

Der Algorithmus zur Lösung Ihres Problems könnte folgendermaßen aussehen. Zunächst müssen Sie sicherstellen, dass Sie nicht "Ihre" Aufträge haben. Dieses Problem, wenn es nicht für den Tester ist (wo wir die Lösung auf die Bedingung if (OrdersTotal() == 0) beschränken können), wird durch die Suche nach Aufträgen mit Hilfe von Filtern für passende OrderMagicNumber() und Symbol() gelöst. Dann prüfen Sie die Bedingung (gemäß Ihrer Strategie), um den Auftrag zu eröffnen. Wenn es ein Signal gibt, dann berechnen Sie anhand der Suche von OrdersHistoryTotal() (normalerweise ist es die letzte in der Liste) den OrderType() der letzten geschlossenen Order. Wenn das Signal zur Eröffnung des Auftrags und der Typ des zuletzt geschlossenen Auftrags nicht übereinstimmen, wird der Auftrag auf der Grundlage des Signals eröffnet.

Dieser Ansatz erfordert ein Minimum an Berechnungen und reduziert die Zeit für die Optimierung des Expert Advisors im Tester erheblich.

 
TarasBY:
Vor einiger Zeit habe ich Ihnen den Algorithmus zur Lösung der Suche nach den letzten Positionen vorgestellt. Und dann ist es egal, was man mit ihnen macht: zählen, löschen, ändern, STOP. Wenn Sie nicht in der Lage sind, Code zumindest "nach dem Bild und Gleichnis" zu schreiben, gehört er nicht Ihnen (Programmierung)...


Ja, ich stimme zu, Programmieren ist nicht mein Ding, also lerne ich und stelle hier Fragen. Ich habe versucht, Ihrem Algorithmus Positionsschließungen hinzuzufügen, aber es ist fehlgeschlagen (alle Kaufpositionen wurden geschlossen), also habe ich beschlossen, das Problem aus einem anderen Blickwinkel anzugehen und die Lösung zu sehen, die letzten beiden Kaufpositionen mit einem vorgefertigten Schließungsblock zu schließen, der mir zur Verfügung gestellt und angeboten wurde.

Ich wäre Ihnen sehr dankbar, wenn Sie mir zeigen könnten, wie ich die letzten beiden Kaufpositionen schließen kann. Ich werde verstehen, wo ich einen Fehler gemacht habe.

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}