Testen von 'CopyTicks' - Seite 22

 
fxsaber:
Nein, leider nicht. Renat argumentierte, dass das Glas permanent für die gesamte marketwatch gestreamt wird. Dies ist jedoch in den meisten Situationen keine sinnvolle (verschwenderische) Lösung.

Das ist die einzig mögliche Option. Streaming-Einsätze sind ein natürlicher und untrennbarer Strom von Zecken.

Alles auf der Plattform ist miteinander verbunden und erfordert eine globale Datensynchronisation. Und dabei spielt der Tickstream eine entscheidende Rolle.

 
Renat Fatkhullin:

Dies ist die einzig mögliche Option. Streaming-Raten sind ein natürlicher und untrennbarer Strom von Zecken.

Alles auf der Plattform ist miteinander verbunden und erfordert eine globale Datensynchronisation. Und der Tickstream spielt dabei eine entscheidende Rolle.

Was aber, wenn kein EA bei BookEvent abonniert ist?

Empfehlen Sie, MarketWatch zu kürzen, um die Leistung zu verbessern?

 
Renat Fatkhullin:

Vor allem aber sind die obigen Berechnungen der Abtastrate irrelevant. Sie sind so ungeschickt gemacht (sie messen alles andere als die CopyTicks-Zeit), dass es sogar überraschend ist.

Ich habe mir die Geschwindigkeitsberechnungen nicht angesehen, ich werde mich selbst mit der von Ihnen beschriebenen Methode messen.
 
fxsaber:

Was aber, wenn kein EA bei BookEvent abonniert ist?

Empfehlen Sie, Marketwatch zu kürzen, um die Leistung zu verbessern?

Schneiden Sie es, wenn Sie wollen.

 
Renat Fatkhullin:

So testen Sie CopyTicks:

MqlTick ExtArr[2048];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   ulong from   =(TimeTradeServer()-1200)*1000;
   ulong ticks  =GetMicrosecondCount();
   int   records=CopyTicks(_Symbol,ExtArr,COPY_TICKS_INFO,from,2048);

   ticks=GetMicrosecondCount()-ticks;
   Print("Time: ",ticks," msc for ",records," records");
  }

Hier ist die Ausgabe in Mikrosekunden: 95 Mikrosekunden pro Stichprobe von 2048 INFO-Ticks für die letzten 20 Minuten

2016.10.18 14:15:38.673 TEST (USDCHF,M1)        Time: 95 msc for 1206 records
Das ist etwas ganz anderes als die von Ihnen behaupteten zehn Millisekunden. Das liegt daran, dass Sie die CopyTicks nicht gemessen haben.

Ich habe schon ein Auge auf diese Sache geworfen. Ich habe eine Menge Tests mit CopyTicks durchgeführt. Dieses Mal habe ich beschlossen, dass es ausreicht, den Indikator laufen zu lassen.

Ihre Variante.

Network 'xxx': authorized on MetaQuotes-Demo through Access Point EU Amsterdam (ping: 54.84 ms)

2016.10.18 14:29:11.966 Test14 (GBPUSD,M1)      Time: 20263 msc for 2048 records
2016.10.18 14:29:10.841 Test14 (GBPUSD,M1)      Time: 13190 msc for 2048 records
2016.10.18 14:29:07.788 Test14 (GBPUSD,M1)      Time: 13344 msc for 2048 records
2016.10.18 14:29:07.738 Test14 (GBPUSD,M1)      Time: 12751 msc for 2048 records
 

Es geht darum, einen engen Cache für die letzten 4096 Zitate zu finden.

Alles, was dort hineinkommt, dauert Mikrosekunden, und alles, was länger dauert, erfordert den Zugriff auf die Historie (einschließlich der Festplatte).

Daher war mein Beispiel für das Abrufen von Ticks für 20 Minuten auf USDCHF, die selten aktualisiert wird, im Cache, aber auf GBPUSD, es bereits überschritten letzten 4096 Ticks und musste auf die weit Datenbank zu gehen.

Wenn ich ulong von =(TimeTradeServer()-600)*1000 setze, dann passt es auch auf GBPUSD.

 
Renat Fatkhullin:

Es geht darum, einen engen Cache für die letzten 4096 Zitate zu finden.

Alles, was dort hineinkommt, dauert Mikrosekunden, und alles, was darüber hinausgeht, erfordert den Zugriff auf die Historie (einschließlich der Festplatte).

Bei Ihrer Demo ist dies tatsächlich der Fall. Bei BCS ist das nicht der Fall.

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 46.66 ms)


2016.10.18 15:12:32.949 Test14 (Si-12.16,M1)    Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1)    Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1)    Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1)    Time: 21926 msc for 1500 records

Und auf Alpari ist es gar nicht gut.

Network 'xxx': authorized on Alpari-MT5 through mt5.nl.3 (ping: 61.87 ms)

2016.10.18 15:14:47.159 Test14 (GBPUSD,M1)      Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1)      Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1)      Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1)      Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1)      Time: 36227 msc for 1836 records

Daher passt mein Beispiel für das Abrufen von Ticks für 20 Minuten bei selten aktualisiertem USDCHF in den Cache, aber für GBPUSD hat es bereits die letzten 4096 Ticks überschritten und zwingt mich, zu einer entfernten Datenbank zu gehen.

Oben wurde bereits auf die Unannehmlichkeiten von Copytix hingewiesen. Der vorgestellte Indikator verlangsamt sich, weil er gezwungen ist, copyix mehrmals aufzurufen. Und alle Verzögerungen sind darauf zurückzuführen. Hier ist der Grund

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Testen von 'CopyTicks'

fxsaber, 2016.10.11 19:23

Was ist der optimale (schnellste) Algorithmus, um die Ticks von_Zeit bis_Zeit zu erhalten?

Es wurde eine Lösung vorgeschlagen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Testen von 'CopyTicks'

fxsaber, 2016.10.12 08:44

Wenn nicht Null, sucht From inside CopyTicks (wahrscheinlich eine binäre Suche) nach einem Startpunkt - einem Index in der internen Basis.

Bitte fügen Sie eine Funktion hinzu, die den Index in der Datenbank nach Zeit zurückgibt. Dann wird diese Aufgabe optimal gelöst werden können

Um nun Ticks zwischen den Daten herunterzuladen, müssen wir eine UNBEKANNTE Anzahl von Ticks anfordern, beginnend mit dem Startdatum. Und prüfen Sie dann jedes Mal, ob das Enddatum erreicht ist. Und unter Berücksichtigung der Tatsache, dass jede Anfrage copytix ist sehr teuer, und Sie erhalten solche Bremsen.

 
fxsaber:

Und auf Alpari ist es gar nicht gut

Alpari wurde anscheinend repariert. BCS hat das nicht.

Es wäre gut, einen Zwischenspeicher für die zuvor angeforderten kopierten Daten zu haben. Nun, und wenn das Kopieren in mehreren Schritten erfolgt (from[i] bis from[i+ 1]), wäre es logisch, nach der ersten Anfrage eine Menge zwischenzuspeichern.

Alles in allem ist es nicht klar, wie die Funktion intern organisiert ist. Aber es ist schwer, damit zu arbeiten - zu 100 %.

 
Berater
long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_INFO, const uint count = 2000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = NewAmount - 2; i >= 0; i--)
    {
      if (NewTicks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }

  return(Res);
}

#define TOSTRING(A) " " + #A + " = " + (string)(A)

void OnTick( void )
{
  // возьмем тики с начала утренней сессии
  LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
  
  MqlTick Ticks[];

  int i = 0;
  int Sum = 0;

  const ulong StartTime  =GetMicrosecondCount();
  
  // Взяли свеженькие тики
  int Amount = GetFreshTicks(Ticks);
    
  while (Amount > 0)
  {
    Sum += Amount;
    i++;
    
    Print(TOSTRING(i) + TOSTRING(Amount) + TOSTRING(Sum) + TOSTRING(GetMicrosecondCount() - StartTime));
    
    // Взяли свеженькие тики  
    Amount = GetFreshTicks(Ticks);    
  }  
}
Ergebnis zu Metaquotes-demo
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1)       i = 40 Amount = 1453 Sum = 79414 GetMicrosecondCount()-StartTime = 584393
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1)       i = 39 Amount = 1999 Sum = 77961 GetMicrosecondCount()-StartTime = 584314
2016.10.18 16:06:18.729 Test15 (GBPUSD,M1)       i = 38 Amount = 1999 Sum = 75962 GetMicrosecondCount()-StartTime = 568509
2016.10.18 16:06:18.714 Test15 (GBPUSD,M1)       i = 37 Amount = 1999 Sum = 73963 GetMicrosecondCount()-StartTime = 552582
2016.10.18 16:06:18.696 Test15 (GBPUSD,M1)       i = 36 Amount = 1999 Sum = 71964 GetMicrosecondCount()-StartTime = 536790
2016.10.18 16:06:18.681 Test15 (GBPUSD,M1)       i = 35 Amount = 1999 Sum = 69965 GetMicrosecondCount()-StartTime = 520432
2016.10.18 16:06:18.666 Test15 (GBPUSD,M1)       i = 34 Amount = 1999 Sum = 67966 GetMicrosecondCount()-StartTime = 504725
2016.10.18 16:06:18.649 Test15 (GBPUSD,M1)       i = 33 Amount = 1999 Sum = 65967 GetMicrosecondCount()-StartTime = 488911
2016.10.18 16:06:18.634 Test15 (GBPUSD,M1)       i = 32 Amount = 1999 Sum = 63968 GetMicrosecondCount()-StartTime = 473372
2016.10.18 16:06:18.619 Test15 (GBPUSD,M1)       i = 31 Amount = 1999 Sum = 61969 GetMicrosecondCount()-StartTime = 458022
2016.10.18 16:06:18.604 Test15 (GBPUSD,M1)       i = 30 Amount = 1999 Sum = 59970 GetMicrosecondCount()-StartTime = 442557
2016.10.18 16:06:18.589 Test15 (GBPUSD,M1)       i = 29 Amount = 1999 Sum = 57971 GetMicrosecondCount()-StartTime = 427044
2016.10.18 16:06:18.571 Test15 (GBPUSD,M1)       i = 28 Amount = 1999 Sum = 55972 GetMicrosecondCount()-StartTime = 411524
2016.10.18 16:06:18.556 Test15 (GBPUSD,M1)       i = 27 Amount = 1999 Sum = 53973 GetMicrosecondCount()-StartTime = 396539
2016.10.18 16:06:18.541 Test15 (GBPUSD,M1)       i = 26 Amount = 1999 Sum = 51974 GetMicrosecondCount()-StartTime = 381185
2016.10.18 16:06:18.526 Test15 (GBPUSD,M1)       i = 25 Amount = 1999 Sum = 49975 GetMicrosecondCount()-StartTime = 366146
2016.10.18 16:06:18.511 Test15 (GBPUSD,M1)       i = 24 Amount = 1999 Sum = 47976 GetMicrosecondCount()-StartTime = 351066
2016.10.18 16:06:18.496 Test15 (GBPUSD,M1)       i = 23 Amount = 1999 Sum = 45977 GetMicrosecondCount()-StartTime = 336183
2016.10.18 16:06:18.481 Test15 (GBPUSD,M1)       i = 22 Amount = 1999 Sum = 43978 GetMicrosecondCount()-StartTime = 321109
2016.10.18 16:06:18.466 Test15 (GBPUSD,M1)       i = 21 Amount = 1999 Sum = 41979 GetMicrosecondCount()-StartTime = 306119
2016.10.18 16:06:18.449 Test15 (GBPUSD,M1)       i = 20 Amount = 1999 Sum = 39980 GetMicrosecondCount()-StartTime = 288558
2016.10.18 16:06:18.434 Test15 (GBPUSD,M1)       i = 19 Amount = 1999 Sum = 37981 GetMicrosecondCount()-StartTime = 273758
2016.10.18 16:06:18.419 Test15 (GBPUSD,M1)       i = 18 Amount = 1999 Sum = 35982 GetMicrosecondCount()-StartTime = 259255
2016.10.18 16:06:18.406 Test15 (GBPUSD,M1)       i = 17 Amount = 1999 Sum = 33983 GetMicrosecondCount()-StartTime = 244750
2016.10.18 16:06:18.391 Test15 (GBPUSD,M1)       i = 16 Amount = 1999 Sum = 31984 GetMicrosecondCount()-StartTime = 230100
2016.10.18 16:06:18.371 Test15 (GBPUSD,M1)       i = 15 Amount = 1999 Sum = 29985 GetMicrosecondCount()-StartTime = 216143
2016.10.18 16:06:18.361 Test15 (GBPUSD,M1)       i = 14 Amount = 1999 Sum = 27986 GetMicrosecondCount()-StartTime = 201830
2016.10.18 16:06:18.346 Test15 (GBPUSD,M1)       i = 13 Amount = 1999 Sum = 25987 GetMicrosecondCount()-StartTime = 186887
2016.10.18 16:06:18.331 Test15 (GBPUSD,M1)       i = 12 Amount = 1999 Sum = 23988 GetMicrosecondCount()-StartTime = 172667
2016.10.18 16:06:18.311 Test15 (GBPUSD,M1)       i = 11 Amount = 1999 Sum = 21989 GetMicrosecondCount()-StartTime = 158356
2016.10.18 16:06:18.299 Test15 (GBPUSD,M1)       i = 10 Amount = 1999 Sum = 19990 GetMicrosecondCount()-StartTime = 143450
2016.10.18 16:06:18.289 Test15 (GBPUSD,M1)       i = 9 Amount = 1999 Sum = 17991 GetMicrosecondCount()-StartTime = 128520
2016.10.18 16:06:18.269 Test15 (GBPUSD,M1)       i = 8 Amount = 1999 Sum = 15992 GetMicrosecondCount()-StartTime = 114209
2016.10.18 16:06:18.256 Test15 (GBPUSD,M1)       i = 7 Amount = 1999 Sum = 13993 GetMicrosecondCount()-StartTime = 100016
2016.10.18 16:06:18.246 Test15 (GBPUSD,M1)       i = 6 Amount = 1999 Sum = 11994 GetMicrosecondCount()-StartTime = 85745
2016.10.18 16:06:18.231 Test15 (GBPUSD,M1)       i = 5 Amount = 1999 Sum = 9995 GetMicrosecondCount()-StartTime = 71438
2016.10.18 16:06:18.219 Test15 (GBPUSD,M1)       i = 4 Amount = 1999 Sum = 7996 GetMicrosecondCount()-StartTime = 57293
2016.10.18 16:06:18.204 Test15 (GBPUSD,M1)       i = 3 Amount = 1999 Sum = 5997 GetMicrosecondCount()-StartTime = 43192
2016.10.18 16:06:18.181 Test15 (GBPUSD,M1)       i = 2 Amount = 1999 Sum = 3998 GetMicrosecondCount()-StartTime = 28943
2016.10.18 16:06:18.171 Test15 (GBPUSD,M1)       i = 1 Amount = 1999 Sum = 1999 GetMicrosecondCount()-StartTime = 15160
80K Ticks in einer halben Sekunde - langsam! Man kann natürlich sagen, dass wir mehr Ticks statt 2000 Ticks auf einmal hätten anfordern sollen. Was ist dann der optimale Anforderungswert?
 
fxsaber:
80.000 Ticks in einer halben Sekunde sind langsam! Es war notwendig, nicht 2000 Zecken auf einmal zu beantragen, aber mehr ist natürlich möglich. Welcher Anforderungswert ist dann optimal?

Optimal ist es, wenn Sie nur das herunterladen, was Sie selbst benötigen, und dann nur in Mikrosekunden neue Dateien aus dem nahe gelegenen Cache herunterladen.

Wenn Sie jedes Mal tiefe Abfragen machen und dabei auf die Festplatte fallen, dann ist das natürlich Ihre eigene Schuld.