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


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


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



Спасибо:




1 2 3  >
akoz

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


Если Вы свечки строите из тиков из стандартного 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

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


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

esper

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


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

Ramil

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


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

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


Ramil Перейти

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


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

Ramil

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


Mikhail Sukhov Перейти
Ramil Перейти

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


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


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

Mikhail Sukhov

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


Ramil Перейти
Mikhail Sukhov Перейти
Ramil Перейти

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


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


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


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

Ramil

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


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

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


Ramil Перейти

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


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

Ramil

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


Mikhail Sukhov Перейти
Ramil Перейти

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


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


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

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

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

loading
clippy