← 返回

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

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

本主题对您有帮助吗?

分享主题

评论 (14)

登录创建账户, 登录或注册以发表评论

Mikhail Sukhov
Mikhail Sukhov

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

Tauler
Tauler 作者

Да я уж не стакан отображаю, а просто 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 作者

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

Tauler
Tauler 作者

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

вот код

{

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 作者

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

Mikhail Sukhov
Mikhail Sukhov

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

Tauler
Tauler 作者

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

Mikhail Sukhov
Mikhail Sukhov

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

Tauler
Tauler 作者

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

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

Tauler
Tauler 作者

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Tauler
Tauler 作者

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