Ich weiß nicht mehr weiter... ArrayMaximum/Minimum - Seite 2

 
Carl Schreiber #:

Auf diesem Bild:

 

ist zu sehen, dass low0 das aktuellste Tief 1790,89 hat low5 das älteste - ist das so wie Du Dir das ausgedacht hast und wird das von den Index-Grenzen so erfasst, oder ist das anders?

Ja, mit ArraySetAsSeries==true, genau so wollte ich das.

Die 0-te Kerze wird nicht eingerahmt, weil er bei 0 gleich wieder auf 5 springt, aber damit kann ich erstmal leben. Die laufende Bewegung ist jetzt noch nicht so wichtig. Darüber mache ich mir später Gedanken.

Das Rechteck wird ohne Bedingung auch mit 200 Balken so gezeichnet wie es soll. Nur mit Bedingung werden die Indizes von ArrayMinimum nicht übernommen.
Habe jetzt schon als BEdingung das hier gesetzt:

   if(t2==3)
      {
       t1=t2;
       rs.highest=t2;  // Hiermit werden die Indize der Hoch und Tiefpunkte gleich den neuen Grenzen gesetzt.
       rs.lowest=t2;   // Leider macht er im nächsten Durchlauf das Selbe und setzt sie zurück auf 5 und 3.
       GetStructure();
       }

Irgendwas stimmt doch da nicht... Warum gibt er mir denn einen Index raus, der gar nicht im Array ist? Ich weiß, Du möchtest darauf hinaus, dass vielleicht irgendwo falsche Werte übergeben wurden, aber danach suche ich ja jetzt auch schon die ganze Zeit. Hast Du eine Idee, wo das sein könnte? Ich sehe es nämlich nicht. Probiere jetzt noch mal eine einfacherer Anordnung an, um ArrayMAx/Min gesondert zu testen.

 
pennyhunter #:

Irgendwas stimmt doch da nicht... Warum gibt er mir denn einen Index raus, der gar nicht im Array ist? Ich weiß, Du möchtest darauf hinaus, dass vielleicht irgendwo falsche Werte übergeben wurden, aber danach suche ich ja jetzt auch schon die ganze Zeit. Hast Du eine Idee, wo das sein könnte? Ich sehe es nämlich nicht. Probiere jetzt noch mal eine einfacherer Anordnung an, um ArrayMAx/Min gesondert zu testen.

Genau dafür gibt bes den Debugger, mit ihm kann man genau sehen welche Variablen welche Werte wann annehmen - dann sollte man genau wissen, wie es zu solchen Fehlern kommt.

 
Carl Schreiber #:

Genau dafür gibt bes den Debugger, mit ihm kann man genau sehen welche Variablen welche Werte wann annehmen - dann sollte man genau wissen, wie es zu solchen Fehlern kommt.

Ja schon, den Debugger hatte ich ja auch schon benutzt aber ehrlich gesagt, wenn Du meinen ersten Post nochmal liest, wird Dir auffallen, dass ich das was jetzt durch die Screenshots deutlich geworden ist, schon am Anfang wusste.
Jetzt habe ich das Ganze in eine genauere Form gebracht, bin aber der Lösung nicht viel näher gekommen.
Fällt Dir Nicht doch noch irgendwas ein, warum es nicht klappen könnte?
Du führst mich doch an der Nase herum! :DD
 
pennyhunter #:
Ja schon, den Debugger hatte ich ja auch schon benutzt aber ehrlich gesagt, wenn Du meinen ersten Post nochmal liest, wird Dir auffallen, dass ich das was jetzt durch die Screenshots deutlich geworden ist, schon am Anfang wusste.
Jetzt habe ich das Ganze in eine genauere Form gebracht, bin aber der Lösung nicht viel näher gekommen.
Fällt Dir Nicht doch noch irgendwas ein, warum es nicht klappen könnte?
Du führst mich doch an der Nase herum! :DD

Ich führe niemanden auch Dich nicht an der Nase herum, ich versuch die Leute in die Lage zu versetzen, die Fehler, die sie selber programmiert haben, auch wieder selbst zu finden und zu korrigieren - oder willst Du immer abhängig bleiben von Leuten, die bereit sich sich Deiner anzunehmen?

Was ist denn jetzt damit geworden: "Probiere jetzt noch mal eine einfacherer Anordnung an, um ArrayMAx/Min gesondert zu testen." ?

 
Carl Schreiber #:

Ich führe niemanden auch Dich nicht an der Nase herum, ich versuch die Leute in die Lage zu versetzen, die Fehler, die sie selber programmiert haben, auch wieder selbst zu finden und zu korrigieren - oder willst Du immer abhängig bleiben von Leuten, die bereit sich sich Deiner anzunehmen?

Was ist denn jetzt damit geworden: "Probiere jetzt noch mal eine einfacherer Anordnung an, um ArrayMAx/Min gesondert zu testen." ?

Du schreibst das schon wieder so, als wüsstest Du die Antwort, aber wolltest sie nicht sagen.

War auch nicht böse gemeint, aber das war echt Arbeit und das eigentlich für fast Nichts. Ehrlich gesagt hatte ich das mit dem Debugger schon vor dem ersten Post gemacht, und wenn Du den nachliest, leuchtet das auch ein.

Und was heißt denn abhängig, wenn Du eine Klasse benutzt, die jemand anders geschrieben hat, bist Du dann abhängig? Und wenn ja, ist das dann negativ, dass Du sie nutzt?
Oder wenn Du in der Doku nachschlägst, bist Du dann nicht auch abhängig?
Also ich für meinen Teil würde gerne dieses Forum nutzen und stelle hier eine Frage. Es ist keine Anfrage dass Du mir was programmieren sollst. Es ist lediglich eine Frage über eine MQL Funktion, die scheinbar eine Besonderheit hat, die nicht offensichtlich ist, nicht in der Doku steht und auch eigentlich nicht logisch ist. Außer natürlich ich habe etwas übersehen. Also was ist denn nun, weißt Du was oder nicht :DD
 
Carl Schreiber #:

Ich führe niemanden auch Dich nicht an der Nase herum, ich versuch die Leute in die Lage zu versetzen, die Fehler, die sie selber programmiert haben, auch wieder selbst zu finden und zu korrigieren - oder willst Du immer abhängig bleiben von Leuten, die bereit sich sich Deiner anzunehmen?

Was ist denn jetzt damit geworden: "Probiere jetzt noch mal eine einfacherer Anordnung an, um ArrayMAx/Min gesondert zu testen." ?

So ich hab jetzt mal eine eigene GetArrayMinimum() Funktion geschrieben. Ich erkläre jetzt aber nicht mehr vier mal wie es funktioniert. Falls es jemanden interessiert, einfach Code runterziehen, kompilieren und mit dem Original vergleichen.

//+------------------------------------------------------------------+
//|                                     SeekMinRangeSimplified02.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <ChartObjects/ChartObjectsShapes.mqh>
CChartObjectRectangle rect;

struct RectStruct
  {
   int               highest;
   int               lowest;
   datetime          timeleft;
   double            priceupper;
   datetime          timeright;
   double            pricelower;
  };

RectStruct rs;

int t1=20, t2=20;
double High[], Low[];
datetime Time[];
double  ymin;
int     xmin=t2;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Time,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ArrayFree(High);
   ArrayFree(Low);
   ArrayFree(Time);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {   
   rect.Delete();     
   CopyBuffers();   
   GetValues();          
   GetStructure();

   if(t2==10)
      {
       t1=t2;
       xmin=t2; //Das hier ist ein Eingriff, den man in der Original ArrayMinimum Funktion nicht machen kann.

       GetStructure();
       }

      Comment(
           "\nrs.highest: ",rs.highest,
           "\nrs.lowest: ",rs.lowest,
           "\nrs.timeleft: ",rs.timeleft,
           "\nrs.priceupper: ",rs.priceupper,
           "\nrs.timeright: ",rs.timeright,
           "\nrs.pricelower: ",rs.pricelower,
           "\nAbsRange: ",AbsRange
           );
   
   t2--;
   if(t2==0)
   {
    t1=t2=20;
    }        
          
   rect.Create(0,"Rectangle00",0,rs.timeleft,rs.priceupper,rs.timeright,rs.pricelower);
   rect.Color(StringToColor("clrMediumBlue"));
   rect.Width(2);  
  }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CopyBuffers()
  {
   CopyHigh(_Symbol,_Period,0,21,High);
   CopyLow(_Symbol,_Period,0,21,Low);
   CopyTime(_Symbol,_Period,0,21,Time);   
   }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GetStructure()
  
   
     {
      rs.highest=ArrayMaximum(High,t2,t1);
      rs.lowest=GetArrayMinimum(Low,t2,t1);      
      rs.timeleft=Time[t1];
      rs.priceupper=High[rs.highest];
      rs.timeright=Time[t2];
      rs.pricelower=Low[rs.lowest];
      }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   
int GetArrayMinimum(const double &array[], const int &indexright, const int &indexleft)
   {        
    ymin=array[xmin]; //hier wird mit ymin ein Initialpreis benötigt, mit dem die weiteren Preise verglichen werden. ArrayMinimum hängt also bei 
                      //diesem funktionsinternen Initialpreis. Dies ist bei ArrayMaximum einfacher,
                      //dort kann mit 0 begonnen werden. Schließlich sind alle Preise größer als 0. Einen willkürlichen Preis einzugeben, der größer als 
                      //anderen Preise ist, wäre eine weitere Lösung des Problems. Diese wäre jedoch bei einer sehr hohen Inflation problematisch.
    for(int i=indexleft;i>=indexright;i--)
     {      
      if(array[i]<ymin)
        {
         xmin=i;
         }
      }
      return(xmin);
    }     

Gut. Das heißt ich kann morgen anfangen mit meinem Klassenarray aus Rechtecksobjekten...

Also ist es tatsächlich eine Eigenart der ArrayMinimum Funktion. Hast Du das gemeint, Claudius?

 
pennyhunter #:

So ich hab jetzt mal eine eigene GetArrayMinimum() Funktion geschrieben. Ich erkläre jetzt aber nicht mehr vier mal wie es funktioniert. Falls es jemanden interessiert, einfach Code runterziehen, kompilieren und mit dem Original vergleichen.

Gut. Das heißt ich kann morgen anfangen mit meinem Klassenarray aus Rechtecksobjekten...

Also ist es tatsächlich eine Eigenart der ArrayMinimum Funktion. Hast Du das gemeint, Claudius?

Sehr gut, gratuliere!

Übrigens, da (nicht nur) ich immer wieder Schwierigkeiten habe, die 'Richtung' bei zeitbezogenen Arrays richtig zu verwenden, kontrolliere ich das immer an time[] bzw. CopyTime().

Außerdem verwende ich #define  für die relevanten Indices:

#define ßTOT 8 // alle, is um 1 größer als ßn (max)
#define ß0   7 // index für die letzte Bar (daher ß)
#define ß1   6
#define ß2   5
#define ß3   4
#define ß4   3
#define ß5   2
#define ß6   1
#define ß7   0

Ist ganz praktisch - aber leider kann der Debugger diese #defines nicht umsetzen, dafür müsste man das als Variable deklarieren, wäre einen ganz schwachen Hauch langsamer, vermute ich.

Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyTime
Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyTime
  • www.mql5.com
CopyTime - Zugang zu Zeitreihen und Indikatoren - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Grund der Beschwerde: