Zeitproblem

 

Ich habe ein Zeitproblem. Hier habe ich schon nachgesehen bei demselben Problem und vielen Links, denen ich allen gefolgt bin (inklusive source code lesen), es löst nur mein Problem nicht: https://www.mql5.com/en/forum/173697

Die Aufgabe ist folgende: zeichne Eröffnungs- und Schlußkurslinien nach Zeitangabe des Benutzers.
Das sollte doch eigentlich nicht so schwer sein. In anderen Beispielen wird einfach eine volle Stunde genommen, nur hilft das wenig, wenn ich außerhalb einer Stunde bin.
Ich verwende grundsätzlich nur Serverzeiten, Berechnung sowie Zeichnung sollte sinnvollerweise nur dann stattfinden, wenn wir im erlaubten Zeitraum sind (es macht ja keinen Sinn, einen Kurswert zu holen, wenn er uns überhaupt nicht interessiert).
Und ich bin soweit gekommen (nur das relevante):

// === Kopf
#property indicator_color1 DarkOrange // 8h open line
#property indicator_color2 DimGray    // 17:30h Xetra close line
// --- user inputs
extern int START_8Hour   = 9;  // 9 servertime = 8h local
extern int END_XHour     = 18; // 18 servertime = 17h local
extern int END_XMin      = 30; // Xtime will be -> 17:30 local
extern int START_PAINT   = 9;  // 9 servertime = 8h local, min START_8Hour
extern int END_PAINTHour = 18; // 18 servertime = 17h local, max END_XHour
// --- variables a.o.
double LineOpen8[];   // value buffers for line printing
double LineXClose[];  //
 
// === Initialisierung: Buffers
   SetIndexBuffer(0,LineOpen8);   // 8h open line
   SetIndexStyle(0,DRAW_NONE);    // quasi empty, done in start
   SetIndexBuffer(1,LineXClose);  // Xetra close line
   SetIndexStyle(1,DRAW_NONE);    // quasi empty, done in start
// === Berechnung
   static double Open8, XClose, CBClose; // when found fix value in these
   for(i=limit;i>=0;i--)                 // from oldest to current
   {
      if(TimeHour(Time[i])==START_8Hour && TimeMinute(Time[i])==0)      Open8=Open[i];
      if(TimeHour(Time[i])==END_XHour && TimeMinute(Time[i])==END_XMin) XClose=Close[i]; 
      if(TimeHour(Time[i])>=START_PAINT && TimeHour(Time[i])<END_PAINTHour)
      {  // --- paint during allowed painting hours
         LineOpen8[i]=Open8;     SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1); // start8h
         LineXClose[i]=XClose;   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1); // endxetra
       }
    }

Das funktioniert auch einigermaßen. Ich sage einigermaßen, weil die Werte im M1 Chart (bis auf wohl Broker abhängige Abweichungen von ca. 1-2 Punkten) mit "offiziellen" Werten übereinstimmen.
Aber wenn ich aus demselben Chart Zeitfenster hochschalte, wird je nach Ebenenhöhe die Differenz immer größer.
Ich dachte logisch, da sich [i] auf die Kerze im aktuellen Chart bezieht, aber bis zu m30 sollten die Werte gleich sein, denn m30 zählt 00/30/00/30....
Ich habe also die Berechnung der Werte geändert in Minutenperioden mit iOpen/iClose(0,PERIOD_M1,0), das hilft aber auch nicht.
Nächster Versuch, alle Variablen umgebaut mit ArraySeries, sieht so aus:

extern string START_8="09:00";      // time arrays use mql time, so
extern string END_X="18:30";        // convert later with StringToTime()
extern string START_PAINT="09:00";
extern string END_PAINT="18:00";

// === Berechnung
   // === setting up the arrays =====  
   datetime BarsTime[];                // define the buffers for the arrays
   double BarsOpen[], BarsClose[];     // only need these here
   // --- Set the bar arrays as timeseries with info about each bar
   // --- true: reverse order, count  with (i=0,i<limit|copied,i++)
   ArraySetAsSeries(BarsTime,true);    // bars Time
   ArraySetAsSeries(BarsOpen,true);    // bars Open
   ArraySetAsSeries(BarsClose,true);   // bars Close
   // --- copy timeseries containing the open/close bars we need for calc
   int copied=CopyTime(NULL,0,0,1000,BarsTime); // 1000 bars should be enough
   if(copied<=0) { Print("can't copy BarsTime to Array"); }
   // --- prepare the arrays
   ArrayResize(BarsTime,copied);
   ArrayResize(BarsOpen,copied);
   ArrayResize(BarsClose,copied);
   // === setting up the arrays =====
   for(i=0;i<copied;i++) // current to oldest, Series=true
   {
      if( BarsTime[i]==StringToTime(START_8) ) Open8=BarsOpen[i];
      if( BarsTime[i]==StringToTime(END_X) )   XClose=BarsClose[i];
      if( BarsTime[i]>=StringToTime(START_PAINT) && BarsTime[i]<StringToTime(END_PAINT) )
         // --- nothing to change here
   }

Hier haben aber BarsOpen/BarsClose[i] alle den Wert null.
So langsam verstehe ich gar nichts mehr. Wenn ich BarsTime habe, dann habe ich dazu doch auch die entsprechenden BarsOpen/BarsClose Werte.

18:30 Schlußkurs ist ein fester Wert zu einem festen Zeitpunkt, und der bleibt immer derselbe, egal in welchem Zeitfenster ich mich befinde. Das kann doch nicht so schwer sein, troztdem fehlt mir hier irgendwas. Wäre nett, wenn jemand das fehlende Puzzleteil hätte.

Danke für Eure Aufmerksamkeit.

Horizontal Line at Bar Open
Horizontal Line at Bar Open
  • 2006.03.10
  • www.mql5.com
I would like an indicator which draws a Horizontal Line for the Whole Day at Open Price of the Bar at the Time Input(chosen) by user...
 

Du kannst zB. auf einen h1 Chart eine senkrechte Linie zwischen den h1 Zeiten ( 17:30, 16:45,..) NUR zeichnen, wenn Du den Ort über Pixel berechnest.

Auf einem h1-Chart 'kennt' Time[..] nur 00:00, 01:00, 02:00 etc

Grund der Beschwerde: