← 戻る

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

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

このトピックは参考になりましたか?

トピックを共有

コメント (22)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

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 и остановки эмулятора? Эта ошибка из-за неверных входных данных. Если добавить эмулятор как источник логов, то там будет детальное описание причины остановки.