S#

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


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


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



Спасибо:




22 Ответов
akoz

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


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

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

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

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

_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 Go to
Можете выложить минимальное приложение и свечки?


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

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


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

Ramil

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


Mikhail Sukhov Go to
Ramil Go to

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


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


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

Mikhail Sukhov

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


Ramil Go to
Mikhail Sukhov Go to
Ramil Go to

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


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


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


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

Ramil

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


Mikhail Sukhov Go to
Ramil Go to
Mikhail Sukhov Go to
Ramil Go to

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


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


Статус у 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

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


Ramil Go to

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


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

Ramil

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


Mikhail Sukhov Go to
Ramil Go to

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


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


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

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

Ramil

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


У вас какой-то косяк со свечками, например инструмент 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

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


Ramil Go to
У вас какой-то косяк со свечками, например инструмент 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)}


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

Ramil

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


esper Go to
Ramil Go to
У вас какой-то косяк со свечками, например инструмент 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

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


Ramil Go to

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


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

Ramil

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


Mikhail Sukhov Go to
Ramil Go to

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

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


Вот лог с датами
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

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


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


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

Ramil

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


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


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


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

Ramil

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


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

esper

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


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

Ramil

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


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


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

esper

Фотография
Программист
Дата: 23.04.2013
Ответить


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

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


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

loading
clippy