Стоимость тика RTS и RTSM

 

Всем здравствуйте!

Прошу оказать помощь в понимании, каким образом происходит определение "цены тика" по инструментам RTS и RTSM срочного рынка.

Задача - определять эту цену "на лету" - код напишу и выложу здесь, подскажите только как считать.

Свои изыскания опишу ниже, но я так и не смог получить то же значение, что и в спецификации символа (и соответственно на сайте биржи).


Для примера возьму символ RTSM, дата 29 апреля, время ~21:30. Сначала теория: 

Т.е. ответ на вопрос - 0.1$. Теперь смотрим само значение в спецификации:

Таким образом - расчетное значение на данный момент - 71.3838 руб./$. Это же значение указано на сайте биржи.

Откуда оно взялось и когда оно стало таким? Биржа дает "четкий" ответ - в соответствии с методикой и приказом.

Теперь сама методика - именно с ней возникли сложности. Не буду вставлять сюда все эти "простыни". Только суть:



Теперь для людей :)

Надо взять цены сделок для USDRUB_TOM за промежуток 18:43 - 18:44 c интервалом 1 с. и посчитать по ним среднее с учетом формулы 3.5. И вот тут я выдохся, я не понимаю, что имеется ввиду в строчках, помеченных галочкой. Но К я рассчитал - и оно сильно меньше чем в таблице почти везде. 

Итоги расчета прикрепил - там простенький эксель. Данные выгружал по сделкам из Открытия.

Помогите разгадать загадку цены тика :)

Файлы:
t2movn.zip  15 kb
 

Разобрался.

Квадратная одинарная скобка - чтобы совокупность выполнялась, достаточно, чтобы выполнялось любое из уравнений.

Первая синяя стрелка - для любого i в интервале... удовлетворяется условие

Вторая синяя стрелка - существует i в интервале... для которого удовлетворяется условие.

Эксель поправил - теперь бьёт.

Остальное понятно - код потом выложу... Но там не тривиальный расчет... Проверять надо будет

 

Я не изголяюсь и беру для расчетов USDFIX-INDEX


 
prostotrader #:
Я не изголяюсь и беру для расчетов USDFIX-INDEX

Я посмотрел, что он не бьёт слегка, думаю - дай разберусь - там же ничего сложного :)

В какой-то момент стало уже интересно - я "не внимательный" или они чего-то не договаривают.

Выяснилось, что первое.

Учитывая, что методику меняют регулярно, надо будет ещё в код и проверку зашивать - если текущая цена тика не бьёт с расчетной - расчет не проводить. 

 
Andrey Miguzov #:

Я посмотрел, что он не бьёт слегка, думаю - дай разберусь - там же ничего сложного :)

В какой-то момент стало уже интересно - я "не внимательный" или они чего-то не договаривают.

Выяснилось, что первое.

Учитывая, что методику меняют регулярно, надо будет ещё в код и проверку зашивать - если текущая цена тика не бьёт с расчетной - расчет не проводить. 

"Не бьет слегка", это не важно, важно что он применяется для 2-х ног. :)

И 1 строчка кода 

usd_fix = SymbolInfoDouble(Symbol(), SYMBOL_LAST);
 

В общем, сделал расчет в МТ5, начал проверять - не бьёт с числами биржи. Причем очень интересно - иногда бьет, иногда не бьёт....

Проверил каждое число в отладчике, выгрузил в эксель данные и проверил там. Расчет в программе МТ5 и эксель сошелся, но с данными биржи всё-равно не бьет.

Потом думаю, у меня же есть возможность проверить у другого брокера... :)

И тут я слегка офигел. 2 скриншота от разных брокеров (время выгрузки и символ - одинаковые):

Собственно цены и объемы совпадают, но не совпадает ВРЕМЯ (верхний скрин - Финам, нижний - Открытие). Т.к. время передается с биржи вместе с ценами, я не очень понимаю - Как такое возможно???

Т.к. расчет курса (первый пост) идет с шагом в 1 с и усредняется на интервале 60 с - такое различие во времени иногда даёт небольшую погрешность и получить данные, точно совпадающие с данными биржи невозможно.

Кстати, ни один из расчетов по обоим брокерам для выбранного участка времени не совпал точно с данными биржи - т.е. там время другое :)

Вывод - передаваемое в МТ5 время тиков, это не время биржи, а какая-то импровизация сервера МТ5... И это очень плохо...

Был бы очень рад, если бы меня кто-нибудь разубедил...

 
Andrey Miguzov #:

Кстати, ни один из расчетов по обоим брокерам для выбранного участка времени не совпал точно с данными биржи - т.е. там время другое :)

Вывод - передаваемое в МТ5 время тиков, это не время биржи, а какая-то импровизация сервера МТ5... И это очень плохо...

А разница с временем биржи постоянна? Или гуляет в каких-то пределах?

Кстати, ещё вопрос, насклько время серверов брокера синхронизировано с временем серверов биржи и между собой.

 
JRandomTrader #:

А разница с временем биржи постоянна? Или гуляет в каких-то пределах?

гуляет

JRandomTrader #:

Кстати, ещё вопрос, насклько время серверов брокера синхронизировано с временем серверов биржи и между собой.

В данный момент делаю проверку, логика такая:

1) На сайте биржи есть пример доступных для скачивания за денежку (минимум 1500 р) данных  Все сделки и лучшие заявки - Тип  B - за дату 2018.12.29

2) В данный момент проверил ~10 сделок по SBER в Открытии - время и объем примера бьют с точностью до мс.

Т.е. время и объем по сделкам в истории у Открытия (акции) совпадают с биржевыми данными - время синхронизировано.

Сейчас проверю валюту и фьючерсы.

Потом будет очередь Финама...

Добавлено:

В Открытии акции и валюта с данными биржи по времени и объему совпадают (за дату 2018.12.29). Проверяю дальше.... Срочный по времени совпадает не везде. 

Я сдаюсь - уехал жарить шашлыки :) Потом теперь...

 
JRandomTrader #:

А разница с временем биржи постоянна? Или гуляет в каких-то пределах?

Кстати, ещё вопрос, насклько время серверов брокера синхронизировано с временем серверов биржи и между собой.

Сверку времени сделок по данным биржи и времени сделок в МТ5 пока приостановил ввиду отсутствия смысла сверять историю по 2018 году + у Финама такой глубокой истории нет. Различались они в 18 году или нет - уже нет никакой разницы. К тому же, файл для анализа является "бесплатным примером" и по нему предъявлять не получится. Пришёл к выводу, что нужно будет заказать у биржи полный лог по нескольким символам и сделать сверку по факту. После этого - или разбираться с брокером/МТ5 или успокоится.

Самое главное, что для себя понял по итогам всех сверок:

1) Время сделок (время тиков, которые можно забрать из COPY_TICKS_TRADE)  в каких-то случаях идет в МТ5 с биржи вместе с ценами и объемами, в каких-то случаях "своё". Это зависит от брокера, от секции (срочная/валютная/фондовая) и ещё каких-то не понятных для меня причин. 

2) Время сделок в истории разных брокеров отличается. Учитывая, что эти сделки совершены на одной бирже - это не правильно, такого быть не должно, но чтобы разговаривать - нужны платные исходники. Этот пункт нужно обязательно учитывать при тестировании в МТ5, особенно арбитражных стратегий.

Скорее всего вернусь к изысканиям данной темы позже, но не факт. 

 

Собственно вопрос, поднятый в данной теме решен - код прикладываю.

Результаты отличаются от данных биржи, но не сильно. Отличия связаны с тем, что время сделок в истории терминала и время сделок по которым считает биржа отличаются. Возможно есть ещё какие-то ошибки, но я их не нашёл. 

Сам модуль расчета сделан в виде класса, после класса простенький эксперт для вывода значений на экран. В тестере работает, нужна только тиковая история. Заточен под Открытие.

Ну и результаты для сравнения. Слева эксперт, справа биржа:


Файлы:
 
Andrey Miguzov #:

Собственно вопрос, поднятый в данной теме решен - код прикладываю.

Результаты отличаются от данных биржи, но не сильно. Отличия связаны с тем, что время сделок в истории терминала и время сделок по которым считает биржа отличаются. Возможно есть ещё какие-то ошибки, но я их не нашёл. 

