Overall Statistics
Total Trades
2
Average Win
0%
Average Loss
-3.00%
Compounding Annual Return
-14.502%
Drawdown
18.100%
Expectancy
-1
Net Profit
-3.00%
Sharpe Ratio
-0.419
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.203
Beta
6.709
Annual Standard Deviation
0.232
Annual Variance
0.054
Information Ratio
-0.487
Tracking Error
0.232
Treynor Ratio
-0.014
Total Fees
$2.00
from decimal import Decimal

class CrossoverStrategy(QCAlgorithm):

    def Initialize(self):
        # SETTINGS ----------
        # sets the amount of tolerance between price and sma until action is taken
        self.sma_tolerance = 1
        # ATR multiplier
        self.atr_multiplier = 2
        # Find more symbols here: http://quantconnect.com/data
        self.symbol = "EXPR"
        # --------------------
        
        # sets backtesting brokage model, does not actually define brokage to be used in live trading
        # futher info: https://www.quantconnect.com/docs#Initializing-Algorithms-Cash-and-Brokerage-Models
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash)
        
        # self.SetStartDate(2017, 11, 10)
        # if unspecified the end date defaults to yesterday.
        
        self.SetStartDate(2016, 3, 1)
        self.SetEndDate(2016, 5, 10)
        
        # this value is ignored in live trading
        self.SetCash(100)
        
        self.AddEquity(self.symbol, Resolution.Daily)
        # Simple Moving Average
        self.sma = self.SMA(self.symbol, 200)
        # Average True Range
        self.atr = self.ATR(self.symbol, 40, MovingAverageType.Wilders)


    def OnData(self, data):
        # wait for sma indicator to fully initialize
        if self.sma.IsReady:
            return
        
        self.price = round(data[self.symbol].Price)
        
        if not self.Portfolio.Invested:
            sma_value = round(self.sma.Current.Value)
            crossover = abs(self.price / sma_value)
        
            if crossover > self.sma_tolerance:
                self.SetHoldings(self.symbol, 1.0)
                self.stop_loss = round(Decimal(self.price) - (self.atr.Current.Value * self.atr_multiplier))
        else:
            if self.price <= self.stop_loss:
                self.Liquidate(self.symbol)
                
            self.Debug("stop_loss: {0}".format(self.stop_loss))
            
        self.Debug("price: {0}".format(data[self.symbol].Price))
        self.Debug("sma: {0}".format(self.sma.Current.Value))
        self.Debug("atr: {0}".format(self.atr.Current.Value))


    def OnOrderEvent(self, orderEvent):
        if orderEvent.Status == OrderStatus.Submitted:
            self.Debug("{0}: Submitted: {1}".format(self.Time, self.Transactions.GetOrderById(orderEvent.OrderId)))
            
        if orderEvent.Status == OrderStatus.Filled:
            self.Debug("{0}: Filled: {1}".format(self.Time, self.Transactions.GetOrderById(orderEvent.OrderId)))