В каких случаях вызывается Strategy.OnRunning? Отдельно интересно узнать в случае запуска отдельно на realtime и отдельно на history.
Верно ли что в случае исторического HistoryStrategyManager.TimeStep определяет частоту вызова Strategy.OnRunning? а в случае realtime StrategyManager.Interval определяет частоту вызова Strategy.OnRunning
В чем тогда разница между StrategyManager.Interval и HistoryStrategyManager.TimeStep ?
Я подписался в стратегии на Trader.NewTrades и они приходят пачками. Чем больше HistoryStrategyManager.TimeStep тем больше. А если моя логика завязана на каждый тик, то какой мне TimeStep ставить? 0 не проходит пишет DivisionByZero.
Comments (11)
Login or Create account, Log in or register to leave a comment
Когда Strategy.ProcessState переходит в Running. Не зависит от realtime и history.
Нет, определяет Strategy.OnProcess.
Нет, так же Strategy.OnProcess😂 Прочитайте доку по созданию стратегий. Нам расписано про члены классы Strategy.
Первый - это скорость изменения второго.
TimeStep - это шаг в истории. 0 просто логически быссмысленнен. И конечно, чем больше шаг, тем больше маркет-данных.
Что? можно поподробнее! точно скорость изменения TimeStep , а не MarketTime?
http://stocksharp.com/doc/help/html/5b90a23e-24b9-474a-a699-da47b666194a.htm
Где неясность? Я поправлю доку.
Показалось, что в топике 2 было сказано, StrategyManager.Interval это скорость изменения HistoryStrategyManager.TimeStep. Это и смутило.
В доке всё понятно. StrategyManager.Interval введен с целью не загружать процессор на 100%, и если нас такая загрузка процессора не напрягает, то мы данный параметр оставляем в значении по умолчанию.
TimeStep - это параметр, на который изменяется MarketTime на каждой итерации тестирования, устанавливается перед запуском теста, и, в нормальной ситуации, не меняется в процессе тестирования.
[3.0.5] Тестировал SampleHistoryTesting на RTS-03.11. Данные с РТС, метка времени у трейдов - с точностью до секунды (к сожалению), соответственно много трейдов с одинаковой меткой времени.
Поставил TimeShiftStrategyManager.TimeStep=0.1сек.
В SmaStrategy подписался на Trader.NewTrades и Trader.QuotesChanged и печатал в них приходящие трейд и пару бид-аск с соответственными моментами времени.
Получил
Здесь T - означает пришел ивент NewTrades, MD - пришел ивент QuotesChanged, OnPro - пришел OnProcess; MT = Trader.MarketTime, TT=Trade.Time, LCT=MarketDepth.LastChangeTime; BID,OFFER - лучший бид и офер в MarketDepth-e.
Что тут видно:
Это по-моему неправильно, раз я заказывал 0.1 сек.
Новый стакан генерится с интервалом 0.1 сек, при этом опорная цена берется последняя из тиков датированных последней секундной отметкой.
В связи с первым пунктом писать тиковые стратегии не получится тк OnProcess после каждого тика не вызовется. Тут есть гипотеза что это в связи с тем что точность времени у тиков 1 секунда. Но все исторические источники обладают у нас таким недостатком. Поэтому как вариант предлагаю ввести спецпараметр "генерация рандомных миллисекунд для трейдов" - т.е. например с меткой 10:30:23 пришло 8 трейдов. Искуственно поставить им временные метки 10:30:23.100, 10:30:23.200 и тд. Для стратегий одного инструмента как правило конкретное значение временной метки будет не слишком важно, а вот возможность протестировать на КАЖДОМ тике - мне кажется важнее.
Стакан генерируется с шагом цены 0.1 пункта вместо 5. Так и должно быть?
По виду генерируемый стакан осуществляет некоторое случайное блуждание вокруг цены последней сделки. Насколько генератор пытается оценить величину реального спреда?
У меня родилась некая идея как можно было бы генерировать стакан. Я ее нарисовал на картинке. http://stocksharp.com/forum/yaf_album.aspx?u=285&a=9 Так вот, алгоритм следующй ( на картинке называется алгоритм2)
Пусть цена последней сделки(сделка1) равна P1. Симулятор знает цену следующей сделки после этой (в будущем) с ценой отличной от P1 (т.е. если после сделки1 идут несколько с той же ценой их пропускаем и берем следующую, с другой ценой). Пусть эта цена P2. Тогда после сделки1 (которая с ценой P1) принимаем лучший бид равным min(P1,P2), лучший аск равным max(P1,P2).
Если посмотреть на рисунок, то, как мне кажется, спред имитируется правдоподобно.
В заключение уместно добавить, что я наткнулся на BidAskHistory.ru-вроде обещают продавать с миллисекундной точностью данные включая стаканы.
А интервал у самой стратегии изменили? По умолчанию он как раз равен секунде. И видимо это и сыграло свою роль.
Что в этом не так?
Это не источник, а биржа. Она транслирует с секундной точностью.
// создаем тестовый инструмент, на котором будет производится тестирование var security = new Security { Id = "RTS-9.09", // по идентификатору инструмента будет искаться папка с историческими маркет данными Code = "RI", Name = "RI", MinStepSize = 0.1, MinStepPrice = 2, Decimals = 1, Exchange = Exchange.Test, };
Абсолютно никак. И хорошо что Вы привели решение.
Рисунок мне нравиться. Не нравиться, то что сделку ищем в будущем. Потому как получается, что у нас есть сделка на текущей момент в истории. Она получилась не просто так, а потому что произошло пересечение бида и оффера в прошлом (миллисекунда назад или чуть больше, но это было, а не будет). Но идея очень интересная. Можно смотреть по прошедшим тика. Если у нас тики начинаю идти в разброс, значит спред раздвигается. И наоборот, если сделки начали идти во круг какой-то цены, значит происходила сдвижка спреда.
У них дата последняя за 11.2010. Они еще в седле?
Хотя, с этими интервалами реально путаница в случае с историческим тестироваием. Их слишком много ;)
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мсек. Причем разные стаканы.
Так что поясните что такое "скорость обновления стакана" пожалуйста ;)
В общем-то все нормально, за исключением того что стоит подумать над реализацией более реалистичного стакана
Пусть у меня 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 мсек, считая что они идут до нас одинаковый промежуток времени с биржи.
// создаем тестовый инструмент, на котором будет производится тестирование var security = new Security { Id = "RTS-9.09", // по идентификатору инструмента будет искаться папка с историческими маркет данными Code = "RI", Name = "RI", <mark>MinStepSize = 0.1</mark>, MinStepPrice = 2, Decimals = 1, Exchange = Exchange.Test, };
спасибо, теперь понял
Использование "будущих данных" при тестировании большой грех. Сам много "граалей" находил, которые вперед на 1 шаг заглядывали по ошибке кодирования;)
Но в данном случае по будущей получается красивее спред. Если брать расброс предыдущих, то следующая тиковая сделка может внутрь текущего имитируемого спреда попасть, а в случае с будущей - кладется на край имитируемого спреда как влитая.
Правда чтобы заимплементить хотя бы с вариантом "разброс в прошлом" надо чтобы MarketDepthGenerator знал историю сделок каждой бумаги. Можно хранить в нем Map<Security->Last_n_Ticks> и заполнять в Generate(Security) беря tick из Security.Price. Это если Generate вызывается ровно 1 раз на 1 тик. Но лучше его подписать на ITrader.NewTicks наверно...
А вот вариант с "будущей сделкой" как имплементить я не знаю потому что неведомо мне как читаются данные.
Не знаю. Пока ничего покупать не пытался, только пару демостаканов скачал.
Цитировать уже нереально, буду по пунктам.
securitySettings - так правильно, тестирование оживает каждый раз, как только TimeStep увеличивает время. Соответственно и смотрится, если стакан должен был сгенерироваться (у него высокая ликвидность), он генерируется. Если нет (у него низкая ликвидность), ожидаем второй итерации.
Миллисекунды в тиках. Это уже эвристика пошла. Не уверен, что ее стоит зашивать внутрь S#.
"Если брать расброс предыдущих, то следующая тиковая сделка может внутрь текущего имитируемого спреда попасть". Это я не понял. Стакан строиться по тикам за период. Как будет влиять на спред то, какой именно период был взят, предыдущий или будущий?
Подскажите пожалуйста, где можно познакомиться с описанием существующего алгоритма генерации стакана?
Спасибо
В аттаче. Это то что в версии 3.0.5
Не похоже что в седле. Домены уже некоторые у них проэкспайрены даже. Я у них скачивал тестовые данные(стаканы), те что бесплатно. Они коррелируют с данными о сделках скаченных с финама очень даже замечательно, только у финама секундная точность.