Testen von 'CopyTicks' - Seite 19

 

1434 - 1 ms dauert es im Durchschnitt, bis CopyTicks bereits 1000 Ticks hochgeladen hat. Langsam, wie es scheint.

Anforderung von TRADE0tic mit from_msc des letzten zuvor empfangenen Ticks. Ich erhalte 3 Ticks, aber in 0,3 - 0,9 ms! - Jetzt sehr langsam.

 
fxsaber:

Ich habe den obigen Code genau protokolliert und die Gründe dafür herausgefunden. Wenn CopyTicks (from > 0) Ticks vor dem neuesten Tick erhält, kann es einige überspringen.

Eine sehr wichtige Antwort vom Service Desk.

Was das ursprüngliche Problem betrifft - dass CopyTicks beim nächsten Aufruf mehr Ticks für denselben Zeitraum liefern kann:

Dies ist in der Tat der Fall. Das Problem ist, dass die Börsendatenströme Bid/Ask und Flipper/Volume unterschiedliche Ströme sind, die schon börsenseitig nicht miteinander synchronisiert sind.

Aus diesem Grund gibt es Situationen, in denen zuerst Bid/Ask mit der Zeit 12:12:12.300 und etwas später Flipper/Volume mit der Zeit 12:12:12.299 kommt.

Wenn Sie also Daten seit dem letzten Tick (12:12:12.300) anfordern, werden Sie keinen neuen Flipper für 12:12:12.299 erhalten.

PS: Das Terminal speichert und sendet die Ticks nach Zeit sortiert. Das heißt, die zeitliche Abfolge der Ticks, die an CopyTicks übergeben werden, ist immer steigend.

Es gibt zwei Ströme von Zecken, die empfangen werden - INFO und TRADE. ALL ist eine synthetische Verbindung (scheint auf der Endseite zu sein), deshalb können solche Pannen auftreten.

Es ist wegen der Synthese, dass es solche Worte gab

Slawa:

die ersten Tick-Sätze nach dem Aufruf von CopyTicks enthalten keine Nullen, sondern die aktuellen Werte von Bid, Ask und Last zum gewünschten Zeitpunkt

Wenn Sie also mit ALLEN Zecken arbeiten, müssen Sie sich darüber im Klaren sein, womit Sie es zu tun haben. Es ist möglich, dass auch Tick-Flags synthetisiert werden. Ich möchte, dass diese Fragen vollständig geklärt werden.

Mit dem Band sollte dieses Problem nicht auftreten, wenn CopyTicks korrekt funktioniert.

Ich denke, die Hilfe wird sehr ernsthaft ergänzt werden.

 
fxsaber:
Sie können die Überlastungen selbst hinzufügen.
Ich kann viel tun, Sie können viel tun, andere Programmierer können auch viel tun, aber hoffentlich kennen sich die Entwickler mit dem "Stuffing" besser aus und können schnelle Algorithmen erstellen, um die erforderlichen Ticks zu erhalten.
 

Getestete CopyTicks mit COPY_TICKS_TRADE-Flag

Kein Unterschied.

2016.10.03 15:50:48.507 Check_ticks (RTS-12.16,M1)      History ticks = 9
2016.10.03 15:50:48.507 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 9
2016.10.03 15:50:48.956 Check_ticks (RTS-12.16,M1)      History ticks = 11
2016.10.03 15:50:48.956 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 11
2016.10.03 15:50:49.184 Check_ticks (RTS-12.16,M1)      History ticks = 12
2016.10.03 15:50:49.184 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 12
2016.10.03 15:50:49.510 Check_ticks (RTS-12.16,M1)      History ticks = 14
2016.10.03 15:50:49.511 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 14
2016.10.03 15:50:51.568 Check_ticks (RTS-12.16,M1)      History ticks = 15
2016.10.03 15:50:51.568 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 15
2016.10.03 15:50:51.627 Check_ticks (RTS-12.16,M1)      History ticks = 16
2016.10.03 15:50:51.627 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 16
2016.10.03 15:50:53.143 Check_ticks (RTS-12.16,M1)      History ticks = 19
2016.10.03 15:50:53.143 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 19
2016.10.03 15:50:54.514 Check_ticks (RTS-12.16,M1)      History ticks = 27
2016.10.03 15:50:54.514 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 26
2016.10.03 15:50:54.542 Check_ticks (RTS-12.16,M1)      History ticks = 27
2016.10.03 15:50:54.542 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 27
2016.10.03 15:50:54.847 Check_ticks (RTS-12.16,M1)      History ticks = 30
2016.10.03 15:50:54.847 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 30
2016.10.03 15:50:57.052 Check_ticks (RTS-12.16,M1)      History ticks = 31
2016.10.03 15:50:57.052 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 31
2016.10.03 15:50:57.301 Check_ticks (RTS-12.16,M1)      History ticks = 32
2016.10.03 15:50:57.301 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 32
2016.10.03 15:51:00.498 Check_ticks (RTS-12.16,M1)      History ticks = 44
2016.10.03 15:51:00.498 Check_ticks (RTS-12.16,M1)      Dynamic ticks = 44
Dateien:
Check_ticks.mq5  41 kb
 
prostotrader:

Getestete CopyTicks mit COPY_TICKS_TRADE-Flag

Kein Unterschied.

 
fxsaber:

Ich habe den obigen Code genau protokolliert und die Gründe dafür herausgefunden. Wenn CopyTicks (from > 0) Ticks bis zum neuesten erhält, werden möglicherweise einige übersprungen.

Beispiel.

Angeforderte Zecken mit von = 2016.09.29 11:05:55.564. Erhielt drei Häkchen als Antwort

Einige Zeit später habe ich den Tickverlauf aus der Ferne angefordert und einen Tick erhalten, den CopyTicks zuvor übersehen hatte

So eine Wanze!

Es scheint ein Konflikt zwischen dem gleichzeitigen Schreiben und Lesen in der Tick-Datenbank zu bestehen.

1434 ist der gleiche Fehler für TRADE-Typen. Reproduzierbarer Expert Advisor
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

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

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE, const uint count = 100000 )
{
  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 = Ticks[Res - 1].time_msc;
    Count = 1;

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

      Count++;
    }
  }
  
  return(Res);
}

string GetTickFlag( uint tickflag )
{
  string flag = "";

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

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

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

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

template <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
  const int Amount = MathMin(ArraySize(Array1), ArraySize(Array2));
  bool Res = (Amount > 0);

  if (Res)
    for (int i = 0; i < Amount; i++)
      if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
      {
        Print(TOSTRING2(i) + TOSTRING2(ArraySize(Array1)) + TOSTRING2(ArraySize(Array2)));
        Print(TOSTRING2(TickToString(Array1[i])) + "\n" + TOSTRING2(TickToString(Array2[i])) + "\n");
        Print(TOSTRING2(TickToString(Array1[i - 1])) + "\n" + TOSTRING2(TickToString(Array2[i - 1])) + "\n");
        
        Res = false;
        
        ExpertRemove();

        break;
      }

  return(Res);
}

void OnTick( void )
{
  static bool FirstRun = true;
  static MqlTick PrevTicks[];
  
  if (FirstRun)
  {
    LastTime = TimeCurrent() * 1000;
    Count = 0;
    
    FirstRun = false;
  }
  
  MqlTick Ticks[];

  // Взяли свеженькие тики
  const int Amount = GetFreshTicks(Ticks);

  ArrayCopy(PrevTicks, Ticks, ArraySize(PrevTicks));
  
  if (ArraySize(PrevTicks) > 0)    
  {
    MqlTick NewTicks[];
    
    // Взяли историю тиков
    Print(CopyTicks(_Symbol, NewTicks, COPY_TICKS_TRADE, PrevTicks[0].time_msc, 1000000));
    
    // Проверка на совпадение собираемой истории с самой историей
    Print(ArrayEqual(NewTicks, PrevTicks) ? "Equal" : "Not Equal");
  }  
}
Ergebnis
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   Not Equal
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   ExpertRemove() function called
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array2[i-1]) =  time = 2016.10.04 10:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array1[i-1]) =  time = 2016.10.04 10:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array2[i]) =  time = 2016.10.04 10:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   TickToString(Array1[i]) =  time = 2016.10.04 10:37:08.773 bid = 99690.0 ask = 99700.0 last = 99690.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   i = 144 ArraySize(Array1) = 145 ArraySize(Array2) = 146 
2016.10.04 10:36:17.743 Test13 (RTS-12.16,M1)   145
2016.10.04 10:36:16.768 Test13 (RTS-12.16,M1)   Equal

Die gesammelte Echtzeit-Tick-Historie des TRADE-Threads enthielt keinen Tick mit der Zeit 2016.10.04 10:37:08.773, der später in der Historie erschien.

Dies steht in gewisser Weise im Widerspruch zu dem, was ich oben gesagt habe. Probleme gibt es nicht nur mit dem synthetischen ALL-flow, sondern auch mit dem direkten - TRADE.

 
fxsaber:
1434 ist der gleiche Fehler für TRADE-Typen. Vervielfältigender Berater
Ich bitte um Entschuldigung, das ist mein grobes Versehen.
 
fxsaber:

1434 - 1 ms dauert es im Durchschnitt, bis CopyTicks bereits 1000 Ticks hochgeladen hat. Langsam, wie es scheint.

Anforderung von TRADE0tic mit from_msc des letzten zuvor empfangenen Ticks. Ich erhalte 3 Ticks, aber in 0,3 - 0,9 ms! - Jetzt sehr langsam.

Relevant! Kann man das nicht beschleunigen?

 

An dieser Stelle möchte ich den Entwicklern für ihre Arbeit mit CopyTicks danken!

Ich kann nicht behaupten, dass CopyTicks absolut korrekt funktioniert, aber ich habe es geschafft, mit dem Band perfekt zu arbeiten und CopyTicks besser zu verstehen.

Um das Rad nicht neu zu erfinden, finden Sie hier und hier fein abgestimmte Beispiele für die Erstellung von Tick-Indikatoren auf der Grundlage des Bandes.

 
Was ist der optimale (schnellste) Algorithmus, um Ticks von_time bis_time zu erhalten?
Grund der Beschwerde: