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

 
dimkh87:
Nachmittags. Können Sie bitte mitteilen, ob MT4 und MT5 die Möglichkeit bieten, die Charts eines Instruments mit verschiedenen Zeitrahmen und die Indikatoren für diese Zeitrahmen zu überlagern? Zum Beispiel möchte ich in einem Fenster 3 Charts des Paares EUR/USD mit TFs anzeigen: Tag, 4-Stunden und Stunde, und auch die gleitenden Indikatoren dieser TFs überlagern. Ist das möglich? Ich freue mich über jede Hilfe.

Was tun mit der Zeitleiste? Oder ziehen Sie Balken aus kleineren Zeitskalen, die einige Balken breit sind?

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

Meine Herren, bitte beraten Sie mich, ich habe eine Funktion von Kim übernommen, die die Bar-Nummer der letzten geöffneten Position oder -1 zurückgibt.

Ich rufe diese Funktion auf und schreibe eine Bedingung

Ich habe mir Print angesehen und sehe, dass diese Funktion -1 zurückgibt. Zuerst dachte ich, es gäbe keinen Auftrag, aber nach einer Weile tauchte der Auftrag wieder auf und auf demselben Balken wurde nach dem Stop ein Geschäft eröffnet.

static datetime time_open = 0;
if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {
      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if( Open[0] != time_open )
         if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь
            ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);

      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         time_open = Open[0];
         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
         SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
         modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
       }
      }
 
Konstantin Nikitin:
Fehleranzeigeif( iOpen[0] != time_open )'iOpen' - nicht deklarierter Bezeichner

 
Вадим Мотеюнас:
es wird ein Fehler geschrieben, der aufif( iOpen[0] != time_open )'iOpen' zeigt- nicht deklarierter Bezeichner

Bei Kim funktionieren alle Funktionen! Sie haben es nicht richtig angewandt.

 
Vitaly Muzichenko:

Bei Kim funktionieren alle Funktionen! Sie haben es nicht richtig angewandt.

Niemand streitet hier, ich möchte nur verstehen, wie ich es falsch angewandt habe.

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

Niemand bestreitet das, aber ich würde gerne verstehen, warum ich es falsch anwende.

Drucken Sie alles aus - das ist das Richtige, um Fehler und Unzulänglichkeiten zu erkennen:

Print( NumberOfBarOpenLastPos("",0,-1,-1) );
 
Vitaly Muzichenko:

Drucken Sie alles aus - das ist die beste Lösung, um Fehler und Unzulänglichkeiten zu erkennen:

Ich wollte damit sagen, dass die Funktion -1 zurückgibt, d.h. der letzte Balken, an dem der Auftrag geöffnet wurde, wird von der Funktion nicht gefunden. Ich mache mir Sorgen, dass ich nicht die richtigen Parameter übergebe.

 
int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();//что означает это строка?что текущее время раньше цены открытия ордера, это как?
                    }
                 }
              }
           }
        }
     }
 
Вадим Мотеюнас:

Die Zeile bedeutet, dass Sie alle Positionen durchgehen und die neueste auswählen bzw. sich merken und mit ihr arbeiten. Dies ist der Fall, wenn die Positionen nicht in der richtigen Reihenfolge, sondern verstreut sind.

 

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

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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнюю позицию
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

Als Nächstes wählen wir eine aus und ersetzen sie durch die FunktioniBarShift(sym, tf, oot ,true);

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 einwandfrei, ebenso wie alle hier von I. Kim veröffentlichten Funktionen.

Grund der Beschwerde: