Соответствие тиковых данных и котировок

 

Здравствуйте, форумчане!

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

В аттаче простенький эксперт, который сравнивает тиковые данные и котировки за минуту.

На FXCM-USDDemo02 все нормально, полное (почти) соответствие, к примеру:

2015.12.08 17:13:03.331 TicksAndRatesCompatibility EURUSD,M1: 2015.12.08 17:13: RatesOHLCV[1.08809 1.08827 1.08805 1.08824 442] TickOHLCV[1.08809 1.08827 1.08805 1.08824 374]

2015.12.08 17:12:03.349 TicksAndRatesCompatibility EURUSD,M1: 2015.12.08 17:12: RatesOHLCV[1.08784 1.0884 1.08784 1.08809 618] TickOHLCV[1.08784 1.0884 1.08784 1.08809 508]

2015.12.08 17:11:03.328 TicksAndRatesCompatibility EURUSD,M1: 2015.12.08 17:11: RatesOHLCV[1.08782 1.08801 1.08771 1.08784 461] TickOHLCV[1.08782 1.08801 1.08771 1.08783 389]

А вот на FXCM-EURDemo01 получается какая-то ерунда:

2015.12.08 17:18:03.369 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 15:18: RatesOHLCV[1.0885 1.08878 1.08843 1.08878 275] TickOHLCV[1.08839 1.08867 1.08832 1.08867 253]

2015.12.08 17:17:04.757 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 15:17: RatesOHLCV[1.08849 1.08859 1.0884 1.08849 400] TickOHLCV[1.08838 1.08848 1.08829 1.08838 347]

2015.12.08 17:16:03.312 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 15:16: RatesOHLCV[1.08855 1.0886 1.08843 1.08849 356] TickOHLCV[1.08844 1.08849 1.08832 1.08838 310]

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

Файлы:
 

В чем дело не поясню, но попробуйте заменить 

if(tickbar.time > 0 && tickbar.time != (((long)tick.time)/60)*60) {

 на что-нибудь, похожее на 

if( tickbar.time > 0 && tickbar.time != (long)(tick.time/60+0.5)*60 ) {
 
tara:

В чем дело не поясню, но попробуйте заменить ...

Алексей, спасибо за совет. Попробовал, результат все тот же

FXCM-USDDemo02 - все нормально:

2015.12.08 19:10:05.306 TicksAndRatesCompatibility EURUSD,M1: 2015.12.08 19:10: RatesOHLCV[1.0872 1.08721 1.08713 1.08714 94] TickOHLCV[1.0872 1.08721 1.08713 1.08714 81]

2015.12.08 19:09:08.398 TicksAndRatesCompatibility EURUSD,M1: 2015.12.08 19:09: RatesOHLCV[1.08723 1.08733 1.08713 1.0872 161] TickOHLCV[1.08723 1.08733 1.08713 1.0872 139]

2015.12.08 19:08:08.181 TicksAndRatesCompatibility EURUSD,M1: 2015.12.08 19:08: RatesOHLCV[1.08744 1.08744 1.08721 1.08724 131] TickOHLCV[1.08744 1.08744 1.08721 1.08724 99]

FXCM-EURDemo01 - все та же ерунда:

2015.12.08 19:15:03.982 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 17:15: RatesOHLCV[1.08762 1.08786 1.08762 1.08786 119] TickOHLCV[1.08751 1.08775 1.08751 1.08775 105]

2015.12.08 19:14:06.667 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 17:14: RatesOHLCV[1.08738 1.08765 1.08738 1.08765 133] TickOHLCV[1.08727 1.08754 1.08727 1.08754 119]

2015.12.08 19:13:03.765 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 17:13: RatesOHLCV[1.08747 1.08747 1.08734 1.08737 79] TickOHLCV[1.08736 1.08736 1.08723 1.08726 72]

Как мне кажется, тип datetime должен быть достаточно "точным" (в отличие от "неточных", с плавающей точкой),  из документации - "The datetime type is intended for storing the date and time as the number of seconds elapsed since January 01, 1970. This type occupies 8 bytes of memory." Т.е., по сути, это ulong. Не думаю что там могут иметь место "floating-point эффекты"...

Не хочется думать, что брокер (сервер) отгружает "несинхронизированные" данные, но пока других объяснений не нахожу... 

 
Если Вы о данных серверов USD и EUR, то они не синхронизированы. 
 
tara:
Если Вы о данных серверов USD и EUR, то они не синхронизированы. 
Нет, разумеется. Имеется ввиду несоответствие данных, которые отгружают функции ArrayCopyRates и SymbolInfoTick в обработчике OnTick от одного сервера. Понимаю, что так быть не должно, но в случае с FXCM-EURDemo01 наблюдается явное несоответствие.
 
l_r:
Нет, разумеется. Имеется ввиду несоответствие данных, которые отгружают функции ArrayCopyRates и SymbolInfoTick в обработчике OnTick от одного сервера. Понимаю, что так быть не должно, но в случае с FXCM-EURDemo01 наблюдается явное несоответствие.
FXCM-USDDemo02 и FXCM-EURDemo01 - кто из них один сервер? 
 
tara:
FXCM-USDDemo02 и FXCM-EURDemo01 - кто из них один сервер? 

Когда МТ4 подключается к торговому счету FXCM-USDDemo02 или FXCM-EURDemo01, в конкретный момент времени он взаимодействует с одним (физическим) сервером.

Если бы эта проблема была лишь на  FXCM-EURDemo01, можно было бы заподозрить "демо" в некорректной работе. Но проблема возникла и на реальном торговом сервере FXCM-USDReal05:

2015.12.08 22:13:04.247 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 22:13: RatesOHLCV[1.08931 1.08931 1.0891 1.08911 144] TickOHLCV[1.08942 1.08942 1.08921 1.08922 123]

2015.12.08 22:12:04.014 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 22:12: RatesOHLCV[1.08912 1.08942 1.08911 1.08931 226] TickOHLCV[1.08922 1.08953 1.08922 1.08942 188]

2015.12.08 22:11:04.298 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 22:11: RatesOHLCV[1.08904 1.08913 1.08903 1.08912 167] TickOHLCV[1.08915 1.08924 1.08914 1.08923 155]

 
l_r:

Когда МТ4 подключается к торговому счету FXCM-USDDemo02 или FXCM-EURDemo01, в конкретный момент времени он взаимодействует с одним (физическим) сервером.

Если бы эта проблема была лишь на  FXCM-EURDemo01, можно было бы заподозрить "демо" в некорректной работе. Но проблема возникла и на реальном торговом сервере FXCM-USDReal05:

2015.12.08 22:13:04.247 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 22:13: RatesOHLCV[1.08931 1.08931 1.0891 1.08911 144] TickOHLCV[1.08942 1.08942 1.08921 1.08922 123]

2015.12.08 22:12:04.014 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 22:12: RatesOHLCV[1.08912 1.08942 1.08911 1.08931 226] TickOHLCV[1.08922 1.08953 1.08922 1.08942 188]

2015.12.08 22:11:04.298 TicksAndRatesCompatibility EURUSD,M1: Alert: 2015.12.08 22:11: RatesOHLCV[1.08904 1.08913 1.08903 1.08912 167] TickOHLCV[1.08915 1.08924 1.08914 1.08923 155]

 

Уберите ошибки из программы. Хотя-бы те, которые совпадают с указанной мною. 

Обратите внимание на то, что Ваш алерт кричит каждую минуту,- т.е. на каждом баре - и ровно один раз.  

 
l_r:

Здравствуйте, форумчане!

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

В аттаче простенький эксперт, который сравнивает тиковые данные и котировки за минуту.

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

Во-вторых, никто не гарантирует, что именно Ваш терминал получает все тики, которые транслирует сервер. Пакеты могут и потеряться при передаче по сети.

В-третьих, никто не знает, каким образом формируются данные о количестве тиков на стороне сервера.

 

Поэтому количество тиков, полученных терминалом, и количество тиков, указанных брокером, вовсе не обязаны совпадать. 

 
Scriptong:

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

Во-вторых, никто не гарантирует, что именно Ваш терминал получает все тики, которые транслирует сервер. Пакеты могут и потеряться при передаче по сети.

В-третьих, никто не знает, каким образом формируются данные о количестве тиков на стороне сервера.

 

Поэтому количество тиков, полученных терминалом, и количество тиков, указанных брокером, вовсе не обязаны совпадать. 

Проблема не в количестве тиков, а в том, что тиковые максимум/минимум не могут "вылазить" за максимум/минимум котировочного бара за тот же период. На FXCM-USDDemo02 так и есть, а вот на FXCM-EURDemo01 и FXCM-USDReal05 почему-то "вылазят"... 

 
tara:

Уберите ошибки из программы. Хотя-бы те, которые совпадают с указанной мною. 

Обратите внимание на то, что Ваш алерт кричит каждую минуту,- т.е. на каждом баре - и ровно один раз.  

Так и должно быть. Если кричит алерт - значит тиковый максимум/минимум "вылазит" за максимум/минимум котировочного бара. Если не кричит - тогда все нормально. Вроде по коду понятно, что я пытаюсь выловить такие ситуации. Вопрос - почему они возникают?