Задержка вывода стакана
Atom Ответить
12.03.2010


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

Теги:


Спасибо:




14 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

Спасибо:

Tauler

Фотография
Дата: 12.03.2010
Ответить


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

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

internal delegate void SetString(string str);

private SetString setStakanBid

public Form1()
{
InitializeComponent();
...
setStakanBid = setStakanBestBid;
}
void setStakanBestBid(string bid)
{
edtStakanBestBid.Text = 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

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

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

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

Спасибо:

Tauler

Фотография
Дата: 12.03.2010
Ответить


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

Автор топика
Спасибо:

Tauler

Фотография
Дата: 12.03.2010
Ответить


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

вот код

{

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

Фотография
Дата: 12.03.2010
Ответить


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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

Спасибо:

Tauler

Фотография
Дата: 12.03.2010
Ответить


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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

Спасибо:

Tauler

Фотография
Дата: 12.03.2010
Ответить


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

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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

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

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

Спасибо:

Tauler

Фотография
Дата: 12.03.2010
Ответить


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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

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

Спасибо:

Tauler

Фотография
Дата: 15.03.2010
Ответить


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

Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy