Mikhail Sukhov pyhta4og
1. MarketTime прихода OnProcess не 0.1 сек как хотелось а 1.1 сек! А именно
10:30:20.900,10:30:22.000,10:30:23.100.
Это по-моему неправильно, раз я заказывал 0.1 сек.
А интервал у самой стратегии изменили? По умолчанию он как раз равен секунде. И видимо это и сыграло свою роль.
Поставил Strategy.Interval=TimeSpan.Zero. OnProcess начал приходить как заказывал в TimeShiftStrategyManager.TimeStep=0.1сек. В realtime не проверял, насколько корректно ставить Strategy.Interval=0?
Хотя, с этими интервалами реально путаница в случае с историческим тестироваием. Их слишком много ;)
Strategy.Interval
Дока:
Цитата:Интервал стратегии. Как часто StrategyManager будет вызывать метод Process(DateTime).
В реальности нет метода StrategyManager.Process(DateTime). Есть только факт того что Strategy.OnProcess вызывается не чаще чем этот интервал.
TimeShiftStrategyManager.TimeStep
Дока:
Цитата:
Временной шаг перемещения во времени, на который будет изменятся время from до to в методе Start(DateTime, DateTime).
В реальности это минимальный интервал времени биржи Trader.MarketTime с которым вызывается Strategy.OnProcess.
результат моего эксперимента. Если поставть Strategy.Interval=1000msec, TimeShiftStrategyManager.TimeStep=200msec то OnProcess приходит с периодом 1200msec,
А если Strategy.Interval=999msec, а TimeShiftStrategyManager.TimeStep=200msec, то с периодом 1000msec.
Похоже там где-то > на >= надо заменить ;)
TimeShiftStrategyManager.Interval я бы переименовал в SimulationDelay, потому что это просто задержка программы симулятора на какое-то время и к Trader.MarketTime отношения похоже не имеет. Причем я поставил 1 секунду, а OnProcess у меня в реальности раз в 2 секунды вызывался (судя по наручным часам).
Плюс еще есть параметр конструктора HistoryTestTrader
дока:
Цитата:
securitySettings:
// Инструменты, с которыми будет вестись работа, и интервал обновления для каждого
// инструмента. Интервал показывает степерь ликвидности инструмента, которое
// влияет на скорость обновления стакана.
В реальности я ставил всякие значения от 100 мс до 10 сек, но стаканы(генерированные) у меня приходили раз в 200 мсек, т.е. как указано было в TimeShiftStrategyManager.TimeStep=200мсек. Причем разные стаканы.
Так что поясните что такое "скорость обновления стакана" пожалуйста ;)
Цитата:pyhta4og
2. Новый стакан генерится с интервалом 0.1 сек, при этом опорная цена берется последняя из тиков датированных последней секундной отметкой.
Что в этом не так?
В общем-то все нормально, за исключением того что стоит подумать над реализацией более реалистичного стакана
Цитата:pyhta4og
3. В связи с первым пунктом писать тиковые стратегии не получится тк OnProcess после каждого тика не вызовется. Тут есть гипотеза что это в связи с тем что точность времени у тиков 1 секунда. Но все исторические источники обладают у нас таким недостатком.
Это не источник, а биржа. Она транслирует с секундной точностью.
Пусть у меня 10 тиков датированные 10:30:00. На ликвиде типа RIH1 этого предостаточно. Я хочу чтобы симулятор сам наставил им миллисекунд чтобы они равномерно распределились по промежутку 10:30:00-10:30:01. Тогда у меня будут нормально генерится стаканы, т.е. 1-й тик, 1-й стакан; 2-й тик, 2-й стакан и тд. Сейчас сначала все 10 тиков, потом стакан для последнего тика в секунде.
Насчет биржи. Если в тике нет миллисекундной пометки, а есть только секундная, то можно в realtime-адаптерах милисекунды прикидывать по фактическому времени прихода тика.
Т.е. пришел из смарта тик за 10:30:00 в 10:30:00.100. Он 100 мс шел от биржи через ITINVEST до S#. Cледующий пришел 10:30:00.500. Можно второму тику поставить 500-100=400 мсек, считая что они идут до нас одинаковый промежуток времени с биржи.
pyhta4og
4. Стакан генерируется с шагом цены 0.1 пункта вместо 5. Так и должно быть?
// создаем тестовый инструмент, на котором будет производится тестирование
var security = new Security
{
Id = "RTS-9.09", // по идентификатору инструмента будет искаться папка с историческими маркет данными
Code = "RI",
Name = "RI",
MinStepSize = 0.1,
MinStepPrice = 2,
Decimals = 1,
Exchange = Exchange.Test,
};
спасибо, теперь понял
Цитата:pyhta4og
5. По виду генерируемый стакан осуществляет некоторое случайное блуждание вокруг цены последней сделки.
Насколько генератор пытается оценить величину реального спреда?
Абсолютно никак. И хорошо что Вы привели решение.
pyhta4og У меня родилась некая идея как можно было бы генерировать стакан.
Я ее нарисовал на картинке.
http://stocksharp.com/fo...lbum.aspx?u=285&a=9
Так вот, алгоритм следующй ( на картинке называется алгоритм2)
Пусть цена последней сделки(сделка1) равна P1. Симулятор знает цену следующей сделки после этой (в будущем) с ценой отличной от P1 (т.е. если после сделки1 идут несколько с той же ценой их пропускаем и берем следующую, с другой ценой). Пусть эта цена P2. Тогда после сделки1 (которая с ценой P1) принимаем лучший бид равным min(P1,P2), лучший аск равным max(P1,P2).
Если посмотреть на рисунок, то, как мне кажется, спред имитируется правдоподобно.
Рисунок мне нравиться. Не нравиться, то что сделку ищем в будущем. Потому как получается, что у нас есть сделка на текущей момент в истории. Она получилась не просто так, а потому что произошло пересечение бида и оффера в прошлом (миллисекунда назад или чуть больше, но это
было, а не будет). Но идея очень интересная. Можно смотреть по прошедшим тика. Если у нас тики начинаю идти в разброс, значит спред раздвигается. И наоборот, если сделки начали идти во круг какой-то цены, значит происходила сдвижка спреда.
Использование "будущих данных" при тестировании большой грех. Сам много "граалей" находил, которые вперед на 1 шаг заглядывали по ошибке кодирования;)
Но в данном случае по будущей получается красивее спред. Если брать расброс предыдущих, то следующая тиковая сделка может внутрь текущего имитируемого спреда попасть, а в случае с будущей - кладется на край имитируемого спреда как влитая.
Правда чтобы заимплементить хотя бы с вариантом "разброс в прошлом" надо чтобы MarketDepthGenerator знал историю сделок каждой бумаги. Можно хранить в нем Map<Security->Last_n_Ticks> и заполнять в Generate(Security) беря tick из Security.Price. Это если Generate вызывается ровно 1 раз на 1 тик. Но лучше его подписать на ITrader.NewTicks наверно...
А вот вариант с "будущей сделкой" как имплементить я не знаю потому что неведомо мне как читаются данные.
Цитата:pyhta4og
В заключение уместно добавить, что я наткнулся на BidAskHistory.ru-вроде обещают продавать с миллисекундной точностью данные включая стаканы.
У них дата последняя за 11.2010. Они еще в седле?
Не знаю. Пока ничего покупать не пытался, только пару демостаканов скачал.