Разобрался.
Квадратная одинарная скобка - чтобы совокупность выполнялась, достаточно, чтобы выполнялось любое из уравнений.
Первая синяя стрелка - для любого i в интервале... удовлетворяется условие
Вторая синяя стрелка - существует i в интервале... для которого удовлетворяется условие.
Эксель поправил - теперь бьёт.
Остальное понятно - код потом выложу... Но там не тривиальный расчет... Проверять надо будет
Я не изголяюсь и беру для расчетов USDFIX-INDEX
Я не изголяюсь и беру для расчетов USDFIX-INDEX
Я посмотрел, что он не бьёт слегка, думаю - дай разберусь - там же ничего сложного :)
В какой-то момент стало уже интересно - я "не внимательный" или они чего-то не договаривают.
Выяснилось, что первое.
Учитывая, что методику меняют регулярно, надо будет ещё в код и проверку зашивать - если текущая цена тика не бьёт с расчетной - расчет не проводить.
Я посмотрел, что он не бьёт слегка, думаю - дай разберусь - там же ничего сложного :)
В какой-то момент стало уже интересно - я "не внимательный" или они чего-то не договаривают.
Выяснилось, что первое.
Учитывая, что методику меняют регулярно, надо будет ещё в код и проверку зашивать - если текущая цена тика не бьёт с расчетной - расчет не проводить.
"Не бьет слегка", это не важно, важно что он применяется для 2-х ног. :)
И 1 строчка кода
usd_fix = SymbolInfoDouble(Symbol(), SYMBOL_LAST);
В общем, сделал расчет в МТ5, начал проверять - не бьёт с числами биржи. Причем очень интересно - иногда бьет, иногда не бьёт....
Проверил каждое число в отладчике, выгрузил в эксель данные и проверил там. Расчет в программе МТ5 и эксель сошелся, но с данными биржи всё-равно не бьет.
Потом думаю, у меня же есть возможность проверить у другого брокера... :)
И тут я слегка офигел. 2 скриншота от разных брокеров (время выгрузки и символ - одинаковые):
Собственно цены и объемы совпадают, но не совпадает ВРЕМЯ (верхний скрин - Финам, нижний - Открытие). Т.к. время передается с биржи вместе с ценами, я не очень понимаю - Как такое возможно???
Т.к. расчет курса (первый пост) идет с шагом в 1 с и усредняется на интервале 60 с - такое различие во времени иногда даёт небольшую погрешность и получить данные, точно совпадающие с данными биржи невозможно.
Кстати, ни один из расчетов по обоим брокерам для выбранного участка времени не совпал точно с данными биржи - т.е. там время другое :)
Вывод - передаваемое в МТ5 время тиков, это не время биржи, а какая-то импровизация сервера МТ5... И это очень плохо...
Был бы очень рад, если бы меня кто-нибудь разубедил...
Кстати, ни один из расчетов по обоим брокерам для выбранного участка времени не совпал точно с данными биржи - т.е. там время другое :)
Вывод - передаваемое в МТ5 время тиков, это не время биржи, а какая-то импровизация сервера МТ5... И это очень плохо...
А разница с временем биржи постоянна? Или гуляет в каких-то пределах?
Кстати, ещё вопрос, насклько время серверов брокера синхронизировано с временем серверов биржи и между собой.
гуляет
Кстати, ещё вопрос, насклько время серверов брокера синхронизировано с временем серверов биржи и между собой.
В данный момент делаю проверку, логика такая:
1) На сайте биржи есть пример доступных для скачивания за денежку (минимум 1500 р) данных Все сделки и лучшие заявки - Тип B - за дату 2018.12.29
2) В данный момент проверил ~10 сделок по SBER в Открытии - время и объем примера бьют с точностью до мс.
Т.е. время и объем по сделкам в истории у Открытия (акции) совпадают с биржевыми данными - время синхронизировано.
Сейчас проверю валюту и фьючерсы.
Потом будет очередь Финама...
Добавлено:
В Открытии акции и валюта с данными биржи по времени и объему совпадают (за дату 2018.12.29). Проверяю дальше.... Срочный по времени совпадает не везде.
Я сдаюсь - уехал жарить шашлыки :) Потом теперь...
А разница с временем биржи постоянна? Или гуляет в каких-то пределах?
Кстати, ещё вопрос, насклько время серверов брокера синхронизировано с временем серверов биржи и между собой.
Сверку времени сделок по данным биржи и времени сделок в МТ5 пока приостановил ввиду отсутствия смысла сверять историю по 2018 году + у Финама такой глубокой истории нет. Различались они в 18 году или нет - уже нет никакой разницы. К тому же, файл для анализа является "бесплатным примером" и по нему предъявлять не получится. Пришёл к выводу, что нужно будет заказать у биржи полный лог по нескольким символам и сделать сверку по факту. После этого - или разбираться с брокером/МТ5 или успокоится.
Самое главное, что для себя понял по итогам всех сверок:
1) Время сделок (время тиков, которые можно забрать из COPY_TICKS_TRADE) в каких-то случаях идет в МТ5 с биржи вместе с ценами и объемами, в каких-то случаях "своё". Это зависит от брокера, от секции (срочная/валютная/фондовая) и ещё каких-то не понятных для меня причин.
2) Время сделок в истории разных брокеров отличается. Учитывая, что эти сделки совершены на одной бирже - это не правильно, такого быть не должно, но чтобы разговаривать - нужны платные исходники. Этот пункт нужно обязательно учитывать при тестировании в МТ5, особенно арбитражных стратегий.
Скорее всего вернусь к изысканиям данной темы позже, но не факт.
Собственно вопрос, поднятый в данной теме решен - код прикладываю.
Результаты отличаются от данных биржи, но не сильно. Отличия связаны с тем, что время сделок в истории терминала и время сделок по которым считает биржа отличаются. Возможно есть ещё какие-то ошибки, но я их не нашёл.
Сам модуль расчета сделан в виде класса, после класса простенький эксперт для вывода значений на экран. В тестере работает, нужна только тиковая история. Заточен под Открытие.
Ну и результаты для сравнения. Слева эксперт, справа биржа:
Собственно вопрос, поднятый в данной теме решен - код прикладываю.
Результаты отличаются от данных биржи, но не сильно. Отличия связаны с тем, что время сделок в истории терминала и время сделок по которым считает биржа отличаются. Возможно есть ещё какие-то ошибки, но я их не нашёл.
Сам модуль расчета сделан в виде класса, после класса простенький эксперт для вывода значений на экран. В тестере работает, нужна только тиковая история. Заточен под Открытие.
Ну и результаты для сравнения. Слева эксперт, справа биржа:
Посмотрел Ваш код и нашел его очень "тяжелым", главная ошибка, это то, что при каждом тике Вы считаете курс, тогда как нам его нужно взять всего
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); } } //+------------------------------------------------------------------+
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем здравствуйте!
Прошу оказать помощь в понимании, каким образом происходит определение "цены тика" по инструментам RTS и RTSM срочного рынка.
Задача - определять эту цену "на лету" - код напишу и выложу здесь, подскажите только как считать.
Свои изыскания опишу ниже, но я так и не смог получить то же значение, что и в спецификации символа (и соответственно на сайте биржи).
Для примера возьму символ RTSM, дата 29 апреля, время ~21:30. Сначала теория:
Т.е. ответ на вопрос - 0.1$. Теперь смотрим само значение в спецификации:
Таким образом - расчетное значение на данный момент - 71.3838 руб./$. Это же значение указано на сайте биржи.
Откуда оно взялось и когда оно стало таким? Биржа дает "четкий" ответ - в соответствии с методикой и приказом.
Теперь сама методика - именно с ней возникли сложности. Не буду вставлять сюда все эти "простыни". Только суть:
Теперь для людей :)
Надо взять цены сделок для USDRUB_TOM за промежуток 18:43 - 18:44 c интервалом 1 с. и посчитать по ним среднее с учетом формулы 3.5. И вот тут я выдохся, я не понимаю, что имеется ввиду в строчках, помеченных галочкой. Но К я рассчитал - и оно сильно меньше чем в таблице почти везде.
Итоги расчета прикрепил - там простенький эксель. Данные выгружал по сделкам из Открытия.
Помогите разгадать загадку цены тика :)