Hi,
I found that if sellside strategy emits events (i.e. bar), buyside strategy will not receive them in backtest mode. If it is true, how to implement backtesting with history bar data for synthetic instrument from sellside strategy?
Example codes:
It is to subscribe a synthetic instrument with ID = 261, which has only one leg.
It is shown in console that sellSideBar has been emit but buyside does not receive them.
Code:
using System;
using SmartQuant;
namespace OpenQuant
{
public partial class MyScenario : Scenario
{
public MyScenario(Framework framework)
: base(framework)
{
}
public override void Run()
{
strategy = new Strategy(framework, "meta");
BarFactory.Clear();
Instrument instrument1 = InstrumentManager.GetById(261);
Strategy buyside = new MyBuySideStrategy(framework, "MyBuySideStrategy");
strategy.AddStrategy(buyside);
buyside.Instruments.Add(instrument1);
MySellSideStrategy sellSideStrategy = new MySellSideStrategy(framework, "MySellSideStrategy");
strategy.AddStrategy(sellSideStrategy);
buyside.ExecutionProvider = sellSideStrategy;
buyside.DataProvider = sellSideStrategy;
//buyside.DataSimulator = sellSideStrategy;
instrument1.ExecutionProvider = sellSideStrategy;
instrument1.DataProvider = sellSideStrategy;
BarFactory.Add(instrument1, BarType.Time, 86400);
IHistoricalDataProvider historyProvider = ProviderManager.GetHistoricalDataProvider(60);
BarSeries dailySeries = DataManager.GetHistoricalBars(historyProvider, instrument1.Legs[0].Instrument, DateTime.Now.Date.AddDays(-30), DateTime.Now.Date, BarType.Time, 86400);
BarFactory.Add(instrument1.Legs[0].Instrument, BarType.Time, 86400);
sellSideStrategy.AddInstrument(instrument1.Legs[0].Instrument);
DataSimulator.Series.Add(dailySeries);
Console.WriteLine("Data simulator add {0} daily series count = {1}, {2}-{3}", instrument1.Legs[0].Instrument.Symbol, dailySeries.Count, dailySeries.FirstDateTime, dailySeries.LastDateTime);
buyside.AddInstrument(instrument1);
BarFactory.Add(instrument1, BarType.Time, 86400);
DataSimulator.SubscribeAll = false;
ExecutionSimulator.FillOnBar = true;
Console.WriteLine("Start");
StartBacktest();
}
}
}
Code:
using System;
using SmartQuant;
namespace OpenQuant
{
public class MySellSideStrategy : SellSideInstrumentStrategy
{
private Instrument sellSideInstrument;
public MySellSideStrategy(Framework framework, string name)
: base(framework, name)
{
}
protected override void OnSubscribe(Instrument instrument)
{
Console.WriteLine("OnSubscribe {0}", instrument.Symbol);
sellSideInstrument = instrument;
foreach (Leg leg in instrument.Legs)
{
Console.WriteLine("Add daily bar {0}", leg.Instrument.Symbol);
BarFactory.Add(leg.Instrument, BarType.Time, 86400);
Console.WriteLine("Add instrument {0}", leg.Instrument.Symbol);
AddInstrument(leg.Instrument);
}
}
protected override void OnBar(Instrument instrument, Bar bar)
{
Bar sellSideBar = new Bar(bar.DateTime, bar.CloseDateTime, 261, bar.Type, bar.Size, bar.Open, bar.High, bar.Low, bar.Close, bar.Volume);
Console.WriteLine("EmitBar {0}", sellSideBar);
EmitBar(sellSideBar);
}
}
}
Code:
using System;
using SmartQuant;
namespace OpenQuant
{
public class MyBuySideStrategy : InstrumentStrategy
{
public MyBuySideStrategy(Framework framework, string name)
: base(framework, name)
{
}
protected override void OnStrategyStart()
{
Group("Bars", "Pad", 0);
}
protected override void OnBar(Instrument instrument, Bar bar)
{
Console.WriteLine("OnBar {0}", bar);
Log(bar, "Bars");
}
}
}