| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
import math
from QuantConnect.Statistics import *
from QuantConnect.Python import PythonQuandl
import numpy as np
class Squirtle(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 8, 1)
self.SetEndDate(2021, 12, 21)
self.SetCash(10000)
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin)
#-- Variables
self.exitPeriod = 10
self.entryPeriod = 20
self.resolution = Resolution.Daily
self.predictionInterval = Time.Multiply(Extensions.ToTimeSpan(Resolution.Daily), self.entryPeriod)
#-- Futures to trade. For loop subs each continuous contract
futuresSymbols = [Futures.Metals.Gold, Futures.Indices.SP500EMini, Futures.Financials.EuroDollar]
self.Data = {}
for symbol in futuresSymbols:
future = self.AddFuture(symbol,
Resolution.Minute,
dataNormalizationMode = DataNormalizationMode.BackwardsRatio,
dataMappingMode = DataMappingMode.FirstDayMonth,
contractDepthOffset = 0)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday), self.TimeRules.At(12, 0), self.EveryFriAtNoon)
#-- Debugging
self.check = False
self.x = 0
#-- Live trading
self.DefaultOrderProperties = InteractiveBrokersOrderProperties()
self.DefaultOrderProperties.TimeInForce = TimeInForce.GoodTilCanceled
self.DefaultOrderProperties.OutsideRegularTradingHours = False
#-- Trade Builder
tradeBuilder = TradeBuilder(FillGroupingMethod.FillToFill,FillMatchingMethod.FIFO)
self.SetTradeBuilder(tradeBuilder)
self.SetWarmUp(120, Resolution.Daily)
def EveryFriAtNoon(self):
self.Debug(f"Fri at 12pm: {self.Time}")
def OnData(self, data):
if self.IsWarmingUp:
return
if self.check == True:
return
for symbol, symbolData in self.Data.items():
price = self.Securities[symbolData.Symbol].Close
security = self.Securities[symbolData.Symbol]
breakoutUp = symbolData.LongEntry.Current.Value
breakoutDown = symbolData.ShortEntry.Current.Value
coverShort = symbolData.ShortExit.Current.Value
sellLong = symbolData.LongExit.Current.Value
if breakoutUp == 0.0 or breakoutDown == 0.0 or price == 0.0:
return
if not self.Portfolio[symbolData.Symbol].Invested:
if price > breakoutUp:
self.MarketOrder(symbolData.Symbol, 1)
elif price < breakoutDown:
self.MarketOrder(symbolData.Symbol, -1)
elif self.Portfolio[symbolData.Symbol].Invested:
if price < sellLong:
self.Liquidate(symbolData.Symbol)
elif price > coverShort:
self.Liquidate(symbolData.Symbol)
#-- Checks if trad criteria are met
def greenLight(self, symbol):
return True
#-- Gets Trade size
def getSize(self, price):
return 1
def OnOrderEvent(self, orderevent):
self.previousPNL = None
# check if orderevent is a fill
if orderevent.Status == OrderStatus.Filled:
symbol = orderevent.Symbol
self.Debug(f"Order Filled: {symbol}")
fillPrice = orderevent.FillPrice
#-- Creates trade list to track P/L's for risk management
tradeList = []
for trade in self.TradeBuilder.ClosedTrades:
tradeList.append(trade.ProfitLoss)
#-- Showing in console previous trades P/L
#self.Debug(f" ")
if tradeList:
#-- Checks Weekly risk if Order Filled was to close a position
#-- by checking if that symbol is still in the portfolio
if not self.Portfolio[trade.Symbol].Invested:
self.newestTrade = int(tradeList[-1])
#-- Run previous trades PNL through weekly risk check
self.hitWeeklyRisk(self.newestTrade)
#-- Print stats for trade and current targets in console
#self.Debug(f" ")
self.Debug(f"Entry Date: {trade.EntryTime}, Exit Date: {trade.ExitTime}")
self.Debug(f"Profit/Loss: {self.newestTrade}, Unit Size: {self.Unit}, N: {self.N}")
self.Debug(f"Losing Streak: {self.losingStreak}, Weekly Loss %: {self.weeklyLossPercent}")
self.Debug("---------------------------")
#-- If the symbol for last Order Filled is still in the Portfolio, print opened trade
else:
self.Debug("---------------------------")
self.Debug(f"Entered Position In {trade.Symbol}")
else:
#self.Debug(f"No Closed Trades Yet On {symbol}")
return
def OnSecuritiesChanged(self, changes):
for added in changes.AddedSecurities:
symbolData = self.Data.get(added.Symbol)
if symbolData is None:
#-- Create high and low indicators
symbolData = SymbolData(added)
#-- Creating Indicators
symbolData.ShortEntry = self.MIN(added.Symbol, self.entryPeriod, Resolution.Daily)
symbolData.ShortExit = self.MAX(added.Symbol, self.exitPeriod, Resolution.Daily)
symbolData.LongEntry = self.MAX(added.Symbol, self.entryPeriod, Resolution.Daily)
symbolData.LongExit = self.MIN(added.Symbol, self.exitPeriod, Resolution.Daily)
'''
#-- Registering Indicators
self.RegisterIndicator(added.Symbol, symbolData.ShortEntry, timedelta(days = self.entryPeriod))
self.RegisterIndicator(added.Symbol, symbolData.ShortExit, timedelta(days = self.exitPeriod))
self.RegisterIndicator(added.Symbol, symbolData.LongEntry, timedelta(days = self.entryPeriod))
self.RegisterIndicator(added.Symbol, symbolData.LongExit, timedelta(days = self.exitPeriod))
'''
self.Data[added.Symbol] = symbolData
#else:
#-- A security that was already initialized was re-added, reset the indicators
'''
symbolData.ShortEntry.Reset()
symbolData.ShortExit.Reset()
symbolData.LongEntry.Reset()
symbolData.LongExit.Reset()
'''
class SymbolData:
def __init__(self, security):
self.Security = security
self.Symbol = security.Symbol
self.ShortEntry = None
self.ShortExit = None
self.LongEntry = None
self.LongExit = None
self.PriceIsUnderShort = False
self.PriceIsOverLong = False
@property
def PriceIsOverShort(self):
return not self.PriceIsUnderShort
@property
def PriceIsUnderLong(self):
return not self.PriceIsOverLong