Tiki in Echtzeit - Seite 4

 
Vladimir Mikhailov:

Eine kleine Zusammenfassung der Experimente mit Zeckenanalyse.

1. der OnTick-Handler überspringt eine erhebliche Anzahl von Ticks.
Daher macht es keinen Sinn, den Streifen von Geschäften über den eingehenden Tick zu analysieren.
Bei diesem Ansatz werden die Ergebnisse des Algorithmus im Testgerät und die realen Handelsergebnisse unterschiedlich sein.

Alternativ können Sie den Streifen der Geschäfte für einen ausgewählten Zeitraum oder eine bestimmte Anzahl der letzten Geschäfte analysieren, indem Sie die historischen Ticks mit den Funktionen CopyTicks() oder CopyTicksRange() abrufen.
In diesem Fall sind die Ergebnisse des Tests des Algorithmus im Testgerät und die realen Handelsergebnisse identisch.
Die Nachteile sind eine geringere Leistung des Algorithmus.

Ja, der Expert Advisor kann Ticks verpassen. Es handelt sich also entweder um den Indikator oder um CopyTicks.

Und worauf ist die Leistungsverschlechterung zurückzuführen? Kopieren Sie nur das gewünschte Segment (das seit der letzten erfolgreichen Datenabfrage erschienen ist).

 
Andrey Khatimlianskii:

Warum sollten sie "in Echtzeit" erfasst werden, wenn ohnehin CopyTicks verwendet wird?

Sie können die Zecken jederzeit auf die richtige Tiefe kopieren.

Andrew, lesen Sie den Titel des Themas

Hinzugefügt

Sie können mit CopyTicks() nicht die richtige Tiefe erreichen, es sind nur 2000 Ticks!

 
prostotrader:

Andrei, lesen Sie den Titel des Themas

Was ist mit der Tatsache, dass die Aufgabe ursprünglich falsch gestellt ist?

Die Analyse von Ticks in Echtzeit ist möglich, aber es ist notwendig, Indikatoren oder CopyTicks zu verwenden, um Lücken zu vermeiden.


Prostotrader:

Mit CopyTicks() kann man nicht die erforderliche Tiefe erreichen, sondern nur 2000 Ticks!

Es gibt keine solche Einschränkung, siehe Beispiel aus der Dokumentation:

Пример вывода
Si-12.16: received 11048387  ticks in 4937 ms
Last tick time = 2016.09.26 18:32:59.775 
First tick time = 2015.06.18 09:45:01.000 
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 
Andrey Khatimlianskii:

Was ist mit der Tatsache, dass die Aufgabe ursprünglich falsch gestellt ist?

Die Analyse von Ticks in Echtzeit ist möglich, aber Sie müssen einen Indikator oder CopyTicks verwenden, um sicherzustellen, dass keine Auslassungen vorhanden sind.


Es gibt keine solche Einschränkung, siehe Beispiel aus der Dokumentation:

1. Nicht unbedingt ein Indikator!

Wenn Sie die Hilfe meinen, die besagt

In Expert Advisors und Skripten kann die Funktion CopyTicks() bis zu 45 Sekunden warten....

Wenn Sie bis zum Ende lesen, steht dort

Ausgabegeschwindigkeit: Das Terminal speichert für jedes Zeichen 4096 letzte Ticks im Cache für schnellen Zugriff (65536 Ticks für Zeichen mit laufendem Stack ), Abfragen auf diese Daten sind am schnellsten.

Das OnBookEvent()-Ereignis wird ausgelöst, wenn ein neues Paket von Ticks am Terminal eintrifft, daher

ist es möglich, Ticks aus dem Expert Advisor zu sammeln. Nehmen Sie ein Beispiel und prüfen Sie es.

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
void PrintResult(const int cnt)
{
  if(cnt > 0)
  {
    for(int i= 0; i<cnt; i++)
    {
      if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
      if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
      if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
      if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
      if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
      if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
      Print("Unknown flag is ", ticks[i].flags);
    }
  }
}  
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         PrintResult(result);
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          PrintResult(result);
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+


2. Es gibt eine solche Einschränkung, überprüfen Sie es selbst(CopyTicksRange() hat keine Einschränkung)


 
prostotrader:

1. Nicht unbedingt ein Indikator!

Das Ereignis OnBookEvent() wird ausgelöst, wenn ein neues Paket von Ticks im Terminal eintrifft.

ist es möglich, Ticks aus dem Expert Advisor zu sammeln. Nehmen Sie ein Beispiel und sehen Sie es sich an.

