Расхождения в результатах тестирования
Atom Ответить
31.01.2012


S# 4.0.17
Сделки реальные, стаканы - генерируются.

Стратегия осуществляет вход лимитными заявками. Проблема в том что если запускать тестирование с одинаковыми параметрами несколько раз, результаты расходятся в некоторых местах. Если копнуть глубже - при одном прогоне стратегия может зайти там, где не зашла в другом прогоне, хотя заявку выставляла точно на тот же объем и по той же цене.

Если посмотреть все сделки, цена ходила ЗА данную лимитную заявку (но в пределах одной секунды), то есть в реальности заявка хотя бы частично исполнилась бы.

Вопрос: как работает механизм срабатывания лимитных заявок при тестировании? Используется ли для этого стакан, если да то зачем?



Спасибо:




18 Ответов
Mikhail Sukhov

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


Supervisor Перейти
S# 4.0.17
Сделки реальные, стаканы - генерируются.

Стратегия осуществляет вход лимитными заявками. Проблема в том что если запускать тестирование с одинаковыми параметрами несколько раз, результаты расходятся в некоторых местах. Если копнуть глубже - при одном прогоне стратегия может зайти там, где не зашла в другом прогоне, хотя заявку выставляла точно на тот же объем и по той же цене.


См. EmulationTrader.DepthGenerator.

Supervisor Перейти

Если посмотреть все сделки, цена ходила ЗА данную лимитную заявку (но в пределах одной секунды), то есть в реальности заявка хотя бы частично исполнилась бы.


Логи, логи. EmulationTrader.QuotesChanged, NewTrades + все у IMarketEmulator. И еще, смотрите в сторону StrategyDebug.

Supervisor Перейти

Вопрос: как работает механизм срабатывания лимитных заявок при тестировании? Используется ли для этого стакан, если да то зачем?


В реальной жизни заявки матчатся по стакану. У нас так же, как в реальной.
Спасибо:

Supervisor

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


Пока собирал логи, нашел периодически встречающийся следующий эксепшн:
Код

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=(IEnumerable`1 #=qNhyXP53eaaxj6iwPmnxdSg==)
в System.Action`1.Invoke(T obj)
в Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=q3yxBYAKB2jwHgckGME1CYSGRnwE4x6hmxsPooqDrwZs=.#=qADF07DFOGym8NmKlstV2XA==(IEnumerable`1 #=q2IDDShcMPXIxS0ie3v68jA==)
Автор топика
Спасибо:

Supervisor

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


Вот случай когда заявка не сработала
Код

// Выставление заявки на открытии бара
2012.01.09 12:14:00.000 000 NewTrades:
141740 2
2012.01.09 12:14:00.990 000 QuotesChanged:
Бид 141635 57
Бид 141640 30
Бид 141650 6
Бид 141655 83
Бид 141665 4
Бид 141670 13
Бид 141680 65
Бид 141690 31
Бид 141700 44
Бид 141710 56
Оффер 141715 73
Оффер 141725 89
Оффер 141730 38
Оффер 141735 76
Оффер 141745 9
Оффер 141750 42
Оффер 141755 89
Оффер 141760 85
Оффер 141770 19
Оффер 141775 74
2012.01.09 12:14:01.000 000 NewTrades:
141720 1
141720 1
141715 1
141710 1
2012.01.09 12:14:01.990 000 NewOrders:
LimitSell 3 141885 Active

...

// Секунда когда заявка должна сработать
2012.01.09 12:14:59.000 000 NewTrades:
141810 2
141810 1
141820 3
141825 1
141835 3
141840 1
141840 1
141840 1
141845 1
141845 4
141845 2
141850 1
141850 1
141850 1
141850 1
141850 1
141850 3
141855 1
141855 2
141855 1
141855 2
141855 1
141855 2
141860 25
141860 1
141860 10
141860 5
141865 1
141865 3
141870 9
141870 9
141875 1
141875 1
141875 1
141880 9
141880 5
141880 1
141880 3
141885 1
141885 4
141885 2
141885 1
141885 1
141885 1
141890 5
141890 5
141890 1
141895 7
141880 2
141855 1
141855 1
141855 3
141855 2
141855 3
141860 6
141860 1
141865 2
141865 1
141875 3
141875 6
141880 3
141880 2
141855 1
141880 1
141855 2
141855 1
2012.01.09 12:14:59.990 000 QuotesChanged:
Бид 141785 2
Бид 141795 99
Бид 141800 1
Бид 141810 52
Бид 141820 22
Бид 141830 77
Бид 141840 34
Бид 141845 49
Бид 141855 22
Бид 141860 69
Оффер 141865 37
Оффер 141870 25
Оффер 141875 99
Оффер 141885 82
Оффер 141895 94
Оффер 141905 11
Оффер 141915 13
Оффер 141925 49
Оффер 141930 63
Оффер 141935 58


И вот случай когда заявка сработала
Код

// Выставление заявки на открытии бара
2012.01.09 12:14:00.000 000 NewTrades:
141740 2
2012.01.09 12:14:00.990 000 QuotesChanged:
Бид 141645 53
Бид 141650 77
Бид 141655 61
Бид 141660 28
Бид 141670 24
Бид 141675 41
Бид 141685 50
Бид 141695 7
Бид 141705 74
Бид 141710 56
Оффер 141715 77
Оффер 141725 34
Оффер 141730 21
Оффер 141735 70
Оффер 141745 20
Оффер 141750 7
Оффер 141755 70
Оффер 141760 33
Оффер 141765 61
Оффер 141775 100
2012.01.09 12:14:01.000 000 NewTrades:
141720 1
141720 1
141715 1
141710 1
2012.01.09 12:14:01.990 000 NewOrders:
LimitSell 3 141885 Active

...

// Секунда когда заявка должна сработать, и срабатывает
2012.01.09 12:14:59.000 000 NewMyTrades:
141890 3
2012.01.09 12:14:59.000 000 OrdersChanged:
LimitSell 3 141885 Done
2012.01.09 12:14:59.000 000 NewTrades:
141810 2
141810 1
141820 3
141825 1
141835 3
141840 1
141840 1
141840 1
141845 1
141845 4
141845 2
141850 1
141850 1
141850 1
141850 1
141850 1
141850 3
141855 1
141855 2
141855 1
141855 2
141855 1
141855 2
141860 25
141860 1
141860 10
141860 5
141865 1
141865 3
141870 9
141870 9
141875 1
141875 1
141875 1
141880 9
141880 5
141880 1
141880 3
141885 1
141885 4
141885 2
141885 1
141885 1
141885 1
141890 5
141890 5
141890 1
141895 7
141880 2
141855 1
141855 1
141855 3
141855 2
141855 3
141860 6
141860 1
141865 2
141865 1
141875 3
141875 6
141880 3
141880 2
141855 1
141880 1
141855 2
141855 1
// Этот самый эксепшн
2012.01.09 12:14:59.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=(IEnumerable`1 #=qNhyXP53eaaxj6iwPmnxdSg==)
в System.Action`1.Invoke(T obj)
в Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=q3yxBYAKB2jwHgckGME1CYSGRnwE4x6hmxsPooqDrwZs=.#=qADF07DFOGym8NmKlstV2XA==(IEnumerable`1 #=q2IDDShcMPXIxS0ie3v68jA==)
// Выставляются профиты
2012.01.09 12:14:59.990 000 NewOrders:
LimitBuy 1 141800 Active
2012.01.09 12:14:59.990 000 NewOrders:
LimitBuy 1 141790 Active
2012.01.09 12:14:59.990 000 NewOrders:
LimitBuy 1 141780 Active
2012.01.09 12:14:59.990 000 QuotesChanged:
Бид 141805 86
Бид 141810 11
Бид 141815 26
Бид 141820 73
Бид 141825 13
Бид 141835 17
Бид 141840 35
Бид 141845 27
Бид 141855 8
Бид 141860 84
Оффер 141865 36
Оффер 141870 9
Оффер 141875 6
Оффер 141885 45
Оффер 141895 16
Оффер 141900 78
Оффер 141910 14
Оффер 141920 36
Оффер 141925 92
Оффер 141935 100
Автор топика
Спасибо:

Alexander

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


Supervisor Перейти
Пока собирал логи, нашел периодически встречающийся следующий эксепшн:
Код

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=(IEnumerable`1 #=qNhyXP53eaaxj6iwPmnxdSg==)
в System.Action`1.Invoke(T obj)
в Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=q3yxBYAKB2jwHgckGME1CYSGRnwE4x6hmxsPooqDrwZs=.#=qADF07DFOGym8NmKlstV2XA==(IEnumerable`1 #=q2IDDShcMPXIxS0ie3v68jA==)



Похоже что Security.LastTrade == null у вас.
Спасибо:

Supervisor

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


Нашел, эксепшн вызвают правила следующего рода:
Код

this
	.When(Security.LastTradePriceLess(new Unit(_enterPrice, UnitTypes.Limit)))
	.Do(Enter)


В чем может быть проблема?
Автор топика
Спасибо:

Alexander

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


Security.LastTrade == null в момент срабатывания правила
Спасибо:

Supervisor

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


Alexander Mukhanchikov Перейти
Security.LastTrade == null в момент срабатывания правила

Ну а в чем причина null? Такие правила стратегий нельзя использовать на тестировании? Или я как-то неправильно настроил и запустил тестирование?
Автор топика
Спасибо:

Mikhail Sukhov

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


Supervisor Перейти
Или я как-то неправильно настроил и запустил тестирование?


Думаю что второе. Посмотрите SecuritiesChanged отдельно. Заполняется ли там LastTrade. И что за правило?
Спасибо:

Mikhail Sukhov

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


Mikhail Sukhov Перейти
Supervisor Перейти
Или я как-то неправильно настроил и запустил тестирование?


Думаю что второе. Посмотрите SecuritiesChanged отдельно. Заполняется ли там LastTrade. И что за правило?


Увидел правило. Так это же лимитка. На его момент создания нужно чтобы LastTrade был не null.
Спасибо:

Supervisor

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


Нашел причину данной ошибки и проблемы в целом.
Я использовал единый static Storage на всю программу (не только для тестирования).
Создание отдельного экземпляра для тестирования по какой-то причине решило эту проблему.
Автор топика
Спасибо:

Mikhail Sukhov

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


Supervisor Перейти
Нашел причину данной ошибки и проблемы в целом.
Я использовал единый static Storage на всю программу (не только для тестирования).
Создание отдельного экземпляра для тестирования по какой-то причине решило эту проблему.


Не понял как было и на что исправили.
Спасибо:

Supervisor

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


Было так:
Код

public static class Core
{
   ...
   public static TradingStorage Storage { get; private set; }

   static Core()
   {
      ...

      // Это хранилище использовал не только для тестирования, но параллельно и для сохранения поступающих свечей например
      Storage = new TradingStorage(new FileStorage("History")) 
      { 
         BasePath = "History" 
      };
   }
}


public static class Emulator
{
   public static void StartEmulation()
   {
      ...
      Trader = new EmulationTrader(new[] { Security }, new[] { Portfolio })
      {
         ...
         Storage = Core.Storage,
      };
   }
}


Исправил на так:
Код

public static class Emulator
{
   public static void StartEmulation()
   {
      ...
      Trader = new EmulationTrader(new[] { Security }, new[] { Portfolio })
      {
         ...
         Storage = new TradingStorage(new InMemoryStorage()) { BasePath = Core.Storage.BasePath },
      };
   }
}


Сам честно говоря не понимаю причину ошибки, почему нельзя было ссылаться на одно хранилище.
Автор топика
Спасибо:

zorran

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


В демо-приложении SampleHistoryTesting расхождения, разные значения получаются без изменения параметров и кода.

Используются данные из RIU9@RTS.zip.

версия stock# - 4.019
Спасибо:

Mikhail Sukhov

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


zorran Перейти
В демо-приложении SampleHistoryTesting расхождения, разные значения получаются без изменения параметров и кода.


Ничего не понял.
Спасибо:

zorran

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


Нажимаем кнопку "Старт" и после окончания работы программы, получаем одно значение net profit.
Нажимаем еще раз кнопку "Старт", и получаем уже другое значение net profit.
Такого не должно быть, если исторические данные идентичны.
Спасибо:

Mikhail Sukhov

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


zorran Перейти
Нажимаем кнопку "Старт" и после окончания работы программы, получаем одно значение net profit.
Нажимаем еще раз кнопку "Старт", и получаем уже другое значение net profit.
Такого не должно быть, если исторические данные идентичны.


Такого не должно быть, если чисто на исторических данных. Пример использует не только исторические данные.
Спасибо:

zorran

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


Вы хотите сказать, что пример из архива StockSharp_4.0.19.zip (уже скомпилированный) что-то еще использует?
Странно, я по коду посмотрел - там пересечение SMA вроде только.
Спасибо:

Supervisor

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


zorran Перейти
Вы хотите сказать, что пример из архива StockSharp_4.0.19.zip (уже скомпилированный) что-то еще использует?
Странно, я по коду посмотрел - там пересечение SMA вроде только.

Насколько помню, там используется случайная генерация стаканов. Отсюда и расхождения
Автор топика
Спасибо:


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

loading
clippy