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

 
Alexey Viktorov:

1. Ich sagte überprüfen, nicht ersetzen. iFractals gibt 0 zurück, wenn es kein Fraktal gibt. Ich benutze es nicht regelmäßig und natürlich verstopfe ich die nicht ausgetrockneten Reste meines Gedächtnisses nicht mit solchen Kleinigkeiten.

2. Die Funktion ist zwar schrecklich geschrieben, funktioniert aber trotzdem.

3. Der letzte Wert wird in Kommentar angezeigt. Ersetzen Sie ihn durch.

und sehen Sie, wie oft es gedruckt wird

Viele, aber nie falsch. Als ob die Bedingung immer erfüllt wäre. Aber es sollte falsch sein.

 
Ghabo:

Oft, aber nie falsch. Es ist, als ob die Bedingung immer erfüllt ist. Aber es sollte falsch sein, im Screenshot widerspricht die Situation der Bedingung, aber wahr.


Auf dem Screenshot sind das erste und das zweite Fraktal markiert. Aber je nach Bedingung sucht die Funktion weiter, bis sie diejenige findet, die unter der ersten liegt. Und das vierte Fraktal ist niedriger als das erste... So steht es in der Bedingung.

Wenn die Bedingung ergänzt wird mit

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

Es wird auch falsch gedruckt.

 
Alexey Viktorov:

Das erste Fraktal und das zweite Fraktal sind auf dem Screenshot markiert. Aber je nach Bedingung sucht die Funktion so lange weiter, bis sie diejenige findet, die unter der ersten liegt. Und das vierte Fraktal ist niedriger als das erste... So steht es in der Bedingung.

Wenn die Bedingung hinzugefügt wird

Es wird auch falsch gedruckt.

Umkehrung der Bedingung
 if(fr2>fr1) return(true);
        else break;

Druckt false, aber die Bedingung ist erfüllt.

aqa1

 

Der zweite Zyklus liefert immer den Preis des im ersten Zyklus gefundenen Fraktals.

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

Der zweite Zyklus liefert immer den Preis des im ersten Zyklus gefundenen Fraktals.

Sie scheinen ein Problem mit der Logik zu haben.

Versuchen Sie, die Reihenfolge der Suche mit einfachen Worten zu beschreiben. Überlegen Sie, ob Sie alles richtig geschrieben haben. Und dann machen Sie eine Suchfunktion, die den Preis des gefundenen Fraktals nach seiner Seriennummer zurückgibt. Sobald Sie dies getan haben und der Preis für das Fraktal, das Sie durch seine Sequenznummer angegeben haben, korrekt ist, beginnen Sie mit der Logik zur Ermittlung des Preises für das nächste Fraktal (Sie haben zu diesem Zeitpunkt bereits eine Funktion, die den Preis liefert). Dann bleibt nur noch, diese Preise zu vergleichen.

Und man macht einen Haufen von allem auf einmal.

 

Vielleicht habe ich die Funktionsweise falsch verstanden?

Zuerst finde ich ein Fraktal, das erste oberhalb des MA (im Screenshot mit #1 markiert),

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

Ich schaue von dort aus weiter in die Geschichte, das erste Fraktal (im Screenshot mit #2 markiert). Wenn das Fraktal Nr. 2 größer ist als das Fraktal Nr. 1, gebe ich true zurück.

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

Ist alles korrekt?

aq11

 
Artyom Trishkin:

gibt den Preis des gefundenen Fraktals anhand seiner Sequenznummer zurück.

Ich suche nicht nach Zahlen, sondern nach der Bedingung, dass das Fraktal über dem MA liegt, die Ordnungszahl kann beliebig sein. Der Preis dieses Fraktals in der ersten Schleife wird korrekt in die Variable "fr1" geschrieben.

Das Problem liegt in der zweiten Schleife, wenn ich das richtig verstehe. Warum der Preis des Fraktals Nummer 2 nicht gefunden wird, ist unklar.

 
Ghabo:

Ich suche nicht nach Zahlen, sondern nach der Bedingung, dass das Fraktal über dem MA liegt, die Ordnungszahl kann beliebig sein. Der Preis dieses Fraktals im ersten Zyklus wird korrekt in die Variable "fr1" geschrieben.

Das Problem liegt in der zweiten Schleife, wenn ich das richtig verstehe. Ich verstehe nicht, warum der Preis des Fraktals Nummer 2 nicht gefunden werden kann.

Ich muss Ihnen die ganze Logik noch einmal erklären. Gibt es etwas, das Ihnen selbst einfällt?

1. In der ersten Schleife finden wir das Fraktal oberhalb des MA. Die Nummer des Balkens wird in die Variable num_bar geschrieben (Balken Nr. 11 auf dem Bildschirmfoto).

2. In der zweiten Schleife suchen wir nach dem zweiten Fraktal, das die Bedingung erfüllt. Wir beginnen die Suche ab num_bar... d.h. ab Takt #11, weil nf Null ist.

3. Das Fraktal ist gefunden. Der Wert ist gleich dem vorherigen. Die Bedingung wird nicht erfüllt, da die Bedingung > und < enthält, aber nicht gleich ist. Wenn wir == einstellen, wird das gleiche Kauderwelsch auftreten, aber von der anderen Seite.

Wahrscheinlich sollten wir nach dem zweiten Fraktal ab dem nächsten Takt num_bar+1 oder sogar +2 suchen.

 
Alexey Viktorov:

Die ganze Logik muss Ihnen neu erklärt werden. Gibt es irgendetwas, das Ihnen selbst einfällt?

1. Im ersten Zyklus finden wir ein Fraktal oberhalb des MA. Die Nummer des Balkens wird in die Variable num_bar geschrieben (Balken Nr. 11 auf dem Bildschirmfoto).

2. Suchen Sie in der zweiten Schleife nach dem zweiten Fraktal, das die Bedingung erfüllt. Wir beginnen die Suche ab der num_bar... d.h. aus dem Balken #11, weil nf gleich Null ist.

3. Das Fraktal ist gefunden. Der Wert ist gleich dem vorherigen. Die Bedingung wird nicht erfüllt, da in der Bedingung > dann < aber nicht gleich ist. Wenn wir == einstellen, wird der gleiche Unsinn passieren, nur von der anderen Seite.

Wahrscheinlich sollten wir nach dem zweiten Fraktal aus dem nächsten Takt num_bar+1 oder sogar +2 suchen.

Im Allgemeinen ist die Handlung in den ersten beiden Absätzen, habe ich es geäußert).

Für "num_bar+1" danke.

Ich kann das Minimum nicht finden.

Die Bedingung ist nicht erfüllt, der Pfeil ist gesetzt, erfüllt ist nicht gesetzt.

Die Bedingung ist wie folgt: Wenn der Abstand zwischen dem Minimum der vom MA gekreuzten Kerze und dem Minimumdes iLowest größer oder gleich 100 ist, setze ich den Pfeil.

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

Von B nach A finde ich das Minimum von C.

A-C=100 Pips bei Punkt B, sollte den Pfeil setzen.

Warum ist das nicht der Fall?

niedrig1

 
Ghabo:

Im Allgemeinen, die Aktionen in den ersten beiden Absätzen, sagte ich so)

Der zweite Punkt ist ein wenig falsch. Sie haben noch nicht definiert, wo wir anfangen zu suchen und wann wir welchen Wert erhalten werden. Und das ist es, was Sie denken lässt, dass Sie noch ein bisschen weiter suchen sollten.

Ghabo:

Das Minimum kann nicht gefunden werden.

Die Bedingung ist nicht erfüllt, der Pfeil ist gesetzt, die Bedingung ist nicht erfüllt.

Die Bedingung ist, dass, wenn der Abstand vom Minimum der Kerze überquerte die MA auf das Minimum der iLowest ist größer als oder gleich 100 zwischen den Preis Crossovers und der MA, ich den Pfeil setzen.

Von B nach A finde ich das Minimum von C.

A-C=100 Pips bei Punkt B, sollte den Pfeil setzen.

Warum wird es nicht angezeigt?

Es gibt etwas an diesem Code, das schwer zu verstehen ist.

Zumindest müssen wir wissen, wo und wie die Variablen indexS1 und indexS2 definiert sind und ob sie bei jedem Tick zurückgesetzt werden.

Und was passiert, wenn die МА-Kreuzung in eine Lücke gerät?


Und noch eine Frage: Wissen Sie, wie man den Debugger benutzt?

Grund der Beschwerde: