Здравствуйте. Скажите - а стакан выводится в событии ITrader.QuotesChanged с какойто заданной частотой или при любом изменении стакана? Я спрашиваю потому , что у меня стакан отображается с небольшой задержкой.на полсекунды отстает от квика. паралельно бид и аск из таблицы Инструменты появляются в тот же момент.
コメント (14)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
при любом изменении стакана... отображение тоже кушает время. по одному этмоу факту мерять бесполезно (робот то все равно не считывает визуальные данные). Посмотрите, с какой скоростью вызывается сам QuotesChanged. Если одновременно, просто оптимизируйте отображение стакана.
Да я уж не стакан отображаю, а просто 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();
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 предпочтительнее и быстрее...
Ага, теперь видно. Смотрите на код:
edtStakanBestBid.BeginInvoke(setStakanBid, new object[] { obj.BestBid.Price.ToString() });
Он говорит, что обновление поля будет не мгновенно, а поставиться в очередь с другими windows событиями... Поэтому лучше проверять через консольное приложение. Там никаких синхронизаций нет. Появилось событие - вывелось в Console.WriteLine
Хм, щас попробую. я уже думал об этом, просто в консоли неудобно наблюдать...
В консоли то же самое. ощущение что событие возникает не при каждом изменеии стакана, а в какие то промежутки времени
вот код
{
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());
на глаз видно, что ктоировки изменились несколько раз в стакане, а бестБид в консоль один раз выскочил
Может я стакан как то не так получаю?
Все правильно. Посмотрю позднее.
Вопрос решился сам собой путем прописывания в info.ini [excel] price-timeout=10
Ага, документацию не до конца читаете!
Да просто забыл об этом. этот же пункт сначала документации, а на этапе написания вывода стакана об этом уже и не помнилось. так что не "не до конца читаете", а "не с начала" :) попутно возник вопрос.
как лучше сакан слушать - подписаться на событие trader.QuotesChanged или получить объект класса MarketDepth, и подписаться на его событие Changed? и вопрос 2 - а нафига метод ITrader..::.RegisterQuotes метод, если есть GetMarketDepth?
trader.QuotesChanged - когда меняется весь стакан (квик шлет кстати целиком каждый раз). MarketDepth.Changed - когда меняется только одна строчка. Для квика мне кажется не актуально.
RegisterQuotes - запускает экспорт ДДЕ по заявкам, тоесть вызывает StartDde(Security). GetMarketDepth - это получить то, что пришло под ДДЕ.
Без первого, второе не получить.
А в чем разница тогда между StartDde(lkoh) и RegisterQuotes(lkoh)?
Второе вызывает первое. И больше ни в чем.
Я сделал RegisterQuotes, потому что это универсальное название, и механизм регастрации инструмента на получения стакана используется не только в Квик. А S# разрабатывается как платформо независимая библиотека.
А, точно, он в ITrader описан. Спасибо за ответы!