Overall Statistics
Total Trades
3950
Average Win
0.55%
Average Loss
-1.02%
Compounding Annual Return
23.809%
Drawdown
67.300%
Expectancy
0.143
Net Profit
685.980%
Sharpe Ratio
0.633
Probabilistic Sharpe Ratio
4.958%
Loss Rate
26%
Win Rate
74%
Profit-Loss Ratio
0.54
Alpha
0.106
Beta
1.549
Annual Standard Deviation
0.424
Annual Variance
0.18
Information Ratio
0.44
Tracking Error
0.372
Treynor Ratio
0.174
Total Fees
$9586.07
Estimated Strategy Capacity
$60000.00
Lowest Capacity Asset
VX Y120ZM67092H
from AlgorithmImports import *
import datetime


class BasicTemplateFuturesAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2013, 1, 1)
        self.SetEndDate(2022, 8, 25)
        self.SetCash(100000)
        self.vx = self.AddFuture(Futures.Indices.VIX)
        self.vx.SetFilter(0, 120)

        # 1. Widen the free portfolio percentage to 30% to avoid margin calls for futures

    def OnMarginCallWarning(self):
        self.Error("You received a margin call warning..")

    def OnData(self, slice):
        now = self.Time
        for chain in slice.FutureChains:
            self.popularContracts = [contract for contract in chain.Value if (contract.Expiry - now).days > 20]
            if len(self.popularContracts) < 3:
                return

            sortedByOIContracts = sorted(self.popularContracts, key=lambda k: k.Expiry, reverse=False)
            self.c1 = sortedByOIContracts[0]
            self.c2 = sortedByOIContracts[1]
            has_data = slice.ContainsKey(self.c1.Symbol) and slice.ContainsKey(self.c2.Symbol)
            if not has_data and not self.Portfolio.Invested:
                return
            # if not self.Portfolio.Invested and slice[self.c1.Symbol].Price < slice[self.c2.Symbol].Price:
            diff = slice[self.c1.Symbol].Price - slice[self.c2.Symbol].Price
            time_to_trade = self.Time.time() == datetime.time(15, 50)
            if time_to_trade and diff < 0:

                self.MarketOrder(self.c1.Symbol, 1)
                self.MarketOrder(self.c2.Symbol, -1)
            elif (self.c1.Expiry - now).days <= 1 and self.Portfolio.Invested:
                self.Liquidate(self.c1.Symbol)
            elif time_to_trade and self.Portfolio.Invested and diff > 5:
                self.Liquidate()
            # elif slice[self.c1.Symbol].Price > 28:
            #     self.Liquidate()