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

Возможно ли тестировать только по сохраненным свечкам и без истории сделок?
Atom
4/7/2013
gramp


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




Thanks:


1 2 3  >
akoz

Avatar
Date: 4/7/2013
Reply


Если Вы свечки строите из тиков из стандартного StorageRegistry через построитель свечек TimeFrameCandleBuilder, т.е. как в документации [url=http://stocksharp.com/doc/?topic=html/f71010d3-135c-4fe9-a573-abf0245b3f5d.htm]тут[/url].

То вместо источника в виде построителя свечек TimeFrameCandleBuilder укажите источник готовых свечек StorageCandleSource, т.е вместо: [code=csharp] var cbs = new TradeStorageCandleBuilderSource ; _candleManager.Sources.OfType().Single().Sources.Add(cbs); [/code] сделайте источником: [code=csharp] _candleManager.Sources.Add(new StorageCandleSource ); [/code]

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

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

Thanks: gramp Ramil

Ramil

Avatar
Date: 4/15/2013
Reply


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

Thanks:

esper

Avatar
Date: 4/16/2013
Reply


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

Thanks:

Ramil

Avatar
Date: 4/17/2013
Reply


[quote=esper;25345]Можете выложить минимальное приложение и свечки?[/quote]

В общем я выяснил в какой момент тестирование останавливается само. Таймфрейм 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); } }

Thanks:

Mikhail Sukhov

Avatar
Date: 4/17/2013
Reply


[quote=Ramil;25399] В общем я выяснил в какой момент тестирование останавливается само.[/quote]

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

Thanks:

Ramil

Avatar
Date: 4/18/2013
Reply


[quote=Mikhail Sukhov;25400][quote=Ramil;25399] В общем я выяснил в какой момент тестирование останавливается само.[/quote]

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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 4/18/2013
Reply


[quote=Ramil;25424][quote=Mikhail Sukhov;25400][quote=Ramil;25399] В общем я выяснил в какой момент тестирование останавливается само.[/quote]

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

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

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

Thanks:

Ramil

Avatar
Date: 4/19/2013
Reply


[quote=Mikhail Sukhov;25426][quote=Ramil;25424][quote=Mikhail Sukhov;25400][quote=Ramil;25399] В общем я выяснил в какой момент тестирование останавливается само.[/quote]

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

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

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

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

    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);
Thanks:

Mikhail Sukhov

Avatar
Date: 4/22/2013
Reply


[quote=Ramil;25455] Вот кусок кода, который запускает тестирование: [/quote]

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

Thanks:

Ramil

Avatar
Date: 4/22/2013
Reply


[quote=Mikhail Sukhov;25494][quote=Ramil;25455] Вот кусок кода, который запускает тестирование: [/quote]

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

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

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

Thanks:
1 2 3  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy