Tiki in Echtzeit - Seite 11

 

Andrey Khatimlianskii,fxsaber

Gehen wir wie folgt vor

Finden Sie einen Fehler (falls es einen gibt) in meinem Code

//+------------------------------------------------------------------+
//|                                                   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;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
//+------------------------------------------------------------------+
//| 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 ( Mode != USE_BOOK || symbol != Symbol() ) return;
  //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(__FUNCTION__, ": ",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(__FUNCTION__, ": ",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++;
        Print(__FUNCTION__, ": Pending order!");
      }
    }
 // }
}

void OnTick()
{
   if ( Mode != USE_TICK ) return;
   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(__FUNCTION__, ": ", 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(__FUNCTION__, ": ", 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++;
        Print(__FUNCTION__, ": Pending order!");
      }
    }
  
}
//+------------------------------------------------------------------+
Andrey Khatimlianskii
Andrey Khatimlianskii
  • www.mql5.com
Добавил тему Быстрый TimeHour/TimeMinute? Попытался ускорить TimeHour/TimeMinute, ни фига не получилось: void OnStart() {         ulong s1 = GetMicrosecondCount();         for ( datetime t = D'1990.01.01'; t Добавил тему Больше агентов — меньше скорость! WTF!? Наткнулся на интересного советника, использующего кастумный индикатор, подключенный...
 
prostotrader:

Finden Sie einen Fehler (falls es einen gibt) in meinem Code

Ich werde mir dieses Blatt nicht einmal unkommentiert ansehen. Ich habe die Schlussfolgerung durch meinen eigenen Code gezogen. Ich halte es für unangemessen, einen Streit im Internet zu schlichten. Jeder bleibt in seiner eigenen Wohnung.

 
fxsaber:

Ich schaue mir das Blatt ohne Kommentare nicht einmal an. Ich habe die Schlussfolgerung durch meinen eigenen Code gezogen. Ich halte es nicht für klug, einen Streit im Internet zu führen. Jeder bleibt bei dem, was er/sie hat.

Das Ergebnis von Funktionen ist Ihnen also egal?

Ach ja, Sie sind ja kein Händler, sondern Schriftsteller, entschuldigen Sie, ich vergaß.

 
prostotrader:

Sie interessieren sich also nicht für die Ergebnisse der Funktionen?

Ja, ich weiß. Deshalb habe ich den Expert Advisor geschrieben und Schlussfolgerungen für mich selbst gezogen.

Ach ja, Sie sind ja kein Händler, sondern Schriftsteller, tut mir leid, ich vergaß.

Ja, ich bin kein Händler, sondern ein Schriftsteller.

 

Nun, es gibt nur noch einen Gegner (wenn es überhaupt noch einen gibt :) ) ...

Ich warte auf das Ergebnis...

 
prostotrader:

Nun, es gibt nur noch einen Gegner (wenn es überhaupt noch einen gibt :) ) ...

Ich warte auf das Ergebnis...

Die Gegner gehen nicht, weil sie im Unrecht sind, sondern weil Sie anmaßend sind.
 
Artyom Trishkin:
Die Gegner gehen nicht, weil sie im Unrecht sind, sondern weil sie anmaßend sind.

Artem(nichts für ungut)!

Die FOREX-Leute kommen zum Börsenthema, "stellen ihren Fuß auf" und steigen dann ohne Beweis aus!

Was hat Stolz damit zu tun, wenn ich mich irre - ich bin bereit, es zuzugeben!

Aber aus logischer Überlegung und eigener Erfahrung

OnBookEvent() ist schneller und verpasst keinen einzigen Tick, keine einzige Veränderung im Glas!

Finden Sie einen Fehler (falls es einen gibt) in meinem Code.

Aus den Protokollen meines Codes - alles ist sehr deutlich sichtbar!

2020.01.31 17:01:58.293 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:58.294 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.444 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.444 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.536 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.107 Ask=1585.5 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.326 Ask=1585.4 
2020.01.31 17:01:59.674 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.536 Bid=1585.4 
2020.01.31 17:01:59.861 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.107 Ask=1585.5 
2020.01.31 17:02:00.530 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.326 Ask=1585.4 
2020.01.31 17:02:01.189 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.216 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.7 Ask=1585.5 
2020.01.31 17:02:01.492 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!

Die gelbe Markierung ist die gleiche Zecke!

Hinzugefügt

Ist es für euch gelobte Programmierer wirklich so schwer, 15 Zeilen unkomplizierten Code zu verstehen?

