[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 29

 
hoz:

Können Sie mir sagen, wie ich Werte aus einem Zickzack-Indikator ziehen kann? Wie wird dies im Allgemeinen umgesetzt? D.h. wenn ich ein bestimmtes Extremum aufgreifen will, nicht nur das letzte.

Jetzt möchte ich zum Beispiel diesen Zickzackkurs an meinen Expert Advisor anhängen:

Ich verstehe, dass ich dieiCustom-Funktion verwenden muss, wie es in der Regel verwendet wird, um einen benutzerdefinierten Indikator zu adressieren, aber die Frage ist, wie die Knoten zu verbinden...

Der Puffer sucht nach dem Prinzip den Wert NEUTRAL(EMPTY_VALUE):

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
und Zugriff auf den Indikatorpuffer über iCustom().
 
TarasBY:

Der Puffer sucht nach einem EMPTY_VALUE-Wert, der dem Prinzip entspricht:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

und der Zugriff auf den Indikatorpuffer erfolgt über iCustom().


Das macht Sinn. Aber es wird so lange gesucht, bis wir auf einen nicht leeren Wert stoßen. Und wenn ich zum Beispiel, und zwar nicht den letzten nicht leeren Wert, also nicht das letzte Extremum, sondern einen anderen... Zum Beispiel hier auf dem Bildschirmfoto:

 
hoz:


Das macht Sinn. Auf diese Weise wird jedoch so lange gesucht, bis ein nicht leerer Wert gefunden wird. Und wenn ich zum Beispiel, und zwar nicht den letzten nicht leeren Wert, also nicht das letzte Extremum, sondern einen anderen... Zum Beispiel hier auf dem Bildschirmfoto:

Man sollte den Zähler der Extrema in die Schleife einführen und die Schleife bei der Anzahl der Extrema (nicht leerer Wert in einer Reihe) abbrechen.
 
TarasBY:
Geben Sie einen Extremwertzähler in die Schleife ein und unterbrechen Sie die Schleife bei der Anzahl der Extremwerte (nicht leerer Wert in einer Reihe).

Ich hab's. Ich danke Ihnen. Jetzt müssen wir das alles in der Praxis anwenden. Ich verstehe das Wesentliche, aber mein Kopf ist voller Filter, die mein Gehirn zum Kochen bringen...
 
hoz:

Ich hab's. Ich danke Ihnen. Jetzt müssen wir sie in der Praxis anwenden. Ich habe die Idee, aber es gibt so viele Filter in meinem Kopf, dass mein Gehirn kocht...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Wenn Sie die Taktnummer der Spitze benötigen, ändern Sie den Funktionstyp in int und schreiben Sie statt return(ind); return(i);

Beachten Sie auch, dass Sie, wenn Sie i in Ihrem Code verwenden, insbesondere bei Suchvorgängen (wie im Tutorial), i in dieser Funktion in eine beliebige andere Variable, zum Beispiel k, ändern müssen.

Und stellen Sie sicher, dass Sie iCustom innerhalb der Funktion für Ihren Indikator konfigurieren.

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Wenn Sie die Taktnummer der Spitze benötigen, ändern Sie den Funktionstyp in int und schreiben Sie statt return(ind); return(i);

Beachten Sie auch, dass Sie, wenn Sie i in Ihrem Code verwenden, insbesondere bei Suchvorgängen (wie im Tutorial), i in dieser Funktion in eine beliebige andere Variable, zum Beispiel k, ändern müssen.

Und stellen Sie sicher, dass Sie iCustom innerhalb der Funktion für Ihren Indikator konfigurieren.

Nikolai, es ist natürlich interessant, dass Sie die Bedingung geschrieben haben. Ich sehe sie an und denke...

if(ind!=0) n--;

else

if(ind!=0) return(ind);

Es stellt sich heraus, dass , wenn der Puffer des benutzerdefinierten Indikators den Wert Null zurückgibt, dann n--, und wenn derPuffer des benutzerdefinierten Indikators den Wert Null zurückgibt, dann ... geben wir den Wert des Indikatorpuffers zurück.

Aber die Bedingungen sind dieselben. Und so weiter und so fort, wenn nicht gar null...

 
hoz:

Nikolai, es ist natürlich interessant, dass Sie die Bedingung geschrieben haben. Wenn ich es mir ansehe, denke ich...

Es stellt sich heraus, dass , wenn der benutzerdefinierte Indikatorpuffer einen Wert von Null zurückgibt, dann n--, und wenn derbenutzerdefinierte Indikatorpuffer einen Wert von Null zurückgibt, dann ... geben wir den Wert des Indikatorpuffers zurück.

Aber die Bedingungen sind dieselben. Und so weiter und so fort, wenn nicht gar null...

Beim Versuch, den Code korrekt einzufügen, sind Klammern herausgefallen:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

Wenn n>1 {

wenn der Puffer nicht leer ist, wird 1 von n abgezogen

} andersherum{

wenn der Puffer nicht leer ist, seinen Wert zurückgeben

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


oder so, was noch prägnanter ist. Ich bin besessen von der Schnelligkeit und der Schönheit des Codes, nehmen Sie es mir nicht übel.)
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


oder so, was noch prägnanter ist. Ich bin besessen von der Geschwindigkeit und der Schönheit des Codes, nehmen Sie es mir nicht übel).


Im Allgemeinen ist in beiden Fällen alles in Ordnung. Ich bin nur daran gewöhnt, den Code etwas anders zu schreiben, er ist auf diese Weise leichter zu lesen, während Ihrer anders ist. Die erste Klammer in jedem Ihrer Codes bewegt sich nicht. Ich habe es in meinen EDITOR eingegeben, und so ist alles an seinem Platz:

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


Im Grunde ist alles in Ordnung, in beide Richtungen. Ich bin es einfach gewohnt, Code auf eine andere Art zu schreiben: So ist er leichter zu lesen, während Ihr Code anders ist. Die erste Klammer in jedem Ihrer Codes bewegt sich nicht. Ich habe es in den Editor eingegeben, und in diesem Formular ist alles an seinem Platz:


wenn der Code über 1000 Zeilen geht, fängt man an, kompakt zu schreiben).

Auch in MT4 leidet die Leistung, insbesondere bei der Durchführung von Tests. Die lakonische Version ist schneller.