← Voltar

Задержка вывода стакана

Здравствуйте. Скажите - а стакан выводится в событии ITrader.QuotesChanged с какойто заданной частотой или при любом изменении стакана? Я спрашиваю потому , что у меня стакан отображается с небольшой задержкой.на полсекунды отстает от квика. паралельно бид и аск из таблицы Инструменты появляются в тот же момент.

Este tópico foi útil?

Compartilhar tópico

Comentários (14)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Mikhail Sukhov
Mikhail Sukhov

при любом изменении стакана... отображение тоже кушает время. по одному этмоу факту мерять бесполезно (робот то все равно не считывает визуальные данные). Посмотрите, с какой скоростью вызывается сам QuotesChanged. Если одновременно, просто оптимизируйте отображение стакана.

Tauler
Tauler Autor

Да я уж не стакан отображаю, а просто BestBid вывожу в TextEdit. все равно задержка.

Делаю это так (.NET 2.0 стиль)

internal delegate void SetString(string str);

private SetString setStakanBid

public Form1() { InitializeComponent(); ... setStakanBid = setStakanBestBid; } void setStakanBestBid(string bid) private void Form1_Load(object sender, EventArgs e) { ..... waitHandle.WaitOne(); waitHandle.Close();

       trader.SecuritiesChanged += new

Action<IEnumerable<Security>>(trader_SecuritiesChanged); trader.QuotesChanged += new Action<MarketDepth>(trader_QuotesChanged); }

void trader_QuotesChanged(MarketDepth obj) { if (obj.Security.Code == "LKOH") { if (edtStakanBestBid.InvokeRequired) edtStakanBestBid.BeginInvoke(setStakanBid, new object[] { obj.BestBid.Price.ToString() }); } }

вроде особых накладных расходов не должно быть, но задержки все равно наблюдаются.

а бид/аск из Инстроментов момент в момент выводятся.

Хотя ниже я в одной тееме прочитал что юзать MarketDepth предпочтительнее и быстрее...

Mikhail Sukhov
Mikhail Sukhov

Ага, теперь видно. Смотрите на код:

edtStakanBestBid.BeginInvoke(setStakanBid, new object[] { obj.BestBid.Price.ToString() });

Он говорит, что обновление поля будет не мгновенно, а поставиться в очередь с другими windows событиями... Поэтому лучше проверять через консольное приложение. Там никаких синхронизаций нет. Появилось событие - вывелось в Console.WriteLine

Tauler
Tauler Autor

Хм, щас попробую. я уже думал об этом, просто в консоли неудобно наблюдать...

Tauler
Tauler Autor

В консоли то же самое. ощущение что событие возникает не при каждом изменеии стакана, а в какие то промежутки времени

вот код

{

trader.StartDde(lkoh);

trader.QuotesChanged += new Action<MarketDepth>(trader_QuotesChanged); waitHandle.WaitOne();

static void trader_QuotesChanged(MarketDepth obj) { if (obj.Security.Code == "LKOH") Console.WriteLine(obj.BestBid.Price.ToString());

на глаз видно, что ктоировки изменились несколько раз в стакане, а бестБид в консоль один раз выскочил

Tauler
Tauler Autor

Может я стакан как то не так получаю?

Mikhail Sukhov
Mikhail Sukhov

Все правильно. Посмотрю позднее.

Tauler
Tauler Autor

Вопрос решился сам собой путем прописывания в info.ini [excel] price-timeout=10

Mikhail Sukhov
Mikhail Sukhov

Ага, документацию не до конца читаете!

Tauler
Tauler Autor

Да просто забыл об этом. этот же пункт сначала документации, а на этапе написания вывода стакана об этом уже и не помнилось. так что не "не до конца читаете", а "не с начала" :) попутно возник вопрос.

как лучше сакан слушать - подписаться на событие trader.QuotesChanged или получить объект класса MarketDepth, и подписаться на его событие Changed? и вопрос 2 - а нафига метод ITrader..::.RegisterQuotes метод, если есть GetMarketDepth?

Mikhail Sukhov
Mikhail Sukhov

trader.QuotesChanged - когда меняется весь стакан (квик шлет кстати целиком каждый раз). MarketDepth.Changed - когда меняется только одна строчка. Для квика мне кажется не актуально.

RegisterQuotes - запускает экспорт ДДЕ по заявкам, тоесть вызывает StartDde(Security). GetMarketDepth - это получить то, что пришло под ДДЕ.

Без первого, второе не получить.

Tauler
Tauler Autor

А в чем разница тогда между StartDde(lkoh) и RegisterQuotes(lkoh)?

Mikhail Sukhov
Mikhail Sukhov

Второе вызывает первое. И больше ни в чем.

Я сделал RegisterQuotes, потому что это универсальное название, и механизм регастрации инструмента на получения стакана используется не только в Квик. А S# разрабатывается как платформо независимая библиотека.

Tauler
Tauler Autor

А, точно, он в ITrader описан. Спасибо за ответы!