Tiki in Echtzeit - Seite 3

 
Aleksey Mavrin:

Ich habe ehrlich gesagt nicht verstanden, was ich in diesem Link über ECN lesen sollte, insbesondere etwas, das vorher nicht bekannt war)

Ich habe? Sie waren es, der etwas wollte. )))

Sie verstehen den Unterschied zwischen dem Devisenmarkt und der Börse nicht, deshalb habe ich Ihnen den Link gegeben.

Bitte verschmutzen Sie den Devisenbereich nicht mit Devisen.

 
Sergey Chalyshev:

Wollte ich das? Sie waren derjenige, der etwas wollte. )))

Sie verstehen den Unterschied zwischen Forex und Exchange nicht, deshalb habe ich Ihnen den Link gegeben.

Bitte verschmutzen Sie den Devisenbereich nicht mit Devisen.

Ja, ich würde mir wirklich wünschen, dass die Menschen in der Lage sind, sich klar zu verständigen, aber das ist unerreichbar, also müssen wir uns mit dem begnügen, was wir haben.

Und Sie verstehen vielleicht auch etwas nicht, haben Sie daran gedacht? Zum Beispiel, warum Sie den Link gepostet haben)

Und noch etwas: Ich bin nicht derjenige, der Forex als erstes erwähnt hat, ich greife in eine Diskussion ein, die bereits begonnen hat. Zuallererst.

B 2 - Hat jemand eine Diskussion im Börsenteil verboten, um verschiedene Märkte mit dem Aktienmarkt zu vergleichen?

Und 3 - Hören wir auf mit der Interpunktion ala Skifahrer gegen Snowboarder, oder sind Sie dagegen?

 

Eine kleine Zusammenfassung mit Experimenten zur Tic-Analyse.

1. der OnTick-Handler überspringt eine erhebliche Anzahl von Ticks.
Wenn Sie also einen Streifen von Geschäften durch einen eingehenden Tick analysieren wollen, macht das keinen Sinn.
Bei diesem Ansatz werden die Ergebnisse des Algorithmus im Testgerät und die realen Handelsergebnisse unterschiedlich ausfallen.

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.

2. Die Anzahl der Ereignisse beim OnBookEvent ist viel größer als die Anzahl der historischen Ticks, was verständlich ist, da dieses Ereignis zusätzlich zu den Ticks auch die Änderung der Ticks verarbeitet.
Es könnte also sein, dass alle eingehenden Ticks mit diesem Ereignis analysiert werden können.
Dies ist jedoch nicht der Fall, denn nicht alle Geschäfte werden über die Ticks abgewickelt.
Marktaufträge werden zwar nicht über den Schieberegler abgewickelt, aber sie werden im Handels-Feed angezeigt.
Der Grund dafür ist, dass der Market Slider in Wirklichkeit ein Auftragsbuch ist, das auf die Ausführung wartet, wenn die erforderlichen Bedingungen erfüllt sind.

Beispiel - Ein Handel hat den OnEventBook-Handler nicht durchlaufen (was bis zu 5 Ticks ausmacht).

MT5

Auch hier ist die Lösung, wie bei der ersten Variante, die Analyse der historischen Ticks.
Der Nachteil dieser Lösung ist die Unmöglichkeit der Prüfung im Prüfgerät. Änderungsereignisse des Tickers im Tester werden nicht erzeugt.

3. Die undokumentierten 8 Bits im Tick-Flag wurden nie beantwortet. Ich habe die gleiche Frage in einem anderen Forum gestellt.

Ich habe mich bereits für den Weg der Analyse des Handels entschieden - durch die Geschichte, wenn auch mit reduzierter Produktivität.
Auf diese Weise erhalte ich zuverlässige Ergebnisse, wenn ich den Algorithmus im Prüfprogramm teste.

Ich danke Ihnen allen für Ihre Ideen und Diskussionen.

 
Vladimir Mikhailov:

Eine kleine Zusammenfassung mit Experimenten zur Tic-Analyse.

1. der OnTick-Handler überspringt eine erhebliche Anzahl von Ticks.
Wenn Sie also einen Streifen von Geschäften durch einen eingehenden Tick analysieren wollen, macht das keinen Sinn.
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.

2. Die Ereignisse von OnBookEvent sind signifikant.....
Das stimmt aber nicht, denn nicht alle Geschäfte werden über das Buch abgewickelt.

Beispiel - Ein Handel ist nicht durch den OnEventBook-Handler gegangen (und das sind immerhin 5 Ticks).

3. Die undokumentierten 8 Bits im Tick-Flag wurden nie beantwortet. Ich habe die gleiche Frage in einem anderen Forum gestellt.


2. Bitte posten Sie Ihren Code für den Tick Builder (ich bin sicher, Sie machen etwas falsch).

3. Im Drucker die Funktion EnumToString(flags) ausführen

 
prostotrader:

2. Posten Sie Ihren Tick-Builder-Code (ich bin sicher, Sie machen etwas falsch)

3. In Drucker tun EnumToString(flags)

Der Code ist der übliche, minimale Code. Das OnBookEvent holt sich den letzten bekannten Tick und druckt ihn aus.

//+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
MqlTick tick[1];
int counter=0;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MarketBookAdd(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string&  symbol)
  {
   CopyTicks(_Symbol,tick,COPY_TICKS_ALL,0,1);
   counter++;
   if((tick[0].flags&TICK_FLAG_BID)==TICK_FLAG_BID || (tick[0].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      {
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, DoubleToString(tick[0].ask,_Digits), DoubleToString(tick[0].bid,_Digits));
      }
   else if((tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY || (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      {
       type=(tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY? "Buy": (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL? "Sell": "";
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, tick[0].volume_real, type, DoubleToString(tick[0].last,_Digits));
      }  
  }
//+------------------------------------------------------------------+

Zum dritten Punkt: Tick-Flags sind keine Aufzählung, so dass die Funktion EnumToString nicht auf sie anwendbar ist.

 
Vladimir Mikhailov:

Der Code ist einfach und minimal. Das OnBookEvent-Ereignis ermittelt den letzten bekannten Tick und gibt ihn aus.

Zum dritten Punkt: Tick-Flags sind keine Aufzählung, so dass die Funktion EnumToString nicht auf sie anwendbar ist.

Sie kopieren 1 Häkchen und wollen keine Auslassungen haben :)

OnBookEvent() wird durch jede Änderung des Ticks ausgelöst, aber zu einem bestimmten Zeitpunkt

kann es mehrere Zecken geben. Das Terminal erhält nicht einen Tick, sondern ein PAKET von Ticks.

Der von mir empfohlene Indikator (Tape of all deals) hat eine Beschreibung

auf Russisch. Seien Sie nicht faul, lesen Sie es.

 
prostotrader:

Sie kopieren 1 Häkchen und wollen keine Übersprünge:)

OnBookEvent() wird durch jede Änderung am Glas ausgelöst, aber zu einem bestimmten Zeitpunkt

kann es mehrere Häkchen geben. Das Terminal erhält nicht einen Tick, sondern ein PAKET von Ticks.

Der von mir empfohlene Indikator (Tape of all deals) hat eine Beschreibung

auf Russisch. Seien Sie nicht zu faul, ihn zu lesen.

Die Beobachtung von mehr als einem Ticken ist eine Umkehrung der Geschichte.

 
Vladimir Mikhailov:

Mehr als einen Tick zu sehen, ist ein Appell an die Geschichte.

Sie verstehen überhaupt nicht, wie das Terminal funktioniert.

Lesen Sie die Kommentare im Indikator!!!

//+------------------------------------------------------------------+
//|                                                   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;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
    }  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
       int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
       if(result > 0)
       {
         for(int i= 0; i<result; 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);
         }
         last_time = ticks[0].time_msc + 1;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.121 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.194 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:50.903 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.235 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.399 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:05.174 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST
2020.01.29 10:52:28.027 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST

Hinzugefügt

Im obigen Beispiel werden nicht alle Zecken "gefangen", da das neu eingetroffene Zeckenpaket

kann Zecken mit einem früheren Zeitpunkt enthalten.

Studieren Sie den Code "Ribbon of all trades" sorgfältig (er ist kommentiert).

 

Wenn es Ihnen schwerfällt (oder Sie zu faul sind), den Code des Indikators zu verstehen, dann

siehe den einfacheren Code eines echten Echtzeit-Sammlers aller Ticks

//+------------------------------------------------------------------+
//|                                                   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());
   
  }
//+------------------------------------------------------------------+
//| 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)
       {
         for(int i= 0; i<result; 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);
         }
         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:");
          for(int i= 0; i<result; 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);
          }
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader:

siehe einfacheren Code für einen echten Echtzeit-Sammler für alle Ticks

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

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