OnBookEvent garantiert nicht, dass die Häkchen nicht übersehen werden. Wenn dort umfangreiche Berechnungen durchgeführt werden, erfolgt der gleiche Sprung wie bei OnTick.

Dabei spielt es keine Rolle, woher man die erforderliche Anzahl von Ticks über CopyTicks kopiert.


Prostotrader:

2. Es gibt eine solche Einschränkung, überprüfen Sie es selbst

Sie existiert nur für die Parameter 0, 0, was in der Hilfe ausdrücklich erwähnt wird:

Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000.
 
Andrey Khatimlianskii:

OnBookEvent übernimmt keine Garantie dafür, dass die Häkchen nicht übersehen werden.

Ich wiederhole

OnBookEvent() bietet genau diese Garantie, dass ein neuer Stapel von Zecken eingetroffen ist!

Aus der Referenz:

Ausgabesatz: Das Terminal speichert für jedes Zeichen 4096 letzte Ticks im Schnellzugriffs-Cache (für Zeichenmit laufendem Stack 65536 Ticks), Abfragen auf diese Daten sindam schnellsten.

Ende des Zitats----

Wenn OnBookEvent nicht ausgelöst würde, könnte der gesamte Handel (Börse) im MT5 in den Papierkorb geworfen werden!

Ein neues Paket von Zecken ist eingetroffen - 100 % löste OnBookEvent aus, und CopyTicks() zeigt, wie viele Zecken eingetroffen sind,

Die Daten sind bereits im Cache gespeichert, und es ist der schnellste Zugriff!

Aus diesem Grund kann der Tick-Sammler in Echtzeit in Indikatoren und EA implementiert werden(wenn der Markt läuft).

Hinzugefügt von

Nehmen Sie den obigen Code und überprüfen Sie ihn, dann argumentieren Sie...

 

Der Code des Zeckensammlers ist korrekt, aber es gibt einige Implementierungsfehler.

und später veröffentlichen.

Hinzugefügt

Sammeln aller Ticks in Echtzeit vom Expert Advisor

Bitte verwenden Sie

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    last_time = ulong(ticks[0].time_msc);
    is_first = true;
  }
  else
  {
    is_first = false;
    Alert("No start time!");
    return(INIT_FAILED);
  }   
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
//void OnTick()
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    if(is_first == true)
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        Print("First packet of ticks:");
        t_cnt = 0;
        for(int i= 0; i<result; i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
          Print(GetTickDescription(ticks[i]));
        }
        is_first = false;
        last_time = ulong(ticks[0].time_msc);
      } 
    }
    else
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        if(result > t_cnt)
        {
          mem_cnt = t_cnt;
          t_cnt = 0;
          for(int i= 0; i<(result - int(mem_cnt)); i++)
          {
            if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
            Print(GetTickDescription(ticks[i]));
          } 
          if(last_time == ulong(ticks[0].time_msc))
          {
            t_cnt += int(mem_cnt);
          }
          else last_time = ulong(ticks[0].time_msc + 1);
        }
        else
        {
          t_cnt = 0;
          last_time++;
        }
      }
      else
      {
        t_cnt = 0;
        last_time++;
      }
    }
  }
}
//+------------------------------------------------------------------+
 

Um zu vergleichen, wie der Zeckensammler funktioniert, können Sie aus ihm ein Band mit allen Gewerben an einer Stelle erstellen

(indem Sie COPY_TICKS_ALL an zwei Stellen durch COPY_TICKS_TRADE ersetzen) und vergleichen Sie es mit dem Ribbon of Deals,

eingebettet in das Instrumentenglas.

Wenn das Instrument sehr liquide ist, können die Ausdrucke mit einer langen Verzögerung erfolgen

 
prostotrader:
 if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) {Print("Tick is ", "TICK_FLAG_ASK", " Tick time: ", ticks[i].time, ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) {Print("Tick is ", "TICK_FLAG_BID", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) {Print("Tick is ", "TICK_FLAG_BUY", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) {Print("Tick is ", "TICK_FLAG_LAST", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) {Print("Tick is ", "TICK_FLAG_SELL", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) {Print("Tick is ", "TICK_FLAG_VOLUME", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else

Können Zecken nicht mehr als eine Flagge gleichzeitig haben?

 
prostotrader:

Wiederholen Sie

OnBookEvent() ist genau die Art von Garantie dafür, dass ein neuer Stapel von Zeckeneingetroffen ist!


Aber bedeutet das, dass es eine Garantie dafür gibt, dass Sie ALLE OnBookEvent-Ereignisse behandeln werden?