← Back

Возможно ли тестировать только по сохраненным свечкам и без истории сделок?

Суть вопроса в следующем - я делаю тесты на скачанной с фтп ртс истории сделок, из которой формируются свечки. Однако необходимость обрабатывать все сделки приводит к тому, что прогон 1 дня происходит за 20-30сек. При этом сложность алгоритма почти не влияет на скорость. Я пробовал на стандартном, немного переделанном, примере, сделав по правилу финиширования 5мин свечи просто записывать в логи ohlc. Однако использование всех сделок для точности тестирования необходимо далеко не всегда. Меня вполне устроило бы прогнать стратегию по заранее сохраненным 5мин свечкам с меньшей точностью, но быстро. Или по часовым свечкам, но еще быстрее. Поэтому вопрос - каким образом можно сделать так, чтобы робот вообще не использовал историю сделок, а прогонял тест только по заранее сгенеренным свечкам? Буду благодарен за совет.

Comments (22)

Login or Create account, Log in or register to leave a comment

akoz
akoz

Если Вы свечки строите из тиков из стандартного StorageRegistry через построитель свечек TimeFrameCandleBuilder, т.е. как в документации тут.

То вместо источника в виде построителя свечек TimeFrameCandleBuilder укажите источник готовых свечек StorageCandleSource, т.е вместо:


var cbs = new TradeStorageCandleBuilderSource { StorageRegistry = storageRegistry };
_candleManager.Sources.OfType<TimeFrameCandleBuilder>().Single().Sources.Add(cbs);

сделайте источником:


_candleManager.Sources.Add(new StorageCandleSource { StorageRegistry = storageRegistry });

Ну, а потом в менеджере свечек стартуете свою серию. Свечки именно такого таймфрейма должны при это быть в хранилище, иначе менеджер их не найдет. У меня по крайней мере работает довольно шустро. Да, длинную историю из тиков собрать нереально.

Только вот жаль не получается свечки сжимать штатными способами, например, из пятиминуток в часы,дни и т.д. Для этого свечи со всеми таймфреймами хранить приходится.

gramp Ramil
Ramil
Ramil

Пробую тестировать стратегию на свечках. Скачал 1,5,15,30 минутные свечи. На всех таймфремах тестирует нормально, а на 30мин. эмулятор останавливается в одном и том же месте, выставляется статус .Stopped = true и дальше до конца не тестирует. С чем это может быть связано?

esper
esper

Можете выложить минимальное приложение и свечки?

Ramil
Ramil

esper: Можете выложить минимальное приложение и свечки?

В общем я выяснил в какой момент тестирование останавливается само. Таймфрейм 30мин, сделка совершается в 23-30, после такой сделки тестирование прерывается. Если сделку перенести на 23-00, то все работает ОК. Я так понимаю что 30мин свечка в 23-30 имеет внутри всего 20мин, так как заканчивается в 23-50, вероятно это связано с этим? Ниже пример кода

// закрываем после 23-30 если не ушли дальше 700 пунктов от стопа if ((candle.OpenTime.Hour == 23) && (candle.OpenTime.Minute >= 30) && (Math.Abs(stop - bars[bar].ClosePrice) < 700)) { if (MarketPosition < 0) { Buy(candle.OpenTime, candle.ClosePrice, "Close 23-30"); this.AddInfoLog("{0} Close 23-30 (buy). {1}", candle.OpenTime, candle.ClosePrice); } else if (MarketPosition > 0) { Sell(candle.OpenTime, candle.ClosePrice, "Close 23-30"); this.AddInfoLog("{0} Close 23-30 (sell). {1}", candle.OpenTime, candle.ClosePrice); } }

Mikhail Sukhov
Mikhail Sukhov

Ramil: В общем я выяснил в какой момент тестирование останавливается само.

Останавливается тестирование - это как определяется? Визуально, по логам, или еще как-то?

Ramil
Ramil

Mikhail Sukhov:

