Вопрос по котировкам FORTS - страница 3

 

Время компьютера желательно держать точным, чтобы меньше было шансов неправильно логи понять.

Спасибо за скрипт: вот результаты этого скрипта за 1 минуту 17:36

CollectTicks (ED-12.14,M1)      2014.11.10 17:36:06; Bid = 1.2474; Ask = 1.2475; Last = 1.2476; Vol = 3
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:06; Bid = 1.2474; Ask = 1.2476; Last = 1.2476; Vol = 3
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:12; Bid = 1.2474; Ask = 1.2476; Last = 1.2476; Vol = 5
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:26; Bid = 1.2474; Ask = 1.2475; Last = 1.2476; Vol = 5
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:28; Bid = 1.2474; Ask = 1.2476; Last = 1.2476; Vol = 5
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:29; Bid = 1.2474; Ask = 1.2476; Last = 1.2474; Vol = 8
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:29; Bid = 1.2473; Ask = 1.2475; Last = 1.2474; Vol = 8
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:30; Bid = 1.2473; Ask = 1.2474; Last = 1.2473; Vol = 5
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:30; Bid = 1.2472; Ask = 1.2474; Last = 1.2473; Vol = 5
CollectTicks (ED-12.14,M1)      2014.11.10 17:36:43; Bid = 1.2472; Ask = 1.2474; Last = 1.2474; Vol = 2

Особенность OnTick в том, что он реагирует как на изменение Bid/Ask (инфопоток), так и на Last (трейд поток).

В результате получается, что количество вызовов OnTick для биржевых торгуемых инструментов заведомо больше торговых транзакций.

Почему так сделано:

  1. нельзя душить эксперта только торговыми сделками и не давать ему информацию об изменении рынка (одно дело вызвать 5 раз, другое - 15 раз)
  2. нельзя в рамках живого рынка выдавать нулевые last и last_volume в обзор рынка, так как кто-то из трейдеров взорвется


Есть еще один момент с тем, что на пакетных обновлениях, когда одновременно приходят два и более тика по инструменту, то OnTick вызывается однократно. Это позволяет не тормозить поток входящих котировок и не делать огромную очередь тиков для тормозящих экспертов.

Скоро мы включим поток Time & Sales, что даст возможность точно анализировать ленту сделок.

 
Renat:

Время компьютера желательно держать точным, чтобы меньше было шансов неправильно логи понять.

Спасибо за скрипт: вот результаты этого скрипта за 1 минуту 17:36

Особенность OnTick в том, что он реагирует как на изменение Bid/Ask (инфопоток), так и на Last (трейд поток).

В результате получается, что количество вызовов OnTick для биржевых торгуемых инструментов заведомо больше торговых транзакций.

Почему так сделано:

  1. нельзя душить эксперта только торговыми сделками и не давать ему информацию об изменении рынка (одно дело вызвать 5 раз, другое - 15 раз)
  2. нельзя в рамках живого рынка выдавать нулевые last и last_volume в обзор рынка, так как кто-то из трейдеров взорвется


Есть еще один момент с тем, что на пакетных обновлениях, когда одновременно приходят два и более тика по инструменту, то OnTick вызывается однократно. Это позволяет не тормозить поток входящих котировок и не делать огромную очередь тиков для тормозящих экспертов.

Скоро мы включим поток Time & Sales, что даст возможность точно анализировать ленту сделок.

Все это, конечно, здорово, но для ФОРТС, где есть стаканы, в структуру MqlTick нужно было добавить флаг котировки.

"Размножение" сделок - это не страшно, страшно то, что реальные сделки пропадают. 

P.S. Мой БАН связан с моим IP адресом, пожалуйста, снимите его, а то мне приходится для ответа Вам каждый раз переустанавливать браузер. 

 

Есть еще один момент с тем, что на пакетных обновлениях, когда одновременно приходят два и более тика по инструменту, то OnTick вызывается однократно. Это позволяет не тормозить поток входящих котировок и не делать огромную очередь тиков для тормозящих экспертов.

При таком подходе получается следующее:

Как должно быть:

    Бумага    Время    Время(мкс)    Цена    Кол-во

317922.000000    RTS-12.14 [FORTS]    18:44:54    199000.000000    104140.000000    1.000000

317923.000000    RTS-12.14 [FORTS]    18:44:54    261000.000000    104130.000000    1.000000
317924.000000    RTS-12.14 [FORTS]    18:44:54    587000.000000    104140.000000    1.000000
317925.000000    RTS-12.14 [FORTS]    18:44:54    589000.000000    104140.000000    1.000000
317926.000000    RTS-12.14 [FORTS]    18:44:54    691000.000000    104140.000000    1.000000
317927.000000    RTS-12.14 [FORTS]    18:44:54    691000.000000    104140.000000    1.000000
317928.000000    RTS-12.14 [FORTS]    18:44:54    842000.000000    104130.000000    2.000000
317929.000000    RTS-12.14 [FORTS]    18:44:54    919000.000000    104150.000000    1.000000
317930.000000    RTS-12.14 [FORTS]    18:44:55    337000.000000    104150.000000    1.000000
317931.000000    RTS-12.14 [FORTS]    18:44:55    337000.000000    104150.000000    1.000000
317932.000000    RTS-12.14 [FORTS]    18:44:55    337000.000000    104160.000000    1.000000
317933.000000    RTS-12.14 [FORTS]    18:44:55    337000.000000    104160.000000    1.000000
317934.000000    RTS-12.14 [FORTS]    18:44:55    337000.000000    104160.000000    3.000000
317935.000000    RTS-12.14 [FORTS]    18:44:55    375000.000000    104140.000000    1.000000
317936.000000    RTS-12.14 [FORTS]    18:44:55    375000.000000    104130.000000    5.000000
317937.000000    RTS-12.14 [FORTS]    18:44:55    796000.000000    104130.000000    1.000000
317938.000000    RTS-12.14 [FORTS]    18:44:55    799000.000000    104130.000000    2.000000
317939.000000    RTS-12.14 [FORTS]    18:44:56    54000.000000    104160.000000    1.000000
317940.000000    RTS-12.14 [FORTS]    18:44:57    235000.000000    104160.000000    1.000000
317941.000000    RTS-12.14 [FORTS]    18:44:57    451000.000000    104140.000000    2.000000
317942.000000    RTS-12.14 [FORTS]    18:44:57    487000.000000    104140.000000    6.000000
317943.000000    RTS-12.14 [FORTS]    18:44:57    521000.000000    104160.000000    1.000000
317944.000000    RTS-12.14 [FORTS]    18:44:57    621000.000000    104160.000000    1.000000
317945.000000    RTS-12.14 [FORTS]    18:44:58    38000.000000    104160.000000    3.000000
317946.000000    RTS-12.14 [FORTS]    18:44:58    695000.000000    104160.000000    13.000000
317947.000000    RTS-12.14 [FORTS]    18:44:58    883000.000000    104140.000000    2.000000

317948.000000    RTS-12.14 [FORTS]    18:44:58    986000.000000    104160.000000    1.000000
317949.000000    RTS-12.14 [FORTS]    18:44:58    993000.000000    104160.000000    5.000000
317950.000000    RTS-12.14 [FORTS]    18:44:58    993000.000000    104160.000000    5.000000
317951.000000    RTS-12.14 [FORTS]    18:44:58    995000.000000    104160.000000    5.000000
317952.000000    RTS-12.14 [FORTS]    18:44:58    996000.000000    104160.000000    1.000000
317953.000000    RTS-12.14 [FORTS]    18:44:59    56000.000000    104160.000000    1.000000
317954.000000    RTS-12.14 [FORTS]    18:44:59    560000.000000    104140.000000    1.000000
317955.000000    RTS-12.14 [FORTS]    18:44:59    604000.000000    104140.000000    1.000000
317956.000000    RTS-12.14 [FORTS]    18:44:59    647000.000000    104160.000000    1.000000


Как получаем в МТ5:

