Собственно, хотелось бы понять причину рваных графиков - резких скачков на графике при отсутствии больших позиций по инструменту. Судите сами по скринам - RIH4_SampleSMA1.jpg, RIH4_MyStrategy1.jpg, RIH4_MyStrategy2.jpg, RIH4_MyStrategy4.jpg.
Код трендгенератора для SampleSMA (того примера, что выложил в вопросе про бесконечное перевыставление заявки):
((MessageAdapter)connector.MarketDataAdapter).MarketTimeChangedInterval = TimeSpan.FromMilliseconds(5);//timeFrame;
((ILogSource)connector).LogLevel = DebugLogCheckBox.IsChecked == true ? LogLevels.Debug : LogLevels.Info;
logManager.Sources.Add(connector);
connector.NewSecurities += securities =>
{
//подписываемся на получение данных после получения инструмента
if (securities.All(s => s != security))
return;
// // если история по стаканам отсутствует, но стаканы необходимы для стратегии,
// то их можно сгенерировать на основании цен последних сделок или свечек.
connector.RegisterMarketDepth(new TrendMarketDepthGenerator(connector.GetSecurityId(security))
{
Interval = TimeSpan.FromMilliseconds(5), //TimeSpan.FromSeconds(1), // стакан для инструмента в истории обновляется раз в секунду
MaxAsksDepth = 1,
MaxBidsDepth = 1,
UseTradeVolume = true,
MaxVolume = 1,
MinSpreadStepCount = 2, // минимальный генерируемый спред - 2 минимальных шага цены
MaxSpreadStepCount = 5, // не генерировать спрэд между лучшим бид и аск больше чем 5 минимальных шагов цены - нужно чтобы при генерации из свечей не получалось слишком широкого спреда.
});
}
Код из моего тестера (я уже шаманил с параметрами по-всякому):
((MessageAdapter)trader.MarketDataAdapter).MarketTimeChangedInterval = TimeSpan.FromMilliseconds(5);
((ILogSource)trader).LogLevel = LogLevels.Info;
logManager.Sources.Add(trader);
trader.RegisterMarketDepth(new TrendMarketDepthGenerator(trader.GetSecurityId(security))
{
Interval = TimeSpan.FromMilliseconds(5),
MaxAsksDepth = 20,
MaxBidsDepth = 20,
UseTradeVolume = true,
MaxVolume = 10,
MinSpreadStepCount = 1,
MaxSpreadStepCount = 1,
GenerateDepthOnEachTrade = true,
MaxGenerations = 1000000,
MinVolume = 5,
RandomArrayLength = 1000000,
});
Дополнительный вопрос - почему стратегия не выходит из позиции, хотя после 18:35 оную я закрываю принудительно кодом:
if ((candle.CloseTime >= candle.CloseTime.Date + new TimeSpan(10, 00, 00) && candle.CloseTime <= candle.CloseTime.Date + new TimeSpan(10, 15, 00)) || (candle.CloseTime >= candle.CloseTime.Date + new TimeSpan(18, 35, 00)))
{
CancelActiveOrders();
SuspendRules();
if (Position != 0)
{
var orderDirection = Position < 0 ? OrderDirections.Buy : OrderDirections.Sell;
var orderPrice = Position < 0 ? Security.BestAsk.Price + Security.MinStepSize * pricePieces : Security.BestBid.Price - Security.MinStepSize * pricePieces;
var newOrder = this.CreateOrder(orderDirection, orderPrice, Math.Abs(Position));
RegisterOrder(newOrder);
}
ResumeRules();
earlierCandle = candle;
return;
}
P.S. Свечи - RencoCandle.
var series = new CandleSeries(typeof(RenkoCandle), security, new Unit(50m));
コメント (8)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
up :-(
Собственно, кажись, аски нормально не генерируются трендгенератором стаканов. Вот код:
var trader = new HistoryEmulationConnector(new[] , new[] ) { StorageRegistry = storageRegistry,
Код, понятно, никто читать не будет😀 Вы лучше начните с симптомов.
Михаил, симптоматика в файле прикреплённом. А именно - не генерируются в стакане аски. Постоянно получаю следующую картину по стакану (варьируется в зависимости от входящих данных по сделкам).
Пояснение - после BestBid, BestAsk идут 2x3 строчки - первые 3 бида и 3 аска в стакане. B пофиг даже на такую разреженность в 90 пунктов каждый, чего по RI наблюдать как-то не доводилось мне, но асков нет совсем!
Будет фикс. Бага появилась в последней версии.
Спасибо!! Жду очень!
Up! Ни у кого ошибка не воспроизводится, генерация стаканов работает корректно?
В ту же кучу - решил посмотреть, что будет, если отключить генерацию стаканов и чисто торговать, эмулируя стопы ручками.
Здесь привожу логирование последней сделки и бест бида и бест оффера.
var trader = new HistoryEmulationConnector(new[] , new[] ) { StorageRegistry = storageRegistry,