Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 502

 
Vitaly Muzichenko:

Die Funktion geht durch und wählt den zeitlich neuesten, d.h. den letzten, aus

Als Nächstes haben wir einen ausgewählten Balken, den wir in der FunktioniBarShift(sym, tf, oot ,true) ersetzen;

Die Funktion gibt die Taktnummer nach Zeit zurück. Das ist alles.

Leider kann ich es nicht überprüfen, aber als ich es benutzte, funktionierte es perfekt, ebenso wie alle Funktionen, die hier von I. Kim veröffentlicht wurden.

Und wenn ich ein Ticket zugewiesen habe, wenn ich einen Auftrag eröffne und die Funktion eine fortlaufende Nummer auswählt, ist das in Ordnung?
 
Вадим Мотеюнас:
Schreibt eine Fehlermeldungif( iOpen[0] != time_open )'iOpen' - nicht deklarierte Kennung

Ich habe etwas Falsches geschrieben, ein wenig in die andere Richtung gedacht. Ändern Sie iOpen[0] in Open[0]. Korrigiert. Um es einfach auszudrücken. Wenn ich eine Bar öffne, erinnere ich mich an den Zeitpunkt der Bareröffnung, und es sind noch keine Bestellungen für diese Bar eingegangen.

 

In der Funktionsbeschreibung heißt es außerdem, dass

Die Auswahl der zu berücksichtigenden Positionen wird durch externe Parameter festgelegt:

  • sy- Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter setzen, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert -NULL- bedeutet das aktuelle Marktinstrument.
  • tf- Zeitrahmen. Der Standardwert0 bedeutet den aktuellen Zeitrahmen.
  • op- Handelsoperation, Positionsart. Gültige Werte:OP_BUY,OP_SELL oder-1. Der Standardwert-1 bedeutet eine beliebige Position.
  • mn- Positionsbezeichner, MagicNumber. Der Standardwert-1 bedeutet einen beliebigen Bezeichner.
Diese Werte sollten vor der ersten speziellen Funktion deklariert werden, d.h. die Tatsache, dass sie in der Beschreibung der FunktionNumberOfBarOpenLastPos() selbst enthalten sind, reicht nicht aus?

 
Вадим Мотеюнас:

In der Funktionsbeschreibung heißt es außerdem, dass

Die Auswahl der zu berücksichtigenden Positionen wird durch externe Parameter festgelegt:

  • sy- Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter setzen, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert -NULL- bedeutet das aktuelle Marktinstrument.
  • tf- Zeitrahmen. Der Standardwert0 bedeutet den aktuellen Zeitrahmen.
  • op- Handelsoperation, Positionsart. Gültige Werte:OP_BUY,OP_SELL oder-1. Der Standardwert-1 bedeutet eine beliebige Position.
  • mn- Positionsbezeichner, MagicNumber. Der Standardwert-1 bedeutet einen beliebigen Bezeichner.
Müssen die externen Parameter vor der ersten speziellen Funktion deklariert werden, d.h. esreicht nicht, dass sie in der Beschreibung der FunktionNumberOfBarOpenLastPos() selbst stehen?

Das reicht. In den externen Parametern können Sie die Werte eingeben, die Sie benötigen: MagicNumber, welche Positionen Sie suchen, wenn Sie BUY(0) und SELL(1) wollen - dann schreiben Sie "-1".

 
Konstantin Nikitin:

Ich habe etwas Falsches geschrieben, ein wenig in die andere Richtung gedacht. Ändern Sie iOpen[0] in Open[0]. Korrigiert. Um es einfach auszudrücken. Wenn ich einen Balken öffne, merkt er sich den Zeitpunkt der Balkenöffnung und es werden keine Aufträge für diesen Balken geöffnet.

viele Aufträge werden geöffnet und es sieht so aus, als ob die Bedingung if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) erfüllt ist, bevor ein Nicht-Auftrag geöffnet wird, da NumberOfBarOpenLastPos -1 zurückgibt

 
Вадим Мотеюнас:

viele Aufträge werden geöffnet, und es scheint, dass die Bedingung if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) erfüllt ist, bevor ein Nicht-Auftrag geöffnet wird, da NumberOfBarOpenLastPos -1 zurückgibt

Wenn Sie nach Aufträgen suchen, müssen Sie die Funktion in ihrer vollen Version verwenden, d. h. mit der Möglichkeit, nach Aufträgen und nicht nur nach Positionen zu suchen:

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

Dies ist ausreichend. In den externen Parametern können Sie die gewünschten Werte eingeben: Majik, welche Positionen gesucht werden, vielleicht nur BUY, wenn BUY(0) und SELL(1) benötigt werden - dann schreiben wir "-1".

wenn ich den Tester starte, gibt es keine offenen Aufträge, vielleicht ist das der Grund, warum -1 zurückgegeben wird, weshalb die Bedingung if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) nicht gilt?

 
Вадим Мотеюнас:

Beim Start des Testers gibt es keine offenen Aufträge, vielleicht wird deshalb -1 zurückgegeben und die Bedingung if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) ist nicht erfüllt?

Ich werde es jetzt überprüfen.

 
Vitaly Muzichenko:

Wenn Sie nach Aufträgen suchen, müssen Sie die Funktion in ihrer vollständigen Version verwenden, d. h. mit der Möglichkeit, nach Aufträgen und nicht nur nach Positionen zu suchen:

gibt immer noch -1 zurück

 
Вадим Мотеюнас:

gibt immer noch -1 zurück

Es funktioniert perfekt!

Von zwei Positionen hat es die letzte ausgewählt, die bei Takt 11 liegt, wie Sie auf dem Screenshot sehen können:


Code prüfen:

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }