Testen von 'CopyTicks' - Seite 42

 
1702 - die gefundenen CopyTicks-Fehler wurden behoben!
 

Nach einem erfolgreichen Aufruf von CopyTicks offline gibt GetLastError den Wert 4403 zurück.

 
Wenn Sie alle benutzerdefinierten Symbolticks auf diese Weise abrufen möchten, führt dies zu "Out of memory
CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, UINT_MAX); // out of memory


Ich werde es über CopyTicksRange machen, aber das CopyTicks-Verhalten scheint richtig zu sein, um es zu ändern.

 
Manchmal bewirkt CopyTicksRange, dass BARs aus dem bärtigen Jahr hochgeladen werden: 2003.hcc usw.
 
CopyTicksRange auf benutzerdefinierte Zeichen gibt Null zurück. CopyTicks ist normal.
 

CopyTicks (Build 1881) liefert ältere Daten als angefordert, wenn keine neuen Ticks angefordert werden. D.h. es werden Daten zurückgegeben, die älter sind als die des Parameters. Der Fehler ist fließend - er erscheint zu verschiedenen Zeiten, also habe ich einen kleinen Code geschrieben, der ihn reproduziert. Ich habe es im Tester auf EURUSD H1, 2017.08.01 - 2018.08.01.

void OnTick()
{
   static datetime lastActivityTime = D'2017.08.01';   
   static MqlTick ticks[2000];
   static const uint requestedCount = 2000;
   datetime dt[1];
   CopyTime(NULL, PERIOD_CURRENT, 0, 1, dt);
   if (lastActivityTime >= dt[0]) {
      return;
   }
   lastActivityTime = TimeCurrent();
   
   int zero = 0;
   int idx = 0;
   do {
      ++idx;
      CopyTime(NULL, PERIOD_CURRENT, idx, 1, dt);
      if (dt[0] <= D'2017.08.01') break;
      Print("dt[0]=", dt[0]);
      ulong from = 1000 * dt[0];
      int cnt = CopyTicks(Symbol(), ticks, COPY_TICKS_INFO, from, requestedCount);
      if (cnt < 1) {
         Print("Error in CopyTicks");
         return;
      }
      Print("cnt=", cnt);
      for (int i = 0; i < cnt; ++i) {
         if (ticks[i].time_msc < from) {
            Print("ERROR: i=", i, ", ticks[i].time_msc=", ticks[i].time_msc, " (", ticks[i].time, ")");
            i = i / zero;
         }
      }
      Print("done");
   } while(true);
}

Hier ist die Ausgabe:

2018.10.17 21:31:26.221 2017.08.01 12:00:00 dt[0]=2017.08.01 03:00:00

2018.10.17 21:31:26.221 2017.08.01 12:00:00 cnt=2000

2018.10.17 21:31:26.221 2017.08.01 12:00:00 ERROR: i=0, ticks[i].time_msc=1501552175606 (2017.08.01 01:49:35)

D.h. wir haben ab 03:00 Uhr angefordert und ab 01:49 Uhr erhalten. Unter realen Bedingungen betrug der Unterschied mehr als einen Monat.

 
Eine Frage an die Erfahrenen. Was sind die potenziellen Nachteile dieser Methode zur Gewinnung frischer Zecken?
input datetime inFrom = __DATETIME__;

// Свежие тики с последнего вызова
int GetFreshTicks( MqlTick &Ticks[] )
{
  static long LastTime = 0;
  static int LastAmount = 0;
  
  ArrayFree(Ticks);

  int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, LastTime ? LastTime : (long)inFrom * 1000);
  
  if (Size > LastAmount)
  {
    LastTime = Ticks[Size - 1].time_msc;
    int NewLastAmount = 1;
    
    for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
      NewLastAmount++;
      
    if (ArrayRemove(Ticks, 0, LastAmount))
      Size -= LastAmount;
      
    LastAmount = NewLastAmount;
  }
  else
    Size = ArrayResize(Ticks, 0);
  
  return(Size);
}

void OnTick()
{
  MqlTick Ticks[];
  
  if (GetFreshTicks(Ticks))
    ArrayPrint(Ticks);
}
 
fxsaber:
Hier ist eine Frage an die Experten. Welche Fehler können bei dieser Methode der Gewinnung von frischen Zecken auftreten?

Die Reihenfolge der Ticks mit der gleichen Zeit ist nicht garantiert, so scheint es.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Echtzeit-Ticks

Andrey Khatimlianskii, 2020.01.31 14:40

Übrigens gibt es einenhervorragenden Artikel von Vasily Sokolov über das richtige Sammeln von Zecken. Dort wird detailliert auf den analogen Synchronisationsprozess eingegangen (den ich nicht habe, weshalb manchmal gleiche Ticks gedruckt werden):

Die Funktion CopyTiks erlaubt jedoch nicht die Abfrage von N letzten Ticks. Stattdessen liefert sie alle Ticks, die von dem angegebenen Zeitpunkt stammen. Dies erschwert die Aufgabe. Wir sollten eine Abfrage durchführen, ein Array von Ticks erhalten und es mit einem Array von Ticks vergleichen, das wir bei der vorherigen Aktualisierung erhalten haben. Gleichzeitig erfahren wir, welche neu eingetroffenen Zecken nicht zum bisherigen Bestand gehören, d. h. neu sind. Aber es ist unmöglich, Zecken direkt miteinander zu vergleichen, weil es möglicherweise überhaupt keine sichtbaren Unterschiede zwischen ihnen gibt. Betrachten wir zum Beispiel die nachstehende Tabelle der Geschäfte:

Abbildung 5. Tabelle mit allen Geschäften und einem Beispiel für identische Geschäfte.

Wir sehen sofort zwei Gruppen von absolut identischen Zecken. Sie sind mit roten Rahmen markiert und haben die gleiche Zeit, das gleiche Volumen, die gleiche Richtung und den gleichen Preis. Wir sehen also, dass es unmöglich ist, einzelne Zecken miteinander zu vergleichen.

Aber es ist möglich,eine Gruppe von Zecken zu vergleichen. Wenn zwei Gruppen von Ticks gleich sind, kann man daraus schließen, dass diese und die folgenden Ticks bereits bei der letzten Kursaktualisierung analysiert wurden.


Пишем скальперский стакан цен на основе графической библиотеки CGraphic
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
  • www.mql5.com
Именно с этой, улучшенной и дополненной версией мы и начнем работать, чтобы постепенно превратить ее в скальперский стакан цен. Краткий обзор графической библиотеки CPanel Созданию пользовательских интерфейсов в MQL5 посвящено много статей. Среди них особенно выделяется серия Анатолия Кажарского "Графические интерфейсы", после которой сложно...
 
Andrey Khatimlianskii:

Die Reihenfolge der Ticks mit der gleichen Zeit ist nicht garantiert, so scheint es.

Wenn Sie von Gruppen von Zecken sprechen, scheint der Code nichts dagegen zu haben.

 
Der Tick-Cache wird nicht zurückgesetzt.
#define  TOSTRING(A) " " + #A + " = " + (string)(A)

MqlTick Ticks[];

void OnInit()
{
  Print(__FUNCTION__ + TOSTRING(TerminalInfoInteger(TERMINAL_MEMORY_USED)) + TOSTRING(MQLInfoInteger(MQL_MEMORY_USED))); // Распечатываем начальное состояние памяти.
  
  CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, D'2020.01.01' * 1000); // Получили историю тиков для инициализации по ней советника.
}

void OnTick()
{
  const int Size = ArraySize(Ticks);
  
  if (Size)
  {
    const long BeginTime = Ticks[Size - 1].time_msc;
    
    ArrayFree(Ticks);
    
    CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, BeginTime); // Получаем свежие тики без пропусков, чтобы гнать по ним советник.
  }
  
  Print(__FUNCTION__ + TOSTRING(TerminalInfoInteger(TERMINAL_MEMORY_USED)) + TOSTRING(MQLInfoInteger(MQL_MEMORY_USED))); // Распечатываем текущее состояние памяти.
}


Ergebnis (Kaltlauf - unmittelbar nach dem Start des Terminals).

OnInit TerminalInfoInteger(TERMINAL_MEMORY_USED) = 395 MQLInfoInteger(MQL_MEMORY_USED) = 1
OnTick TerminalInfoInteger(TERMINAL_MEMORY_USED) = 446 MQLInfoInteger(MQL_MEMORY_USED) = 1
OnTick TerminalInfoInteger(TERMINAL_MEMORY_USED) = 446 MQLInfoInteger(MQL_MEMORY_USED) = 1
OnTick TerminalInfoInteger(TERMINAL_MEMORY_USED) = 446 MQLInfoInteger(MQL_MEMORY_USED) = 1


Es ist möglich, den Expert Advisor auszuschalten, am Verbrauch des Terminals ändert sich nichts.

Grund der Beschwerde: