fehlende Daten / Performance?

 

Hallo,

zur Datenanalyse habe ich mir ein EA gebaut, der mir die Daten eines Indikators in ein File schreibt. Soweit soweit funktioniert der EA.

Was mir aber aufgefallen ist, ist das Daten im File fehlen. Nun habe ich eine einfache Funktion gebaut, die einfach die Sekunden in eine Datei schreibt.

int glSec;

int OnInit()
  {

   EventSetTimer(1);

   glFileHandle = FileOpen("BSIData.csv",FILE_WRITE|FILE_CSV|FILE_UNICODE,";");

   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
//---
   datetime dt=TimeCurrent();
   MqlDateTime mdt;
   TimeToStruct(dt,mdt);  
   glSec = mdt.sec;

   FileWrite(glFileHandle,glSec);
  }

leider fehlen Daten (siehe Anhang!). Der Inhalt der Variable glSec wird zwar jede Sekunde in die Datei geschrieben, aber mdt.sec liefert nicht immer die Daten. So kommt es oft vor das ich doppelte Zahlen habe. z.B. 1,2,3,3,5,6,7,8,9,10,10,12,13,14,14,16....
hier fehlen also die Zahlen 4,11 und 15. Wie kann das sein. Mache ich was falsch?

Gruß,
Markus

Dateien:
BSIData.txt  7 kb
 

Das liegt wahrscheinlich am Unterschied von TimeLocal() (Timer) und TimeCurrent() (Kurse).

Schreib beide Zeiten in Deine Datei und vergleiche Sie! Bedenke, dass Du mal für eine Sekunde oder mehr keine Kurse bekommst, TimeCurrent() "steht" dann, TimeLocal() läuft aber weiter und Du schreibst zweimal denselben Kurs inn die Datei!

 
ok, danke. Werde ich testen...
 

so, habe mit folgendem EA getestet:

int glSec, i, glSync, glFileHandle;

int OnInit()
  {
//---

//OnTimer
   EventSetMillisecondTimer(1000);
   i = 0;
   glSync = 0;
//Create file for results
   glFileHandle = FileOpen("BSIData.csv",FILE_WRITE|FILE_CSV|FILE_UNICODE,";");

//---
   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
//---
   datetime dt=TimeCurrent();
   MqlDateTime mdt;
   TimeToStruct(dt,mdt);  
   glSec = mdt.sec;
   if(glSec==0) glSync=1;
   if(glSync==1)
      {
      FileWrite(glFileHandle,i," -- ",glSec," --- ",TimeLocal());
      Comment(i + " -- " + glSec + " --- " + TimeLocal());      
      i++;
      if(i==60) i=0;   
      }
  }

Das Ergebnis ist sehr interessant. Weder TimeCurrent() noch TimeLocal() liefert zuverlässige Daten (siehe Anhang). Nur mein selbst gebauter Timer liefert jede Sekunde und schreibt sie in die Datei.
Nach ein paar Minuten unterscheiden sich die Werte bereits um mehrere Sekunden...

Ich wollte eigentlich eine Funktion bauen die beim Ende einer "Bar" ein Array in ein anderes Array kopiert und das Erste leert. Wie soll ich das aber machen, wenn TimeCurrent/TimeLocal nicht alle Daten liefert und mein eigener Timer nicht synchron zu den Bars ist?

 
  1. Du kriegst nie alle Ticks! Man schickt lieber den aktuellen Tick als die seit dem letzten Tick fehlenden! Ist so.
  2. Der lokale EventTimer hängt sicherlich von der aktuellen Auslastung ab, besonders auf einer VPS: Wie viele andere sind noch auf dem Server!
  3. Die neue Bar gibt es wenn (in einem Indikator):
    static datetime tmeOpn = 0;
    ....
    if ( tmeOpn > time[0] ) {
       newBar = true;
       tmeOpn > time[0];
    } else
       newBar = false;
  4. Andere verwenden: rates_total
  5. Oder Du setzte selber tmeCls = tmeOpn + Timeframe*60; ... if (TimeCurrent() >= tmeCls ) { ...

 

ok, denke ich habe das Problem gelöst. Die Variable i zählt nun von 0 bis 59 und synchronisiert sich mit TimeLocal().
Es ist wohl so, dass TimeLocal() nicht ganz rund läuft und sich beim Übergang von 59 zu 0 wieder mit der Systemzeit synchronisiert. Dadurch ensteht eine Differenz von 1-2 Sekunden pro Minute.

int glSec, i, glSync

void OnTimer()
  {
//---
   datetime dt=TimeCurrent();
   MqlDateTime mdt;
   TimeToStruct(dt,mdt);  
   glSec = mdt.sec;
   if(glSec==0) glSync=1;
   if(glSync==1)
      {
      if(glSec>0 && glSec<5) i=glSec;      
      i++;
      if(i==60) i=0;   
      }
  }
Grund der Beschwerde: