Welches Design ist richtig? - Seite 4

 
Martingeil:
Machen Sie es so.

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

Es ist diese Zeile, die verwirrend ist. Ich denke, das ist hier überhaupt nicht nötig. Oder liege ich da falsch?

 
valenok2003:

Es ist diese Zeile, die verwirrend ist. Ich denke, das ist hier überhaupt nicht nötig. Oder liege ich da falsch?

Es geht darum, das magische Symbol abzuschneiden

Bei der Suche wird zunächst nach Aufträgen gesucht, die einfach nur das Symbol ohne Magik enthalten. Wenn es keine solchen Aufträge gibt, hört die Funktion auf zu arbeiten........., wenn sie Aufträge mit einem solchen Symbol findet, sucht sie unter ihnen nach Magik und schließt diejenigen, die der Magik entsprechen, wenn der Handelsfluss frei ist.

 
valenok2003:

Es ist diese Zeile, die verwirrend ist. Ich denke, das ist hier überhaupt nicht nötig. Oder liege ich da falsch?

Wenn es darum geht, alle Aufträge zu löschen, ist diese Zeile unnötig. Wie kommen Sie darauf, dass die eingebauten Skripte so sind, dass man sie als Beispiel nehmen sollte?
 
Martingeil:

Es war notwendig, die Majestät dieses Charakters abzuschneiden.

Bei der Suche wird zunächst einfach nach Aufträgen mit dem Symbol ohne Majic gesucht, wenn es keine solchen gibt, wird die Funktion gestoppt, wenn es Aufträge mit einem solchen Symbol gibt, werden diese durchlaufen und diejenigen gefunden, die mit der Majic übereinstimmen, und sie werden geschlossen, wenn der Handelsfluss frei ist.

Und woher wissen wir im Voraus die MagicNumber, denn wir erhalten sie mit OrderMagicNumber(). Und neben der Linie
OrderSymbol() == Symbol()

dupliziert wird.

Auch diese Zeile

Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);

Wenn es keine solche Majik gibt, hört die Funktion auf zu arbeiten und sucht sie, wenn es eine solche Majik gibt.

 
Techno:
Wenn es um die Löschung aller Aufträge geht, ist diese Zeile überflüssig. Wie kommen Sie darauf, dass die eingebauten Skripte so sind, dass man sie als Beispiel nehmen sollte?


Nun, Marx, immerhin.
 
Martingeil:

Erforderlich, um die Magie dieses speziellen Symbols zu unterbrechen

Bei der Suche nach einem Auftrag wird zunächst nach einem Auftrag ohne magische Zahl gesucht; wenn es keine solchen Aufträge gibt, bricht die Funktion die Arbeit ab........., wenn sie einen Auftrag mit einer solchen Zahl findet, geht sie alle Aufträge durch, um eine magische Zahl zu finden, und schließt alle Aufträge, die mit einer magischen Zahl übereinstimmen, wenn der Handelsfluss frei ist.

Verstehe, ich spreche nur von der Schließung aller Aufträge, deshalb habe ich es zuerst nicht verstanden.

Ich habe mir die Freiheit genommen, Ihr Beispiel so umzugestalten:

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      if (OrderMagicNumber() == MagicNumber)
      {
        while (!IsTradeAllowed()) Sleep(1000);
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
      }
    }
  }

sondern alle Aufträge zu schließen

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
 
valenok2003:


Na ja, Marx, immerhin.
auch Engels ) kein Bedarf an Personenkulten, schreiben Sie auf der Grundlage Ihres Wissens)
 
valenok2003:
Wenn Sie dies meinen

dann gibt es hier eine zusätzliche Variable für die Transparenz des Codes.

Oder meinen Sie vielleicht etwas anderes?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}

In diesem Fall ist es dies.

Der "gemeinsame Standard" für C/C++ ist :

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total-1; i >=0; i--)                                                        
  {                                                                                          
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}

Der Unterschied in der Anzahl der Operationen. Auch wenn es in diesem Fall nicht viel ausmacht, wird sich der Unterschied in den Stilen für den Prüfer beispielsweise deutlich auf die Optimierungszeit auswirken. In der realen Welt wirkt sie sich auf die Geschwindigkeit aus, die manchmal entscheidend ist.

Besonders das Bremsen ist ein solches Design (ich habe es nicht auf Ihrer Website gesehen, aber aus irgendeinem Grund bevorzugen die meisten Leute es ? ):

for (int i=0; i<OrdersTotal(); i++)

Hier wird bei jedem Durchlauf der Schleife eine Funktion aufgerufen. Dies ist der "teuerste" Vorgang in Bezug auf den Rechenaufwand.

Viel Glück!

Wie ich sehe, haben Sie die Codes in diesem Sinne korrigiert.

 

Das Ergebnis ist dieses Skript

//+------------------------------------------------------------------+
//|                                           CloseThisSymbolAll.mq4 |
//+------------------------------------------------------------------+
int start()
{
//----
  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
//----
   return(0);
}
//+------------------------------------------------------------------+
Frage - Warum werden nicht immer alle Aufträge abgeschlossen? Wenn ich zum Beispiel drei Verkaufsaufträge hintereinander eröffne und dann versuche, sie mit dem Skript zu schließen, kann es sein, dass einer, zwei oder alle geschlossen werden. Was ist der Grund dafür?
 

Mann, das ist ja eine tolle Art und Weise, aus all den Möglichkeiten die falsche auszuwählen. Du sollst nicht kodieren, Junge.

Sie wird nicht wegen der erneuten Zitate geschlossen.