Тиковая история - страница 16

 
Karputov Vladimir:

Вот то, что просили:

Переход через сутки корректный.
Метод проверки: при включённом терминале стёр файлы тиковой истории. Затем запустил скрипт два раза (так как истории не было, то первый запуск скрипта инициализировал загрузку истории).

Да, спасибо, так же сделал - помогло. Однако, очень странное поведение. 
 

Правда странное поведение на этом не заканчивается. Решил сравнить два момента запроса одной и той же истории.

Первый момент был вчера, когда я писал об ошибке прихода с пятницы на понедельник:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Тиковая история

Tapochun, 2015.10.19 08:48

Немного погодя - картина такая. Режим ALL 3000 тиков:

2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2774 2015.10.16 23:59:05: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54356
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2775 2015.10.16 23:59:05: spread = 72, ask = 1.54428, bid = 1.54356, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2776 2015.10.16 23:59:06: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54356
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2777 2015.10.16 23:59:06: spread = 75, ask = 1.54431, bid = 1.54356, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2778 2015.10.16 23:59:07: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54357
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2779 2015.10.16 23:59:07: spread = 74, ask = 1.54431, bid = 1.54357, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2780 2015.10.16 23:59:10: spread = 0, ask = 0.00000, bid = 0.00000, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2781 2015.10.19 09:44:41: spread = 18, ask = 1.54498, bid = 1.54480, last = 1.54480
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2782 2015.10.19 09:44:41: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2783 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 1.54480
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2784 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2785 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 1.54480
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2786 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
2015.10.19 11:46:33.144 test_CopyTicks_1178 (GBPUSD,M5) OnStart: #2787 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 1.54480

 Дыра в истории. В режиме INFO - аналогично.

Обратите внимание на тики, пришедшие в 9.44.41 и далее. Теперь история по тому же символу, в за же время, в том же режиме (ALL) только запрошенная уже сегодня:

QK      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289463 2015.10.19 09:44:41: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
LN      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289464 2015.10.19 09:44:41: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
DO      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289465 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
ES      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289466 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 0.00000
HR      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289467 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
EG      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289468 2015.10.19 09:44:42: spread = 19, ask = 1.54499, bid = 1.54480, last = 0.00000
DI      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289469 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480
DH      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289470 2015.10.19 09:44:42: spread = 18, ask = 1.54498, bid = 1.54480, last = 0.00000
IM      0       13:04:51.698    test_CopyTicks_1178 (GBPUSD,M5) OnStart: #289471 2015.10.19 09:44:42: spread = 0, ask = 0.00000, bid = 0.00000, last = 1.54480

Метод доставки отличается. И, определенно, миллисекунд не хватает.

И как в такой ситуации анализировать тики?! 

 

 
Renat Fatkhullin:

Все верно.

Я же точно указал - нет никакой структуры или логики в заполнении тиков. Каждое ценовое поле независимо от других. Что придет от поставщика, то и транслируется.

Ренат, получается от поставщика одни и те же тики с зависимости от времени запроса еще и по разному могут приходить!?

Зависит ли формат истории от сервера, к которому подключен? 

 
Tapochun:

Это будет, по обещаниям, в следующем билде и, я уверен, там будут свои фишки. 

Хорошо было бы если без "фишек", и нормально.. а то устал от таких графиков с надписью 99% кач-во моделирования... а на реале даже близко не пахнет :) Как по мне, такого в принципе быть не должно, иначе это не тестер а игрушка. А на стратегиях по закрытию баров много каши не наваришь..

 

 
Maxim Dmitrievsky:

Хорошо было бы если без "фишек", и нормально.. а то устал от таких графиков с надписью 99% кач-во моделирования... а на реале даже близко не пахнет :) Как по мне, такого в принципе быть не должно, иначе это не тестер а игрушка. А на стратегиях по закрытию баров много каши не наваришь..

 

Без фишек, сразу редко бывает. Тиковой истории ждали долго и хочется ее скорее довести до ума. И в тестере, и на реале. К сожалению, обратной реакции не много. Надеюсь, работа по доведению до ума идет.

 
Karputov Vladimir:

Уточните пожалуйста по флагу получения тиков COPY_TICKS_INFO (только Bid и Ask) - Bid и Ask и дальше могут быть со значением "0" или при режиме  COPY_TICKS_INFO – Bid и Ask не будут содержать нулей и поток тиков будет аналогичен тому, что есть в терминале, в окне "Обзор рынка", вкладка "Тики"?


Решат в билде 1200:

