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