Hinzugefügt

Vielleicht sind die Kommentare hilfreich?

//+------------------------------------------------------------------+
//|                                                   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[], l_tick;
ulong last_time, mem_cnt, tot_cnt;
bool is_first;
int t_cnt, result;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  tot_cnt = 0;
  if(Mode == USE_BOOK) 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);
  } 
  ArraySetAsSeries(ticks, true);  
  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.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     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(Mode == USE_BOOK)
  {
    Print("USE_BOOK ticks received: ", tot_cnt);
    if(is_book == true) MarketBookRelease(Symbol());
  }
  else
  {
    Print("USE_TICK ticks received: ", tot_cnt);
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if ( Mode != USE_BOOK || symbol != Symbol() ) return;
  tot_cnt++;
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      t_cnt = 0;
      for(int i= 0; i<result; i++)
      {
        if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
        Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
      }
      l_tick = ticks[0];
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
      l_tick = ticks[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(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
        } 
        if(last_time == ulong(ticks[0].time_msc))
        {
          t_cnt += int(mem_cnt);
        }
        else last_time = ulong(ticks[0].time_msc);
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
  if ( Mode != USE_TICK ) return;
  tot_cnt++;
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      t_cnt = 0;
      for(int i= 0; i<result; i++)
      {
        if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
        Print(__FUNCTION__, ": ",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(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
        } 
        if(last_time == ulong(ticks[0].time_msc))
        {
          t_cnt += int(mem_cnt);
        }
        else last_time = ulong(ticks[0].time_msc);
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 
prostotrader:

Artem(nichts für ungut)!

Die FOREX-Leute kommen zum Börsenthema, "stellen ihren Fuß auf" und steigen dann ohne Beweis aus!

Was hat Stolz damit zu tun, wenn ich mich irre - ich bin bereit, es zuzugeben!

Aber aus logischer Überlegung und eigener Erfahrung

OnBookEvent() ist schneller und verpasst keinen einzigen Tick, keine einzige Veränderung im Glas!

Finden Sie einen Fehler (falls es einen gibt) in meinem Code.

Aus meinen Codeprotokollen kann man alles sehr gut erkennen!

Hinzugefügt

Ist es für euch gelobte Programmierer wirklich so schwer, 15 Zeilen unkomplizierten Code zu verstehen?

Hinzugefügt

Vielleicht sind die Kommentare hilfreich?

Ich bin nicht interessiert. Ich kann sehen, dass es keinen Unterschied gibt. Aber Andrei hat versprochen, Ihnen zu zeigen, wie Sie es besser machen können. Aber er hat eine Bedingung gestellt, um Ihnen zu zeigen, dass es für Sie unmöglich ist, sie zu erfüllen.
 
Artyom Trishkin:
Das ist mir egal. Ich sehe, dass es keinen Unterschied gibt. Aber Andrey hat versprochen, Ihnen den besten Weg zu zeigen. Allerdings hat er eine unmögliche Bedingung gestellt, die er Ihnen zeigen will.

Ja.

Aber ich werde nur eine kleine Bemerkung machen.

Die Tatsache, dass OnTick() keine schwebenden Aufträge behandelt

2020.01.31 17:02:01.492 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!

ist ein guter Grund, diese Funktion für den Aktienhandel in den Papierkorb zu werfen.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 

Ich möchte Sie daran erinnern, dass OnTick zwei unabhängige Threads, Information und Handel,COPY_TICKS_INFO und COPY_TICKS_ALL erhält und einer Vorverarbeitung unterzogen wird .

Diese Threads sind nicht miteinander synchronisiert, wenn Sie also OnBookEvent mit OnTick vergleichen, sollten SieTICKS_INFO nehmen.

Per Definition sollte OnBookEvent schneller sein, da es keine Vorverarbeitung durchläuft.

Mit den Tests lässt sich nicht zuverlässig feststellen, wer schneller ist, denn im Gegensatz zu Zecken kennen wir die Lagerzeit einer Zecke nicht.

Obwohl wir die Entwickler schon oft gebeten haben, STOCK TIME hinzuzufügen! ! !


p.s. Neben der Geschwindigkeit hat tumblr auch Vorteile gegenüber OnTick,

Wie bereits erwähnt, ist es nicht möglich, bessere Geld- und Briefkurse in OnTick zu erhalten,

undOnTick keine Daten von anderen Symbolen erhält, ist es für Expert Advisors, die mehrere Symbole analysieren, nutzlos.