MQL5: Расширен формат структуры MqlTick. Теперь в ней передается время прихода тика в миллисекундах, а также флаги, позволяющие определить, какой именно параметр тика изменился.
struct MqlTick
  {
   datetime     time;          // Время последнего обновления цен
   double       bid;           // Текущая цена Bid
   double       ask;           // Текущая цена Ask
   double       last;          // Текущая цена последней сделки (Last)
   ulong        volume;        // Объем для текущей цены Last
   long         time_msc;      // Время последнего обновления цен в миллисекундах
   uint         flags;         // Флаги тиков
  };
У каждого тика всегда заполняются все параметры, независимо от того, изменились ли данные по сравнению с предыдущим тиком. Это позволяет всегда иметь актуальное состояние цен на любой момент времени без поиска предыдущих значений по тиковой истории. Например, с тиком могла измениться только цена бид, но в структуре помимо новой цены будут указаны и остальные параметры: предыдущая цена аск, объем и т.д. Чтобы узнать, какие именно данные изменились с текущим тиком, анализируйте его флаги:

  • TICK_FLAG_BID - тик изменил цену бид
  • TICK_FLAG_ASK  - тик изменил цену аск
  • TICK_FLAG_LAST - тик изменил цену последней сделки
  • TICK_FLAG_VOLUME - тик изменил объем
  • TICK_FLAG_BUY - тик возник в результате сделки на покупку
  • TICK_FLAG_SELL - тик возник в результате сделки на продажу

Структура MqlTick используется в двух методах:

  • CopyTicks - метод не поддерживает старый формат структуры. Скомпилированные ранее файлы EX5, использующие старый формат тика, при вызове функции CopyTicks будут возвращать ошибку 4006 (ERR_MQL_INVALID_ARRAY).
  • SymbolInfoTick - метод поддерживает и старый, и новый формат структуры.
 

Итак:

MetaTrader 5 x64 build 1192 started (MetaQuotes Software Corp.)
...
authorized on MetaQuotes-Demo through Access Point Asia (ping: 556.27 ms)

и обновлённая структура MqlTick:

Обновлённая структура MqlTick

 
Karputov Vladimir:

Итак:

и обновлённая структура MqlTick:


А как правильно в терминале отслеживать приход нового тика? Например, в тестере. 

"Функция OnTick() не является обработчиком каждого тика, она уведомляет эксперта об изменениях на рынке. Изменения могут быть пакетными: в терминал может одновременно прийти несколько тиков, но функция OnTick() будет вызвана лишь один раз для уведомления эксперта о последнем состоянии рынка." 

 
Maxim Dmitrievsky:

А как правильно в терминале отслеживать приход нового тика? Например, в тестере. 

"Функция OnTick() не является обработчиком каждого тика, она уведомляет эксперта об изменениях на рынке. Изменения могут быть пакетными: в терминал может одновременно прийти несколько тиков, но функция OnTick() будет вызвана лишь один раз для уведомления эксперта о последнем состоянии рынка." 

Если нужно отслеживать каждый тик, то тогда это нужно делать в индикаторе. Индикатор, в отличии от советника, обрабатывает каждый тик.

Добавлено: теперь можно и в советнике анализировать все тики - только нужно вводить проверки (например анализировать запрос CopyTicks глубиной 5 тиков). 

 

Build 1192. Windows 10 x32.

Предварительно полностью удалил папку тиковой истории сервера MetaQuotes-Demo. Индикатором

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input int   InpShowTicks=500;    // клубина истории тиков
//--- parameters
MqlTick     arr_mql_tick[];      // массив структур хранящий тики
bool        bingo=false;         // false - скачано тиков меньше запрошенного
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   ResetLastError();
//--- новый размер массива структур тиков
   if(ArrayResize(arr_mql_tick,InpShowTicks)==-1)
     {
      Print("Error OnInit #1",GetLastError());
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int count;
   string text="";
   if(bingo)
      return(rates_total);
   int copied=CopyTicks(_Symbol,arr_mql_tick,COPY_TICKS_INFO,0,InpShowTicks);
   if(copied==InpShowTicks)
      bingo=true;
   text="Запрошено "+IntegerToString(InpShowTicks)+" тиков, скачано "+IntegerToString(copied);
   Comment(text);
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+

проверяю закачку тиков. На некоторых инструментах требуемые 500 тиков закачиваются буквально на первом или втором тике и при этом скачивается не более 200 Кб (инструменты просто перетаскиваю из  "Обзора рынка" на график).

А вот на некоторых начинаются чудеса: история тиков не желает отдавать мне требуемые 500 тиков, но при этом терминал закачивает около 20 Мб истории (история за 10 и 9 месяцы).

Файлы:
test.mq5  3 kb
Причина обращения: