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

 
hoz Vadim, warum das Objekt neu erstellen, wenn Sie ObjectSet() verwenden können?

Warum um Rat fragen und ihn dann in Frage stellen? Ist das der Mainstream?
 
FAQ:

Ich denke, es hat keinen Sinn, weiter zu streiten. Ich habe alles Schritt für Schritt ausführlich erklärt. Machen Sie weiter wie bisher.

Welche Art von Diskussion kann es geben? Wir sollten den Auftrag mit der maximalen Preisabweichung schließen. Das bedeutet, dass wir uns für den Preis interessieren... D.h. wir sollten eine extreme Pending Order finden (mit dem maximalen oder minimalen offenen Preis ). Wenn Sie nicht einverstanden sind, können Sie argumentieren. Sonst habe ich doch recht! Ich weiß genau, was ich sage.
 

Der Code löscht ST und TP. Ich füge eine Bedingung für die selektive Löschung hinzu

Was ist nicht richtig geschrieben? Ständig wird alles gelöscht :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

Oder gibt es keine andere Lösung und ich muss den Löschcode für jede Bedingung schreiben?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim, warum das Objekt erneut erstellen, wenn Sie ObjectSet() verwenden können?

In diesem Fall gab es eine Funktion, bei der das grafische Objekt vollständig erstellt und konfiguriert wurde. Darin wird die Erstellungsfunktion optimiert. Wenn das Objekt bereits existiert, wird es nicht erstellt. Überprüfen Sie es selbst. Messen Sie die Zeit für die Erstellung von Objekten und dann für die Änderung von Eigenschaften. Der zweite Anruf wird viel kürzer sein. Das heißt, dass nichts neu geschaffen wird.

Als Ergebnis haben wir eine universelle Funktion, die nicht nur ein Objekt erstellt, sondern es auch anpassen kann, indem sie Objekteigenschaften ohne viel Zeitaufwand ändert.

 
Können Sie ein Skript für einen EA vorschlagen, um den Markttrend zu bestimmen?
 

Ich habe eine Funktion geschrieben, diedie Verkaufsaufträge mit den niedrigsten Preisen löscht.Die Anzahl der zu schließendenShort-Aufträge ist gleich derAnzahl der Kaufaufträge, die ausgelöst wurden, d.h. zu Marktaufträgen wurden.

Wenn also ein Kaufauftrag ausgelöst wird, schließen wir einen Verkaufsauftrag, wenn 2 Kaufaufträge ausgelöst werden, schließen wir 2 Verkaufsaufträge.

Hier ist der Code:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

amountOfCurrPending - Anzahl der ausstehenden Kaufaufträge.

Level- Anzahl der ausstehenden Aufträge, die ursprünglich an jede Seite gesendet wurden.

OOP- offener Preis der schwebenden Order, ich habe jeden unerreichbaren Wert genommen.

Unsere Bedingung lautet wie folgt: Wenn der Zähler niedriger ist als diezu löschenden Aufträge, löschen wir den schwebenden Auftrag mit dem niedrigsten Preis. Aber alle Short-Positionen werden gelöscht. Was ist los mit mir?

 
hoz:

Ich habe eine Funktion geschrieben, diedie Verkaufsaufträge mit den niedrigsten Preisen löscht.Die Anzahl der zu schließendenShort-Aufträge ist gleich derAnzahl der Kaufaufträge, die ausgelöst wurden, d.h. zu Marktaufträgen wurden.

Wenn also ein Kaufauftrag ausgelöst wird, schließen wir einen Verkaufsauftrag, wenn 2 Kaufaufträge ausgelöst werden, schließen wir 2 Verkaufsaufträge.

Hier ist der Code:

amountOfCurrPending - Anzahl der ausstehenden Kaufaufträge.

Level- Anzahl der ausstehenden Aufträge, die ursprünglich an jede Seite gesendet wurden.

OOP- offener Preis der schwebenden Order, ich habe jeden unerreichbaren Wert genommen.

Unsere Bedingung lautet wie folgt: Wenn der Zähler niedriger ist als diezu löschenden Aufträge, löschen wir den schwebenden Auftrag mit dem niedrigsten Preis. Aber alle Short-Positionen werden gelöscht. Was ist los mit mir?

Ich verstehe Ihre Logik nicht. Warum nicht: Der Auftrag wurde in eine Marktposition umgewandelt - der am weitesten entgegengesetzte schwebende Auftrag wurde gelöscht.
Das ist alles. Oder haben Sie eine Reihe von Aufträgen zu einem Preis?
 
artmedia70:

Das ist alles. Oder haben Sie ein Paket von Bestellungen zu einem Preis?


Nein, Bestellungen in Teilmengen...
artmedia70:
Ich verstehe Ihre Logik nicht... Warum nicht: Der Auftrag wurde in eine Marktposition umgewandelt - der am weitesten entgegengesetzte schwebende Auftrag wurde entfernt.

Auf diese Weise lösche ich die am weitesten entfernte Position, d.h. da es sich um eine Short-Position handelt, die Position mit dem niedrigsten Eröffnungskurs. Hier habe ich die Funktion umgeschrieben, hier sollte alles klar sein. Ich habe die Ausdrucke entfernt und eine zusätzliche Variable entfernt.

Die VariableamountOfCurrPending überträgt die Anzahl der verbleibenden Abschlüsse im Kauf. D.h., wenn der Ausgangsbetrag gleich ist undamountOfCurrPending der aktuelle Betrag der Aufträge ist, dann subtrahieren wir den Ausgangsbetrag der Aufträge vom aktuellen Betrag und erhalten die Differenz, und das ist der Betrag, der zum Löschen der Shorts benötigt wird. Siehst du das?

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
Gibt es einen Fehler, wo ich rot markiert habe? Wie kann man das Problem lösen?
 
hoz:

Nein, Bestellungen in Teilmengen.

Auf diese Weise entferne ich die am weitesten entfernte Position, d. h., da es sich um eine Short-Position handelt, ist es die Position mit dem niedrigsten Eröffnungskurs. Hier habe ich die Funktion umgeschrieben, sie sollte klar sein. Ich habe die Ausdrucke entfernt und eine zusätzliche Variable entfernt.

Die VariableamountOfCurrPending überträgt die Anzahl der verbleibenden Abschlüsse im Kauf. D.h., wenn der Ausgangsbetrag gleich ist undamountOfCurrPending der aktuelle Betrag der Aufträge ist, dann subtrahieren wir den Ausgangsbetrag der Aufträge vom aktuellen, wir erhalten die Differenz und das ist der Betrag, der benötigt wird, um die Shorts zu löschen. Siehst du das?

Gibt es einen Fehler, wo ich rot markiert habe? Wie kann man sie besser lösen?
 Ищется ордер, с минимальной ценой открытия

Ich würde im Kommentar eines schwebenden Auftrags seine Auftragsnummer im Raster angeben und die gleiche Nummer in den entsprechenden gegenüberliegenden schwebenden Auftrag schreiben. Wenn dann eine Marktposition gefunden wird, kann nach dem Lesen der Nummer in ihrem Kommentar die entsprechende Gegenposition mit einer identischen Nummer in ihrem Kommentar gefunden werden. Denn die Magie wird für etwas anderes verwendet.

ZS. Ich habe noch keine Zeit, Ihren Code zu lesen/parsen

 
artmedia70:

Ich würde in den Kommentar der ausstehenden Position deren laufende Nummer im Raster schreiben und die gleiche Nummer in die entsprechende gegenüberliegende ausstehende Position. Wenn dann eine Marktposition gefunden wird, wird nach dem Lesen der Nummer in ihrem Kommentar der entsprechende entgegengesetzte schwebende Auftrag ohne Probleme durch eine identische Nummer in seinem Kommentar gefunden. Da Sie Magier für etwas anderes einsetzen.

ZS. Ich habe noch keine Zeit, Ihren Code zu lesen/parsen



Ja, es ist kein Problem, den entsprechenden schwebenden Auftrag auf diese Weise zu finden, wenn die Anzahl der schwebenden Aufträge in beiden Richtungen gleich ist. Und wenn das anders ist, dann wird das nicht funktionieren, so wie ich es verstehe.
Grund der Beschwerde: