S# 4.0.17 Сделки реальные, стаканы - генерируются.
Стратегия осуществляет вход лимитными заявками. Проблема в том что если запускать тестирование с одинаковыми параметрами несколько раз, результаты расходятся в некоторых местах. Если копнуть глубже - при одном прогоне стратегия может зайти там, где не зашла в другом прогоне, хотя заявку выставляла точно на тот же объем и по той же цене.
Если посмотреть все сделки, цена ходила ЗА данную лимитную заявку (но в пределах одной секунды), то есть в реальности заявка хотя бы частично исполнилась бы.
Вопрос: как работает механизм срабатывания лимитных заявок при тестировании? Используется ли для этого стакан, если да то зачем?
Комментарии (18)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
См. EmulationTrader.DepthGenerator.
Логи, логи. EmulationTrader.QuotesChanged, NewTrades + все у IMarketEmulator. И еще, смотрите в сторону StrategyDebug.
В реальной жизни заявки матчатся по стакану. У нас так же, как в реальной.
Пока собирал логи, нашел периодически встречающийся следующий эксепшн:
2012.01.09 10:35:30.000 000 NewTrades: 140525 1 2012.01.09 10:35:30.000 000 System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в StockSharp.Algo.Strategies.StrategyRuleHelper.#=qwwb5sjTFCSYY36SuN9QWTYB7Lgdy4EftEZ_XYHIAT4mGvhvBPJDGDqe9ADgidA2G(Trade #=qy06s32P9O9PbttmuPScYjg==) в StockSharp.Algo.Strategies.StrategyRuleHelper.#=qNe3GlOKvjy3aMjgua5KOktxGfUMUCcF7SgAtK9Cmiho=.#=qP3EEOI4cS42t0Sl7gtRt9rP_nsM4GGyuPsyd6LPWjNcnAUV8kssggFSsKncIwmRn(Trade #=qW38wKwVgj$50bqVX0EcIWQ==) в StockSharp.Algo.Strategies.StrategyRuleHelper.#=qzZbrZ99m7MsM4pOQ8Y4getMCXK5BBKc0EEhualiJ528=.#=qnpYooQAAl5y_NkrPd3iqQw==(IEnumerable
1 #=qXZRO2w$M9FDwDFHJksbB7g==) в StockSharp.Algo.Strategies.StrategyRuleHelper.#=qzZbrZ99m7MsM4pOQ8Y4getMCXK5BBKc0EEhualiJ528=.#=q134gZnoHxL6PQ5rr995IKxXd5WXzNLhY2uNHaxIRUUA=(IEnumerable1 #=qNhyXP53eaaxj6iwPmnxdSg==) в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke[T](Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=q3yxBYAKB2jwHgckGME1CYSGRnwE4x6hmxsPooqDrwZs=.#=qADF07DFOGym8NmKlstV2XA==(IEnumerable`1 #=q2IDDShcMPXIxS0ie3v68jA==)Вот случай когда заявка не сработала
И вот случай когда заявка сработала
Нашел, эксепшн вызвают правила следующего рода:
В чем может быть проблема?
Security.LastTrade == null в момент срабатывания правила
Думаю что второе. Посмотрите SecuritiesChanged отдельно. Заполняется ли там LastTrade. И что за правило?
Увидел правило. Так это же лимитка. На его момент создания нужно чтобы LastTrade был не null.
Нашел причину данной ошибки и проблемы в целом. Я использовал единый static Storage на всю программу (не только для тестирования). Создание отдельного экземпляра для тестирования по какой-то причине решило эту проблему.
Не понял как было и на что исправили.
Было так:
Исправил на так:
Сам честно говоря не понимаю причину ошибки, почему нельзя было ссылаться на одно хранилище.
В демо-приложении SampleHistoryTesting расхождения, разные значения получаются без изменения параметров и кода.
Используются данные из RIU9@RTS.zip.
версия stock# - 4.019
Ничего не понял.
Нажимаем кнопку "Старт" и после окончания работы программы, получаем одно значение net profit. Нажимаем еще раз кнопку "Старт", и получаем уже другое значение net profit. Такого не должно быть, если исторические данные идентичны.
Такого не должно быть, если чисто на исторических данных. Пример использует не только исторические данные.
Вы хотите сказать, что пример из архива StockSharp_4.0.19.zip (уже скомпилированный) что-то еще использует? Странно, я по коду посмотрел - там пересечение SMA вроде только.