Overall Statistics
Total Trades
11
Average Win
0%
Average Loss
-9.35%
Compounding Annual Return
-86.504%
Drawdown
71.800%
Expectancy
-1
Net Profit
-30.335%
Sharpe Ratio
-0.172
Probabilistic Sharpe Ratio
28.323%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-1.186
Beta
7.783
Annual Standard Deviation
1.469
Annual Variance
2.157
Information Ratio
-0.284
Tracking Error
1.315
Treynor Ratio
-0.033
Total Fees
$19.50
class FuturesMovingAverageCrossOverExample2(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2018, 1, 1)    #Set Start Date
        self.SetEndDate(2018, 3,6)      #Set End Date
        self.SetCash(100000)             #Set Strategy Cash
        self.SetTimeZone('America/Los_Angeles') # Set timezone
        self.reset = True
        self.SymbolData = { }
        self.takeProfitL = None
        self.stopLossL = None
        self.takeProfitS = None
        self.stopLossS = None
        self.AddEquity("SPY", Resolution.Minute)
        futureES = self.AddFuture(Futures.Indices.SP500EMini)
        futureES.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(360))
        self.Schedule.On(self.DateRules.Every(DayOfWeek.Tuesday), self.TimeRules.AfterMarketOpen("SPY", 10), self.ScheduleDemo)
        
    def OnData(self, slice):
        # Reset any open positions based on a contract rollover.
        if self.reset:
            self.reset = False
            self.Log('RESET: closing all positions')
            self.Liquidate()
            
    def OnOrderEvent(self, orderEvent):
        if orderEvent.Status != OrderStatus.Filled:
            return
        id = orderEvent.OrderId
        if self.takeProfitL is not None and id == self.takeProfitL.OrderId:
            self.stopLossL.Cancel()
            self.Debug("0")
        if self.takeProfitS is not None and id == self.takeProfitS.OrderId:
            self.stopLossS.Cancel()
            self.Debug("0")
        if self.stopLossL is not None and id == self.stopLossL.OrderId:
            self.takeProfitL.Cancel()
            self.Debug("1")
        if self.stopLossS is not None and id == self.stopLossS.OrderId:
            self.takeProfitS.Cancel()
            self.Debug("1")
            
    def OnSecuritiesChanged(self, changes):
        for s in changes.AddedSecurities:
            if s.Symbol not in self.SymbolData:
                macd = self.MACD(s.Symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Minute)
                self.SymbolData[s.Symbol] = macd
                

                    
                
    def ScheduleDemo(self):
        tolerance = 0.003
        for symbol, assetData in self.SymbolData.items():
            if self.Portfolio[symbol].Invested:
                continue
            price = self.ActiveSecurities[symbol].Price
            if assetData:
                signalDeltaPercent = (assetData.Current.Value - assetData.Signal.Current.Value)
                if signalDeltaPercent < 0 and signalDeltaPercent < -tolerance:
                    # Go long
                    stopLossPrice = price*0.8
                    profitTargetPrice = price*1.2
                    self.MarketOrder(symbol, 1)
                    self.takeProfitL = self.LimitOrder(symbol, -1, profitTargetPrice)
                    self.stopLossL = self.StopMarketOrder(symbol, -1, stopLossPrice)
                if signalDeltaPercent > 0 and signalDeltaPercent > tolerance:
                    #Go short
                    stopLossPrice = price*0.8
                    profitTargetPrice = price*1.2
                    self.MarketOrder(symbol, -1)
                    self.takeProfitS = self.LimitOrder(symbol, 1, profitTargetPrice)
                    self.stopLossS = self.StopMarketOrder(symbol, 1, stopLossPrice)