| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 153.758% Drawdown 1.600% Expectancy 0 Net Profit 1.284% Sharpe Ratio 4.405 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.706 Beta -0.744 Annual Standard Deviation 0.123 Annual Variance 0.015 Information Ratio 1.753 Tracking Error 0.184 Treynor Ratio -0.73 Total Fees $18.50 |
namespace Test
{
public class TestAlgo : QCAlgorithm
{
public RollingWindow<decimal> BidPrices = new RollingWindow<decimal>(4);
public RollingWindow<decimal> AskPrices = new RollingWindow<decimal>(4);
public RollingWindow<decimal> Volumes = new RollingWindow<decimal>(4);
public override void Initialize()
{
SetStartDate(2019, 09, 01);
SetEndDate(DateTime.Now);
SetCash(1000000);
var futureSP500 = AddFuture(Futures.Indices.SP500EMini);
futureSP500.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182));
var benchmark = AddEquity("SPY");
SetBenchmark(benchmark.Symbol);
}
public override void OnData(Slice slice)
{
if (!Portfolio.Invested)
{
foreach (var chain in slice.FutureChains)
{
// find the front contract expiring no earlier than in 90 days
var contract = (
from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Time.Date.AddDays(90)
select futuresContract
).FirstOrDefault();
// if found, perform logic
if (contract != null)
{
BidPrices.Add(contract.BidPrice);
AskPrices.Add(contract.AskPrice);
Volumes.Add(contract.Volume);
// This check is needed to prevent errors from accessing entries that do not exist
if (!BidPrices.IsReady || !AskPrices.IsReady || !Volumes.IsReady)
continue;
var Long = BidPrices[0] > AskPrices[1];
if (Long)
MarketOrder(contract.Symbol, 10);
}
}
}
}
}
}