| 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)))