[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 6

 
DhP:


Berechnen Sie bei jedem Tick die Anzahl der ausstehenden Aufträge neu.

Wenn es weniger sind, bedeutet dies, dass ein schwebender Auftrag zu einem Marktauftrag geworden ist.

Alle übrigen (unnötig gewordenen) können gelöscht werden.


Zum Zeitpunkt der Löschung sind beide Aufträge Marktaufträge. Aber auch wenn der letzte schwebende Auftrag gelöscht oder ausgelöst wird, wird sein Ticket weiterhin ausgelöst und erzeugt einen Fehler. Und die vorletzte ist noch nicht abgeschlossen.
 
Andreev:

Danke für den Link!!! Ich werde es mir ansehen :) Mit Zeit, als auch magische Zahl und nach Auftragsart (bylimit oder selllimit) ist eine gute Idee. Aber wahrscheinlich haben Sie mich nicht ganz verstanden. Mein Problem ist nicht die Markierung des Auftrags, sondern WIE man ihn wieder entfernt. Ich kann nur den letzten schwebenden Auftrag löschen, egal wie ich den vorletzten definiere.
// ------------------------------------------------Ищете Ваши отложенники---------------------------------

   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType == OP_BUY) || (orderType == OP_SELL))
      {
         continue;
      }
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          
          
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
          
             if (ticket>0)                                               // 
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  
      
                             OrderDelete(ticket,CLR_NONE); // и удаляете их                       
                     
                            
                    }

       
      return (0);
   }
Wie ich Ihrem ersten Beitrag entnommen habe, verwende ich das folgende Beispiel, um zu definieren, dass nur der letzte schwebende Auftrag statt des ersten geschlossen wird, obwohl alle Bedingungen für den ersten schwebenden Auftrag erfüllt sind. Helfen Sie mir, den Fehler zu finden!!!!!!!!!!!!!" - Sie müssen alle verbleibenden Pending Orders löschen, nachdem Sie einige von ihnen in Market Orders umgewandelt haben - dieser Code sollte in Ihre Handelsbedingungen geschrieben werden und weitergehen...
 
Roman.:
Wie ich Ihrem ersten Beitrag entnommen habe, "verwende ich das folgende Beispiel zur Definition, aber es schließt nur den letzten schwebenden Auftrag statt des ersten, obwohl alle Bedingungen für den ersten schwebenden Auftrag erfüllt sind. Help me find error!!!!!!!!!!!!!" - Sie müssen alle verbleibenden Pending Orders löschen, nachdem Sie einige von ihnen in Market Orders umgewandelt haben - dieser Code sollte in Ihre Handelsbedingungen eingegeben werden und weitergehen...

Danke!!! Ich hatte nicht erwartet, dass es so kompliziert sein würde :)))
 
Roman.:
Wie ich Ihrem ersten Beitrag entnommen habe, "verwende ich das folgende Beispiel zur Definition, aber es schließt nur den letzten schwebenden Auftrag statt des ersten, obwohl alle Bedingungen für den ersten schwebenden Auftrag erfüllt sind. Help me find error!!!!!!!!!!!!!" - Sie müssen alle verbleibenden Pending Orders löschen, nachdem Sie einige von ihnen in Market Orders umgewandelt haben - dieser Code sollte in Ihre Handelsbedingungen eingegeben werden und weitergehen...

Ich dachte, es könnte ein paar Zeilen dauern ... :)
 
Andreev:

Zum Zeitpunkt der Löschung sind beide Aufträge marktfähig. Aber selbst wenn der letzte schwebende Auftrag gelöscht oder ausgelöst wird, zeigt das Ticket, das ihn ausgelöst hat, immer noch einen Fehler an. Der vorletzte wird noch da sein.


Ich kann mir gar nicht vorstellen, wie das möglich ist.

Wenn der Expert Advisor nach der Neuberechnung der ausstehenden Aufträge keinen einzigen Auftrag findet, gibt er sofort den Befehl zum Löschen der übrigen Aufträge.

Der Vorgang der Löschung der nicht benötigten schwebenden Aufträge muss notwendigerweise vor einem Eröffnungsvorgang erfolgen.

 
Roman.:

Wie ich Ihrem ersten Beitrag entnommen habe, "verwende ich das folgende Beispiel zur Definition, aber es schließt nur den letzten schwebenden Auftrag statt des ersten, obwohl alle Bedingungen für den ersten schwebenden Auftrag erfüllt sind. Helfen Sie mir, den Fehler zu finden!!!!!!!!!!!!!" - Sie müssen alle verbleibenden Pending Orders löschen, nachdem Sie einige von ihnen in Market Orders umgewandelt haben - dieser Code sollte in Ihre Handelsbedingungen geschrieben werden und weitergehen...

// ------------------------------------------------Ищете Ваши отложенники---------------------------------

   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType == OP_BUY) || (orderType == OP_SELL))
      {
         continue;
      }
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          
          
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
          
             if (ticket>0)                                               // 
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  
      
                             OrderDelete(ticket,CLR_NONE); // и удаляете их                       
                     
                            
                    }

       
      return (0);
   }
Haben Sie schon einmal versucht, Codes kompakt zu schreiben?

Hier ist Ihr Code:

// ------------------------------------------------Ищете Ваши отложенники---------------------------------

   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--) {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))                            continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType == OP_BUY) || (orderType == OP_SELL))                    continue;
      ticket = OrderTicket( );                         // Номер ордера
      orderLots = OrderLots();                         // Lots   
      SL =  OrderStopLoss();                           // Значение StopLoss ордера
      TP = OrderTakeProfit();                          // Значение TakeProfit ордера
      if (ticket>0) {
         while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
            Sleep(100);
            OrderDelete(ticket,CLR_NONE); // и удаляете их                       
         }
      return (0);
      }
 
Andreev:

Ich dachte, es wäre vielleicht möglich, ein paar Zeilen einzubauen ... :)

Nun. artmedia70 (24.07.2011 20:01) hat alles in fast zwei Zeilen gepackt. Genau wie Sie es wollten)))
 

Bitte helfen Sie mir, wo mache ich einen Fehler? Die Idee ist, dass der Auftrag in dem Takt, in dem er geschlossen wurde, nicht geöffnet werden sollte.


OrderSelect(OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY);
if ((условие 1)&&(условие 2)&&(OrderCloseTime()!=Time[0]))
 {
 OrderSend...; 
 }

Aber im Tester sind die Bedingungen nach dem Schließen des Auftrags immer noch erfüllt, und es wird 1 weiterer Auftrag in derselben Richtung eröffnet.

 
artmedia70:
Haben Sie noch nie versucht, Codes kompakt zu schreiben?

Hier ist Ihr eigener Code:

Ich habe... :-))) Das ist eine Angewohnheit von Pascal... Die Lesbarkeit ist schlechter... Vor allem für diejenigen, die nicht allzu "eingeweiht" sind... :-))) Und bei Operationen in verschachtelten Schleifen und Bedingungen brauchen Sie eine Einrückung auf die Tabulatorbreite oder 3 Leerzeichen - als letzten Ausweg... :-))
 
LazarevDenis:

Bitte helfen Sie mir, wo mache ich einen Fehler? Die Idee ist, dass der Auftrag in dem Takt, in dem er geschlossen wurde, nicht geöffnet werden sollte.


Aber im Tester sind die Bedingungen nach dem Schließen des Auftrags immer noch erfüllt, und es wird 1 weiterer Auftrag in derselben Richtung eröffnet.


Um Ihnen zu helfen, googeln Sie diese und suchen Sie nach etwas wie: open and close one order on one bar site:mql4.com - und Sie werden Glück haben.