Сам модуль расчета сделан в виде класса, после класса простенький эксперт для вывода значений на экран. В тестере работает, нужна только тиковая история. Заточен под Открытие.

Ну и результаты для сравнения. Слева эксперт, справа биржа:


Посмотрел Ваш код и нашел его очень "тяжелым", главная ошибка, это то, что при каждом тике Вы считаете курс, тогда как нам его нужно взять всего 

3 раза.

1. При инициализации

2. в 13-45

3. в 18-44

Не навязываю, но посмотрите (код шаблон)

//+------------------------------------------------------------------+
//|                                                     MOEX_USD.mq5 |
//|                                      Copyright 2022 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
struct USD_DATA
{
  string            symbol_name;      //имя символа для анализа
  int               symbol_handle;    //массив с хенделами индикатора-шпиона (для тестера)
  long              symbol_digits;    //точность цены в знаках после запятой
  int               count_tick;       //Количество тиков

  MqlTick           m_tick[];         //массив исходных тиков
  double            m_K[];            //массив коэффициента K для каждой секунды индекса
  double            m_RA[];           //массив исходных цен (шаг 1 с)
  double            m_R[];            //массив цен после устранения отклонений (шаг 1 с)
  double            m_MA[];           //массив цен курса (шаг 1 с)
  bool              is_get_rate;
  double            usd_value; 
  ulong             day_time;
  ulong             evn_time;
} usd_data;
//---
input string ASymbol = "USDRUB_TOM"; //Спот доллара с расчетом на завтра
input string DayTime = "13:45:00";   //Время дневного расчета курса
input string EvnTime = "18:44:00";   //Время вечернего расчета курса
//+------------------------------------------------------------------+
//| Expert Get string time function                                  |
//+------------------------------------------------------------------+
ulong GetStringTime(const string a_string)
{
  int str_size = StringLen(a_string);
  if(str_size == 8)
  {
    int k = StringFind(a_string, ":", 2);
    if(k == 2)
    {
      string s_hour = StringSubstr(a_string, 0, k);
      k = StringFind(a_string, ":", 5);
      if(k == 5)
      {
        string s_min = StringSubstr(a_string, 3, k-3);
        string s_sec = StringSubstr(a_string, 6, str_size - k - 1);
        ulong t_sec = ulong(StringToInteger(s_sec));
        ulong t_min = ulong(StringToInteger(s_min)) * 60;
        ulong t_hour = ulong(StringToInteger(s_hour)) * 3600;
        return(t_hour + t_min + t_sec);
      }
    }
  }
  return(0);
}
//+------------------------------------------------------------------+
//| Expert Get rate function                                         |
//+------------------------------------------------------------------+
bool GetRate(double &a_value, const bool first_time = false)
{
  if(first_time == true)
  {
    // Первый расчет курса доллара
  }
  else
  {
    // Последующие расчеты курса доллара
  }
  // Расчет курса доллара
  return(false);
}
//+------------------------------------------------------------------+
//| Expert Check time function                                       |
//+------------------------------------------------------------------+
bool CheckTime()
{
  //Проверка времени для расчета курса доллара, 
  //если время пришло, сбрасываем флаг (usd_data.is_get_rate = false)
  return(false);
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  ZeroMemory(usd_data);
  usd_data.usd_value = 0.0;
  usd_data.is_get_rate = false;
  usd_data.symbol_name = ASymbol;
  if(SymbolSelect(usd_data.symbol_name, true) == false)
  {
    Alert("Не найден символ ", usd_data.symbol_name);
    return(INIT_FAILED);
  }
  usd_data.day_time = GetStringTime(DayTime);
  usd_data.evn_time = GetStringTime(EvnTime);
  usd_data.is_get_rate = GetRate(usd_data.usd_value, true);
  
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  //---   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
  if(usd_data.usd_value == 0.0)
  {
    usd_data.usd_value = GetRate(usd_data.usd_value, true);
  }
  else
  {
    if(CheckTime() == true)
      if(usd_data.is_get_rate == false)
        usd_data.is_get_rate = GetRate(usd_data.usd_value);
  }         
}
//+------------------------------------------------------------------+