| Overall Statistics |
|
Total Trades 16 Average Win 0.16% Average Loss -0.11% Compounding Annual Return -0.068% Drawdown 0.700% Expectancy -0.094 Net Profit -0.068% Sharpe Ratio -0.102 Probabilistic Sharpe Ratio 11.075% Loss Rate 62% Win Rate 38% Profit-Loss Ratio 1.42 Alpha 0 Beta -0.002 Annual Standard Deviation 0.005 Annual Variance 0 Information Ratio -0.676 Tracking Error 0.303 Treynor Ratio 0.323 Total Fees $16.00 |
import clr
clr.AddReference("System")
clr.AddReference("QuantConnect.Algorithm")
clr.AddReference("QuantConnect.Indicators")
clr.AddReference("QuantConnect.Common")
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 *
QCAlgorithmFramework = QCAlgorithm
QCAlgorithmFrameworkBridge = QCAlgorithm
class SimpleTimeBasedAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 12, 1)
self.SetEndDate(2020, 12, 1)
self.SetCash(1000000) # Set Strategy Cash
self.lastEntryDate = self.Time.date()
self.lastEntryCheckDate = self.Time.date()
self.totalTrades = 0
self.stopOrder = None
self.bestPrice = 0
self.direction = 0
self.amzn = self.AddEquity("MSFT", Resolution.Daily)
self.amzn.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.fast = self.EMA(self.amzn.Symbol, 15, Resolution.Daily)
self.slow = self.EMA(self.amzn.Symbol, 30, Resolution.Daily)
self.macd = self.MACD(self.amzn.Symbol, 15, 30, 9, MovingAverageType.Exponential, Resolution.Daily)
emas = Chart("EMAs")
emas.AddSeries(Series("Fast", SeriesType.Line, 0))
emas.AddSeries(Series("Slow", SeriesType.Line, 0))
emas.AddSeries(Series("Price", SeriesType.Candle, 0))
emas.AddSeries(Series("MACD", SeriesType.Line, 0, "int"))
emas.AddSeries(Series("Trade", SeriesType.Scatter, 0))
self.AddChart(emas)
def OnData(self, data):
self.Plot("EMAs", "Fast", self.fast.Current.Value)
self.Plot("EMAs", "Slow", self.slow.Current.Value)
self.Plot("EMAs", "MACD", self.macd.Current.Value-self.macd.Signal.Current.Value+150)
self.Plot("EMAs", "Price", self.amzn.Price)
if not self.slow.IsReady:
return
if self.stopOrder:
yes=True
# enter a position if SMA and LMA diverge
# exit a position based on trailing stop loss
if not self.Portfolio.Invested:
# We're not invested, so check if we should enter, and if so what direction
self.direction = 0
#if data.Time.date() != self.lastEntryCheckDate:
if (self.macd.Current.Value > self.macd.Signal.Current.Value and self.fast.Current.Value > 1.01 * self.slow.Current.Value):
self.direction = 1
elif (self.macd.Current.Value < self.macd.Signal.Current.Value and self.slow.Current.Value > 1.01 * self.fast.Current.Value):
self.direction = -1
if (self.direction != 0):
self.MarketOrder(self.amzn.Symbol, 100*self.direction, True)
self.bestPrice = self.amzn.Price
self.stopOrder = self.StopMarketOrder(self.amzn.Symbol, -100*self.direction, self.GetStopPrice())
else:
# if invested, update the stop order settings to trail the max of the previous and current price
if (self.direction == 1):
self.bestPrice = max(self.bestPrice, self.amzn.Price)
elif (self.direction == -1):
self.bestPrice = min(self.bestPrice, self.amzn.Price)
self.stopOrder.UpdateStopPrice(self.GetStopPrice())
# return the price at which a stop order should be placed, given the
def GetStopPrice(self):
stopPrice = (1 - 0.1 * self.direction) * self.bestPrice
self.Debug("Setting stop to " + str(stopPrice))
return stopPrice
def OnOrderEvent(self, orderEvent):
if orderEvent.Status == OrderStatus.UpdateSubmitted:
self.Debug("Updated stop to " + str(orderEvent.StopPrice))
if orderEvent.Status == OrderStatus.Filled:
order = self.Transactions.GetOrderById(orderEvent.OrderId)
self.totalTrades += 1
self.Plot("EMAs", "Trade", self.amzn.Price)
# if the event is an execution event, then log the price of trade
self.Debug(str(self.Time.date()) + ": Completed " + str(
self.totalTrades) + " trades. Traded AMZN " + " at price " + str(orderEvent.FillPrice) + ", at quantity " + str(orderEvent.Quantity) + ". Current price is " + str(self.amzn.Price))