Ramil: В общем я выяснил в какой момент тестирование останавливается само.

Останавливается тестирование - это как определяется? Визуально, по логам, или еще как-то?

Статус у EmulationTrader выставляется .Stopped = true, ну и соответственно стратегия останавливается, если в выше приведенном коде поменять 23-30 на 23-00, то как я уже говорил все работает нормально. Единственное еще прыбыль по сделкам я так понимаю это .PnL, почему-то считается некорректно если тестирование на свечках

Mikhail Sukhov
Mikhail Sukhov

Ramil:

Mikhail Sukhov:

Ramil: В общем я выяснил в какой момент тестирование останавливается само.

Останавливается тестирование - это как определяется? Визуально, по логам, или еще как-то?

Статус у EmulationTrader выставляется .Stopped = true, ну и соответственно стратегия останавливается, если в выше приведенном коде поменять 23-30 на 23-00, то как я уже говорил все работает нормально. Единственное еще прыбыль по сделкам я так понимаю это .PnL, почему-то считается некорректно если тестирование на свечках

Мы сейчас говорим о примере SampleHistoryTesting?

Ramil
Ramil

Mikhail Sukhov:

Ramil:

Mikhail Sukhov:

Ramil: В общем я выяснил в какой момент тестирование останавливается само.

Останавливается тестирование - это как определяется? Визуально, по логам, или еще как-то?

Статус у EmulationTrader выставляется .Stopped = true, ну и соответственно стратегия останавливается, если в выше приведенном коде поменять 23-30 на 23-00, то как я уже говорил все работает нормально. Единственное еще прыбыль по сделкам я так понимаю это .PnL, почему-то считается некорректно если тестирование на свечках

Мы сейчас говорим о примере SampleHistoryTesting?

Вот кусок кода, который запускает тестирование:

    private void btnTest_Click(object sender, RoutedEventArgs e)
    {
        HistoryPath.Text = "C:\\stocksharp_4.1.9\\historydata\\R";
        if (HistoryPath.Text.IsEmpty() || !Directory.Exists(HistoryPath.Text))
        {
            MessageBox.Show(this, "Неправильный путь.");
            return;
        }

        var security = new Security
        {
            Id = "RIH3@RTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
            Code = "RIH3",
            Name = "RTS-3.12",
            MinStepSize = 10,
            MinStepPrice = 2,
            ExchangeBoard = ExchangeBoard.Forts,
        };

        // тестовый портфель
        var portfolio = new Portfolio { Name = "test account", BeginValue = 1000000m };

        // хранилище, через которое будет производиться доступ к тиковой и котировочной базе
        var storageRegistry = new StorageRegistry();

        // изменяем путь, используемый по умолчанию
        ((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = HistoryPath.Text;

        var timeFrame = TimeSpan.FromMinutes(30);

        var startTime = new DateTime(2012, 12, 15);
        var stopTime = new DateTime(2013, 3, 14);
        // задаем шаг ProgressBar
        var progressStep = ((stopTime - startTime).Ticks / 100).To<TimeSpan>();
        var nextTime = startTime + progressStep;

        _trader = new EmulationTrader(
            new[] { security },
            new[] { portfolio })
        {
            MarketTimeChangedInterval = timeFrame,
            StorageRegistry = storageRegistry,
            UseCandlesTimeFrame = timeFrame,
        };

        _trader.Connect();
        _trader.StartExport();

        var candleManager = new CandleManager(_trader);
        var series = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);
        candleManager.Start(series);


        _strategy = new TurtleSoupStrategy(series)
        {
            Volume = 1,
            Portfolio = portfolio,
            Security = security,
            Trader = _trader
        };

        // копируем параметры на визуальную панель
        ParametersPanel.Parameters.Clear();
        ParametersPanel.Parameters.AddRange(_strategy.StatisticManager.Parameters);

        // и подписываемся на событие изменения времени, чтобы обновить ProgressBar
        _trader.MarketTimeChanged += d =>
        {
            if (_trader.CurrentTime >= nextTime || _trader.CurrentTime >= stopTime)
            {
                nextTime += progressStep;
                this.GuiAsync(() => progressBar1.Value++);
            }
        };

        _strategy.PnLChanged += () =>
        {
            var data = new EquityData
            {
                Time = _strategy.GetMarketTime(),
                Value = _strategy.PnL,
            };

            //this.GuiAsync(() => _curveItems.Add(data));
        };

        _logManager.Sources.Add(_strategy);
        _trader.StateChanged += (oldState, newState) =>
        {
            if (_trader.State == EmulationStates.Stopped)
            {
                this.GuiAsync(() =>
                {
                    StartBtn.IsEnabled = true;

                    if (_trader.IsFinished)
                    {
                        _strategy.Stop();
                        TestingProcess.Value = TestingProcess.Maximum;
                        MessageBox.Show(this, "Закончено за " + (DateTime.Now - _startEmulationTime));
                    }
                    else
                        MessageBox.Show(this, "Отменено");
                });
            }
            else if (_trader.State == EmulationStates.Started)
            {
                // запускаем стратегию когда эмулятор запустился
                _strategy.Start();
            }
        };

        Report.IsEnabled = true;
        _startEmulationTime = DateTime.Now;
        _trader.Start(startTime, stopTime);
Mikhail Sukhov
Mikhail Sukhov

Ramil: Вот кусок кода, который запускает тестирование:

Это пример SampleHistoryTesting? Можно привести только изменения?

Ramil
Ramil

Mikhail Sukhov:

Ramil: Вот кусок кода, который запускает тестирование:

Это пример SampleHistoryTesting? Можно привести только изменения?

Нет это не из примера. Какие изменения? Срабатывает _trader.StateChanged += (oldState, newState) => { if (_trader.State == EmulationStates.Stopped) {

EmulationStates.Stopped выставляется равным true, когда сделка совершается в 23-30 на таймфреме 30мин. По моему я все подробно описал, уже 3й раз пишу одно и тоже. Также .PnL прибыль считается неверно!

Ramil
Ramil

У вас какой-то косяк со свечками, например инструмент RIH3 на 30мин, дата: 27.12.2012, время 18:30 перед закрытием биржи, ваша свечка (составленная из сделок с сайта РТС как я понимаю) некорректна, все цены откр = закр = high = low = 153630 и так все свечки в конце каждого дня любой сессии в 18-30, таймфрейм 30мин.

{18:30:00 TimeFrameCandle_RIH3@RTS_00-30-00 (O:153630,0000000, H:153630,0000000, L:153630,0000000, C:153630,0000000, V:8474)}

esper
esper

Ramil: У вас какой-то косяк со свечками, например инструмент RIH3 на 30мин, дата: 27.12.2012, время 18:30 перед закрытием биржи, ваша свечка (составленная из сделок с сайта РТС как я понимаю) некорректна, все цены отр, закр high low = 153630.

{18:30:00 TimeFrameCandle_RIH3@RTS_00-30-00 (O:153630,0000000, H:153630,0000000, L:153630,0000000, C:153630,0000000, V:8474)} Свечки качали вы, поэтому они скорее ваши. Еще неделю назад попросил выложить минимальное приложение и исходные данные, чтобы посмотреть в чем дело, но никакого проекта и тем более данных так и не увидел, только обрывистые куски кода.

Ramil
Ramil

esper:

Ramil: У вас какой-то косяк со свечками, например инструмент RIH3 на 30мин, дата: 27.12.2012, время 18:30 перед закрытием биржи, ваша свечка (составленная из сделок с сайта РТС как я понимаю) некорректна, все цены отр, закр high low = 153630.

{18:30:00 TimeFrameCandle_RIH3@RTS_00-30-00 (O:153630,0000000, H:153630,0000000, L:153630,0000000, C:153630,0000000, V:8474)} Свечки качали вы, поэтому они скорее ваши. Еще неделю назад попросил выложить минимальное приложение и исходные данные, чтобы посмотреть в чем дело, но никакого проекта и тем более данных так и не увидел, только обрывистые куски кода.

  1. Я так понимаю вы не хотите делать вашу библиотеку лучше? Свечки качал я с помощью вашего приложения Hydra! и последняя 30мин свечка в конце дневной торговой сессии у вас строится неправильно, вам скинуть скачанные свечки?

  2. Вы мне написали 1 день назад "Это пример SampleHistoryTesting? Можно привести только изменения?". Я вам привел изменения. Сейчас вы меня просите скинуть вам минимальное приложение. В чем проблема, проверить сделки в 23-30 на таймфрейме 30мин и убедится что у вам косяк!!!

Mikhail Sukhov
Mikhail Sukhov

Ramil:

  1. Я так понимаю вы не хотите делать вашу библиотеку лучше? Свечки качал я с помощью вашего приложения Hydra! и последняя 30мин свечка в конце дневной торговой сессии у вас строится неправильно, вам скинуть скачанные свечки?

Вы свечки готовые качаете, или их строите из тиков? Пожалуйста, точнее формулируйте мысль. Из-за этого процесс поиска ошибок затрудняется. Например, в начале вы писали что тестирование останавливается (99% ошибка в вашей коде, но пока сложно показать где), а теперь пишите, что свечка неправильная. Вот и играем в угадайду несколько дней.

Ramil
Ramil

Mikhail Sukhov:

Ramil:

  1. Я так понимаю вы не хотите делать вашу библиотеку лучше? Свечки качал я с помощью вашего приложения Hydra! и последняя 30мин свечка в конце дневной торговой сессии у вас строится неправильно, вам скинуть скачанные свечки?

Вы свечки готовые качаете, или их строите из тиков? Пожалуйста, точнее формулируйте мысль. Из-за этого процесс поиска ошибок затрудняется. Например, в начале вы писали что тестирование останавливается (99% ошибка в вашей коде, но пока сложно показать где), а теперь пишите, что свечка неправильная. Вот и играем в угадайду несколько дней.

Похоже что ошибка как раз возможна из за неправильных свечек. Я их качаю из гидры с сервера РТС указываю 30мин и ваша программа сама качает, кроме того у вас там еще и неправильное округление, вот специально вывел все свечки в 18-30 в лог

TSS_RIM3@RTS_test account|Стратегия запущена. [0,-1]. Позиция при старте 0.
TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:149440,0000000, H:149440,0000000, L:149440,0000000, C:149440,0000000, V:7420)
TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:144720,0000000, H:144720,0000000, L:144720,0000000, C:144720,0000000, V:13794) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:143680,0000000, H:143680,0000000, L:143676,0000000, C:143676,0000000, V:49900) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:144050,0000000, H:144050,0000000, L:144050,0000000, C:144050,0000000, V:29340) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:143710,0000000, H:143710,0000000, L:143710,0000000, C:143710,0000000, V:12812) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:142590,0000000, H:142590,0000000, L:142590,0000000, C:142590,0000000, V:14768) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:141940,0000000, H:141940,0000000, L:141936,0000000, C:141936,0000000, V:49194) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:140330,0000000, H:140330,0000000, L:140330,0000000, C:140330,0000000, V:19490) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:140080,0000000, H:140080,0000000, L:140080,0000000, C:140080,0000000, V:26080) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:140750,0000000, H:140750,0000000, L:140750,0000000, C:140750,0000000, V:13562) TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:141230,0000000, H:141230,0000000, L:141230,0000000, C:141230,0000000, V:7738)
TSS_RIM3@RTS_test account|Стратегия останавливается. [0,-1]. Позиция при старте 0.
TSS_RIM3@RTS_test account|Ожидание снятия всех активных заявок.
TSS_RIM3@RTS_test account|Стратегия остановлена. [0,-1]. Позиция при старте 0.

И посмотрите на значение L:141936,0000000, как оно может быть не кратным 10??? L:143676,0000000

Ramil
Ramil

Вот лог с датами 2013/03/14 22:00:00.000| |TSS_RIM3@RTS_test account|Стратегия запущена. [0,-1]. Позиция при старте 0. 2013/03/15 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:149440,0000000, H:149440,0000000, L:149440,0000000, C:149440,0000000, V:7420) 2013/03/18 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:144720,0000000, H:144720,0000000, L:144720,0000000, C:144720,0000000, V:13794) 2013/03/19 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:143680,0000000, H:143680,0000000, L:143676,0000000, C:143676,0000000, V:49900) 2013/03/20 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:144050,0000000, H:144050,0000000, L:144050,0000000, C:144050,0000000, V:29340) 2013/03/21 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:143710,0000000, H:143710,0000000, L:143710,0000000, C:143710,0000000, V:12812) 2013/03/22 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:142590,0000000, H:142590,0000000, L:142590,0000000, C:142590,0000000, V:14768) 2013/03/25 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:141940,0000000, H:141940,0000000, L:141936,0000000, C:141936,0000000, V:49194) 2013/03/26 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:140330,0000000, H:140330,0000000, L:140330,0000000, C:140330,0000000, V:19490) 2013/03/27 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:140080,0000000, H:140080,0000000, L:140080,0000000, C:140080,0000000, V:26080) 2013/03/28 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:140750,0000000, H:140750,0000000, L:140750,0000000, C:140750,0000000, V:13562) 2013/03/29 17:00:00.000| |TSS_RIM3@RTS_test account|18:30:00 TimeFrameCandle_RIM3@RTS_00-30-00 (O:141230,0000000, H:141230,0000000, L:141230,0000000, C:141230,0000000, V:7738) 2013/03/29 08:00:00.000| |TSS_RIM3@RTS_test account|Стратегия останавливается. [0,-1]. Позиция при старте 0. 2013/03/29 08:00:00.000| |TSS_RIM3@RTS_test account|Ожидание снятия всех активных заявок. 2013/03/29 08:00:00.000| |TSS_RIM3@RTS_test account|Стратегия остановлена. [0,-1]. Позиция при старте 0.

Mikhail Sukhov
Mikhail Sukhov

Ramil: Похоже что ошибка как раз возможна из за неправильных свечек. Я их качаю из гидры с сервера РТС указываю 30мин и ваша программа сама качает

Это конечно же мистика. Дело в том, что сервер РТС не хранит свечки. Поэтому скачать с него свечки невозможно. Конечно, Гидра крута, но не настолько.😂

Ramil
Ramil

Mikhail Sukhov:

Ramil: Похоже что ошибка как раз возможна из за неправильных свечек. Я их качаю из гидры с сервера РТС указываю 30мин и ваша программа сама качает

Это конечно же мистика. Дело в том, что сервер РТС не хранит свечки. Поэтому скачать с него свечки невозможно. Конечно, Гидра крута, но не настолько.😂

откуда взялись такие свечки в конце торговой сессии? разве не гидра строит свечки по сделкам?

Ramil
Ramil

Вот приложение и свечки, стратегия совершает сделки в 23-30 и сразу останавливается по неизведанным причинам. Вероятно это также мистика Стокшарпа, только уж очень много ценного времени уходит на поиск таких мистических ошибок!

esper
esper

В следующей версии будет фикс. Свечки вы качали с Финам-а, а не с РТС-а. После фикса, надо будет в новой гидре перезакачать свечки.

Ramil
Ramil

esper: В следующей версии будет фикс. Свечки вы качали с Финам-а, а не с РТС-а. После фикса, надо будет в новой гидре перезакачать свечки.

а что по поводу сделок в 23-30 и остановки эмулятора?

esper
esper

Ramil: а что по поводу сделок в 23-30 и остановки эмулятора? Эта ошибка из-за неверных входных данных. Если добавить эмулятор как источник логов, то там будет детальное описание причины остановки.