NE    0    18:44:54.483    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:54  Bid = 104130  Ask = 104150  Last = 104140  Vol = 1
ES    0    18:44:54.639    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:54  Bid = 104130  Ask = 104150  Last = 104130  Vol = 2
OR    0    18:44:54.720    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:54  Bid = 104130  Ask = 104150  Last = 104150  Vol = 1
NQ    0    18:44:54.983    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:55  Bid = 104140  Ask = 104150  Last = 104150  Vol = 1
FP    0    18:44:55.139    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:55  Bid = 104140  Ask = 104160  Last = 104160  Vol = 3
JO    0    18:44:55.174    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:55  Bid = 104140  Ask = 104160  Last = 104130  Vol = 5
GN    0    18:44:55.206    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:55  Bid = 104130  Ask = 104160  Last = 104130  Vol = 5
RM    0    18:44:55.592    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:55  Bid = 104130  Ask = 104160  Last = 104130  Vol = 2
IL    0    18:44:55.891    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:56  Bid = 104130  Ask = 104160  Last = 104160  Vol = 1
HJ    0    18:44:55.921    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:56  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
RI    0    18:44:57.032    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:57  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
PH    0    18:44:57.242    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:57  Bid = 104140  Ask = 104160  Last = 104140  Vol = 2
FG    0    18:44:57.297    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:57  Bid = 104140  Ask = 104160  Last = 104140  Vol = 6
PF    0    18:44:57.328    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:57  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
JE    0    18:44:57.436    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:57  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
QD    0    18:44:57.838    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:58  Bid = 104140  Ask = 104160  Last = 104160  Vol = 3
DP    0    18:44:58.514    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:58  Bid = 104140  Ask = 104160  Last = 104160  Vol = 13
RR    0    18:44:58.693    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:58  Bid = 104140  Ask = 104160  Last = 104140  Vol = 2
JP    0    18:44:58.795    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:58  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
CO    0    18:44:58.852    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:59  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
GN    0    18:44:59.358    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:59  Bid = 104140  Ask = 104160  Last = 104140  Vol = 1
MM    0    18:44:59.406    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:59  Bid = 104140  Ask = 104160  Last = 104140  Vol = 1
IL    0    18:44:59.453    FORTSTicksAction (RTS-12.14,M1)    Time = 18:44:59  Bid = 104140  Ask = 104160  Last = 104160  Vol = 1
CK    0    18:50:31.437    FORTSTicksAction (RTS-12.14,M1)    Time = 18:50:24  Bid = 0  Ask = 0  Last = 104160  Vol = 1
KH    0    18:50:33.357    FORTSTicksAction (RTS-12.14,M1)    Time = 18:50:24  Bid = 104080  Ask = 104180  Last = 104160  Vol = 1


Это все последние непосредственно перед закрытием сессии (т.е. ниже котировок нету до конца клиринга).

За точку отсчета возьмем выделенные черным три строчки. Вопросов два:

1.Куда делись выделенные красным?

2.Откуда взялось выделенное синим?


Еще вопрос (дополнительный) - какой временной интервал означает "одновременный приход"?

 
Dima_S:

При таком подходе получается следующее:

317945.000000    RTS-12.14 [FORTS]    18:44:58    38000.000000    104160.000000    3.000000
317946.000000    RTS-12.14 [FORTS]    18:44:58    695000.000000    104160.000000    13.000000
317947.000000    RTS-12.14 [FORTS]    18:44:58    883000.000000    104140.000000    2.000000

317948.000000    RTS-12.14 [FORTS]    18:44:58    986000.000000    104160.000000    1.000000
317949.000000    RTS-12.14 [FORTS]    18:44:58    993000.000000    104160.000000    5.000000
317950.000000    RTS-12.14 [FORTS]    18:44:58    993000.000000    104160.000000    5.000000
317951.000000    RTS-12.14 [FORTS]    18:44:58    995000.000000    104160.000000    5.000000
317952.000000    RTS-12.14 [FORTS]    18:44:58    996000.000000    104160.000000    1.000000



Это все последние непосредственно перед закрытием сессии (т.е. ниже котировок нету до конца клиринга).

За точку отсчета возьмем выделенные черным три строчки. Вопросов два:

1.Куда делись выделенные красным?

Они прилетели одним сетевым пакетом скорее всего и вызвались как один OnTick. Было 8 тиков в одну секунду, трое из них одиночными вызовами пришли, а последние 5 скорее всего одним пакетом с отображением последней котировки как Last.


2.Откуда взялось выделенное синим?

Это постмаркет. Мы также даем возможность ловить события постмаркета. Там обычно снятие заявок только работает.


Еще вопрос (дополнительный) - какой временной интервал означает "одновременный приход"?

Это не интервал, а скорее физический сетевой пакет. Прилетает пакет на 2-3-4 тика, все они накладываются в базу, но вызов OnTick идет один.

Еще есть шанс, что эксперт может тормозить(быть занятым) и новая пришедшая котировка добавляется в базу, но вызова OnTick не происходит, так как эксперт работает. Если бы такого механизм не было, то мы бы легко переполнили входящие очереди котировок для эксперта и начав посылать старые котировки эксперту и ввели бы его в заблуждение.

 

Ренат!

Спасибо большое за подробное разъяснение, но...

Для ФОРТС такой подход, как мне кажется, не приемлем.

Должно быть: котировка - объём, и никак иначе.

Было 11 котировок, значит в OnTick их должно быть 11.

Разве не так? 

 

Не так.

Не путайте вопрос доставки правильных и точных потоков данных в терминал и вызов/уведомления экспертов.

Все данные точно и правильно доставляются в терминал, его это основа. Достаточно сравнить чарты.

А вот запуск экспертов(онтик) - это независимое и асинхронное уведомление. Приходящий пакет данных не может ждать каких-то тормозящих экспертов, а должен быть мгновенно наложен на рыночное окружение и лишь факультативно(если эксперт закончил предыдущий вызов) запустить эксперта.

Задумайтесь о ситуации: поток котировок 2 в секунду и работающий эксперт, который тормозит, совершает торговые сделки, но при этом требует, чтобы новые ожидающие котировки в очереди не накладывались на рыночное окружение терминала, пока его величество эксперт не закончит свою работу.

Улавливаете, к чему это приведет? Весь терминал начнет задерживать все процессы ради глупой идеи сохранения рыночного снапшота на состоянии обрабатываемой котировки. А если подумать о других инструментах, то только застрелиться останется.

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

 
Renat:

Не так.

Не путайте вопрос доставки правильных и точных потоков данных в терминал и вызов/уведомления экспертов.

Все данные точно и правильно доставляются в терминал, его это основа. Достаточно сравнить чарты.

А вот запуск экспертов(онтик) - это независимое и асинхронное уведомление. Приходящий пакет данных не может ждать каких-то тормозящих экспертов, а должен быть мгновенно наложен на рыночное окружение и лишь факультативно(если эксперт закончил предыдущий вызов) запустить эксперта.

Задумайтесь о ситуации: поток котировок 2 в секунду и работающий эксперт, который тормозит, совершает торговые сделки, но при этом требует, чтобы новые ожидающие котировки в очереди не накладывались на рыночное окружение терминала, пока его величество эксперт не закончит свою работу.

Улавливаете, к чему это приведет? Весь терминал начнет задерживать все процессы ради глупой идеи сохранения рыночного снапшота на состоянии обрабатываемой котировки. А если подумать о других инструментах, то только застрелиться останется.

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

Не согласен.

Допустим, я не использую стакан (bid и ask есть в тике)

Какое представление о положении на рынке ФОРТС я (экперт) буду иметь не понятно с какой котировкой

и объёмом? 

Ведь можно, для ФОРТС, не передавать bid и ask ( они есть в стакане ).

И в коде изменения минимальные - подписался на стакан - не транслируются в тике bid и ask  

 
Mikalas:

Не согласен.

Перечитайте несколько раз мое объяснение, пожалуйста.

Допустим, я не использую стакан (bid и ask есть в тике)

Какое представление о положении на рынке ФОРТС я (экперт) буду иметь не понятно с какой котировкой

С текущей асинхронно обновляемой котировкой и никакой другой.

Если вас вызвали, то все - перед вами в стакане только та котировка, которая есть. Если пришло и наложилось 2 котировки в пакете, то увидите только последнюю. Ибо никто не будет передавать первую котировку эксперту и ждать пока эксперт соизволит завершить ее обсчет. Все, старая котировка ушла и если вы ее не смогли вовремя словить и отработать, значит поезд ушел. По той старой котировке вы ничего все равно исполнить не сможете. Да и по текущей/последней тоже сомнительно исполниться, так как к момент посылки ордера рынок может поменяться.

Никакие "не транслировать bid/ask" не помогут. Устаревшие тики есть устаревшие - никто вам не заморозит рынок и не даст поработать со старыми тиками.

При желании можете:

  1. поставить терминал в колокейшен ближе к брокеру на скоростном компе и будете ловить все активнее
  2. зациклить эксперта, постоянно сканить стакан и маркет вотч чтобы извлекать все что есть чаще
  3. анализировать чарт, анализировать стакан

Вместе с Time & Sales мы подумаем над предоставлением прямого доступа к последнему тиковому потоку цен, чтобы можно было получить доступ к последовательным тикам. В обзоре рынка мы его собираем сессионно. Это даст больше возможностей скальперам.

 

Renat:

Вместе с Time & Sales мы подумаем над предоставлением прямого доступа к последнему тиковому потоку цен, чтобы можно было получить доступ к последовательным тикам. В обзоре рынка мы его собираем сессионно. Это даст больше возможностей скальперам.

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

Что-то у меня остались сомнения.

Щас поставлю выполняться это:

//+------------------------------------------------------------------+
//|                                                    Kotirovki.mq5 |
//|                                                   Copyright 2014 |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Mikalas"
#property link      "http://www.mql5.com"
#property version   "1.02"
//
MqlTick curr_tick;
double  start_last   = 0;
double  start_bid    = 0;
double  start_ask    = 0; 
ulong   start_volume = 0;  
//  
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit( const int reason )
{

}
//+------------------------------------------------------------------+
//| Expert On Tick event function                                    |
//+------------------------------------------------------------------+  
void OnTick()
{
  if ( SymbolInfoTick( _Symbol, curr_tick ) )
  {
    if ( start_last == curr_tick.last )
    {
      if ( start_volume == curr_tick.volume )
      {
        if ( ( start_ask == curr_tick.ask ) &&
             ( start_bid == curr_tick.bid )  )
        {
          Print( curr_tick.time, "; Bid = ", curr_tick.bid,
                                 "; Ask = ", curr_tick.ask,
                                 "; Last = ", curr_tick.last,
                                 "; Vol = ", curr_tick.volume, "; Новая котировка(Всё одинаковое)" );
        }
        else
        {
          start_ask = curr_tick.ask;
          start_bid = curr_tick.bid;
          Print( curr_tick.time, "; Bid = ", curr_tick.bid,
                                 "; Ask = ", curr_tick.ask,
                                 "; Last = ", curr_tick.last,
                                 "; Vol = ", curr_tick.volume, "; Изменение ask или bid? Или же новая котировка?" );
        }
      }
      else
      {
        start_last = curr_tick.last;
        start_volume = curr_tick.volume;
        start_ask = curr_tick.ask;
        start_bid = curr_tick.bid;
        Print( curr_tick.time, "; Bid = ", curr_tick.bid,
                               "; Ask = ", curr_tick.ask,
                               "; Last = ", curr_tick.last,
                               "; Vol = ", curr_tick.volume, "Новая котировка (Изменён объём)!" );
      }
    }
    else
    {
      start_last = curr_tick.last;
      start_volume = curr_tick.volume;
      start_ask = curr_tick.ask;
      start_bid = curr_tick.bid;
      Print( curr_tick.time, "; Bid = ", curr_tick.bid,
                             "; Ask = ", curr_tick.ask,
                             "; Last = ", curr_tick.last,
                             "; Vol = ", curr_tick.volume, "Новая котировка! (Изменена котировка)" );
    }
  }
}

 А завтра посмотрим, что получилось...

Файлы:
Kotirovki.ex5  5 kb
Причина обращения: