Overall Statistics
Total Trades
3613
Average Win
0.08%
Average Loss
-0.06%
Compounding Annual Return
-31.654%
Drawdown
31.600%
Expectancy
-0.481
Net Profit
-31.559%
Sharpe Ratio
-3.934
Probabilistic Sharpe Ratio
0.015%
Loss Rate
77%
Win Rate
23%
Profit-Loss Ratio
1.27
Alpha
-0.224
Beta
-0.037
Annual Standard Deviation
0.059
Annual Variance
0.003
Information Ratio
-1.335
Tracking Error
0.295
Treynor Ratio
6.167
Total Fees
$3613.00
Estimated Strategy Capacity
$12000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
import datetime
# from re import I
from AlgorithmImports import *
# import traceback
# from QuantConnect import *
# from QuantConnect.Parameters import *
# from QuantConnect.Benchmarks import *
# from QuantConnect.Brokerages import *
# from QuantConnect.Util import *
# from QuantConnect.Interfaces import *
# from QuantConnect.Algorithm import *
# from QuantConnect.Algorithm.Framework import *
# from QuantConnect.Algorithm.Framework.Selection import *
# from QuantConnect.Algorithm.Framework.Alphas import *
# from QuantConnect.Algorithm.Framework.Portfolio import *
# from QuantConnect.Algorithm.Framework.Execution import *
# from QuantConnect.Algorithm.Framework.Risk import *
# from QuantConnect.Indicators import *
# from QuantConnect.Data import *
# from QuantConnect.Data.Consolidators import *
# from QuantConnect.Data.Custom import *
# from QuantConnect.Data.Fundamental import *
# from QuantConnect.Data.Market import *
# from QuantConnect.Data.UniverseSelection import *
# from QuantConnect.Notifications import *
# from QuantConnect.Orders import *
# from QuantConnect.Orders.Fees import *
# from QuantConnect.Orders.Fills import *
# from QuantConnect.Orders.Slippage import *
# from QuantConnect.Scheduling import *
# from QuantConnect.Securities import *
# from QuantConnect.Securities.Equity import *
# from QuantConnect.Securities.Forex import *
# from QuantConnect.Securities.Interfaces import *
# from datetime import date, datetime, timedelta
# from QuantConnect.Python import *
# from QuantConnect.Storage import *
# from matplotlib.pyplot import bar
QCAlgorithmFramework = QCAlgorithm
QCAlgorithmFrameworkBridge = QCAlgorithm
# # from Selection.EmaCrossUniverseSelectionModel import EmaCrossUniverseSelectionModel
# # endregion


class PairsTrading(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 1, 1)  # Set Start Date
        self.SetEndDate(2020, 12, 29)  # End Date
        self.SetCash(10000)  # Set Strategy Cash
        self.symbol = self.AddEquity("SPY", Resolution.Minute).Symbol
        self.rollingWindow = RollingWindow[TradeBar](2)

        self.Consolidate(self.symbol, timedelta(
            minutes=15), self.ConsolidateBar)
        self.AddRiskManagement(TrailingStopRiskManagementModel(0.05))
        self.pattern = self.CandlestickPatterns.Engulfing(
            self.symbol)

    def OnData(self, data):
        if not self.rollingWindow.IsReady:
            return

        if self.pattern is None:
            return

        if (self.pattern.Current.Value == 1):
            self.Log("Time: {} pattern is 1 going long" . format(data.Time))
            self.SetHoldings(self.symbol, 0.2)
        elif (self.pattern.Current.Value == -1):
            self.Log("pattern is -1 going short")
            self.SetHoldings(self.symbol, -0.2)

        # tradeMinutes = [1, 16, 31, 46]
        # if not self.Time.minute in tradeMinutes:
        #     return

        # if self.Portfolio[self.symbol].Invested:
        #     return

        # if self._pattern == 1:
        #     self.Debug("Engulfing Pattern")
        # else:
        #     self.Debug("-------")

        # isEngufing, bullish = self.ValidateEngulfing(self.rollingWindow)

        # if isEngufing:
        #     if bullish:
        #         self.SetHoldings(self.symbol, 0.5)
        #     else:
        #         self.SetHoldings(self.symbol, -0.5)

    def ConsolidateBar(self, bar):
        self.rollingWindow.Add(bar)

    def ValidateEngulfing(self, bars):
        isEngulfing = True
        bullish = True
        # counter validate for false cases
        if bars[0].Low < bars[1].Low:
            isEngulfing = False

        if bars[1].High > bars[0].High:
            isEngulfing = False

        if bars[0].Open > bars[0].Close:
            bullish = False

        return isEngulfing, bullish