| Overall Statistics |
|
Total Trades 5 Average Win 0.35% Average Loss -23.71% Compounding Annual Return -23.335% Drawdown 23.400% Expectancy -0.493 Net Profit -23.437% Sharpe Ratio -0.871 Probabilistic Sharpe Ratio 0.000% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.01 Alpha -0.188 Beta 0.179 Annual Standard Deviation 0.176 Annual Variance 0.031 Information Ratio -1.788 Tracking Error 0.196 Treynor Ratio -0.855 Total Fees $37.00 Estimated Strategy Capacity $85000.00 Lowest Capacity Asset GC XLJQILRHMG7X |
import typing
from decimal import Decimal
from QuantConnect.Securities.Future import Future
class FiveOneFractalBreakoutCopy(QCAlgorithm):
consolidator_by_symbol = {}
def Initialize(self):
self.SetStartDate(2021, 1, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
from future_set_up import FutureSetUp
newFutureSetUp = FutureSetUp(self)
self.SetSecurityInitializer(newFutureSetUp.OpenInterestSecurityInitializer)
self.contracts = []
self.symbolData = dict()
for ticker in [
Futures.Metals.Gold,
Futures.Energies.CrudeOilWTI,
Futures.Metals.Copper,
Futures.Energies.NaturalGas,
Futures.Indices.NASDAQ100EMini]:
future = self.AddFuture(ticker, Resolution.Minute)
future.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen())
# VARIABLES & LIST
# THESE DICTIONARY NAMES CANNOT CHANGE. THE CUSTOM LIBRARY DEPENDS ON IT...
self.rulesDict = {}
self.bearFiveDict = {}
self.bullFiveDict = {}
self.bullOneDict = {}
self.bearOneDict = {}
self.FiveUpDict = {}
self.FiveDownDict = {}
self.first_lowDict = {}
self.second_lowDict = {}
self.first_highDict = {}
self.second_highDict = {}
#Used to check if the first trade in a thesis was a loser.
self.bull_losing_outcomeDict = {}
self.bear_losing_outcomeDict = {}
#A set of variables used to limit re-entries to only happen once per thesis
self.first_position_bullDict = {}
self.second_position_bullDict = {}
self.first_position_bearDict = {}
self.second_position_bearDict = {}
#Used for making sure re-entries happen on a new fractal
self.entry_minuteDict = {}
#DIRECTION VARIABLES
self.supportDict = {}
self.resistanceDict = {}
self.breakoutDict = {}
self.breakdownDict = {}
# ORDER VARIABLES
self.short_stopDict = {}
self.second_short_stopDict = {}
self.long_stopDict = {}
self.second_long_stopDict = {}
self.long_entryDict = {}
self.second_long_entryDict = {}
self.short_entryDict = {}
self.second_short_entryDict = {}
self.long_exitDict = {}
self.second_long_exitDict = {}
self.short_exitDict = {}
self.second_short_exitDict = {}
self.longOrdersDict = {}
self.shortOrdersDict = {}
self.partial_exit_fill_safety_longDict = {}
self.partial_fill_liq_priceDict = {}
self.partial_exit_fill_safety_shortDict = {}
self.risk_targetDict = {}
self.buying_powerDict = {}
self.share_sizeDict = {}
self.dollar_sizeDict = {}
self.max_price_longDict = {}
self.max_price_shortDict = {}
self.trading_hoursDict = {}
self.symbolEntryPriceDict = {}
self.symbolStopPriceDict = {}
self.symbolExitPriceDict = {}
self.longDict = {}
self.shortDict = {}
self.portfolioAmmount = self.Portfolio.Cash
def OnSecuritiesChanged(self, changes):
for security in changes.AddedSecurities:
contractString = str(security.Symbol)
# Don't consolidate or add the actual future.
if contractString[0] == "/":
continue
market = contractString.split()[0]
# Don't add the same contract twice.
if security.Symbol in self.consolidator_by_symbol.keys():
continue
# Create list of symbol strings.
stringContracts = []
for prevContract in self.consolidator_by_symbol.keys():
stringContracts.append(str(prevContract))
# Only allow one contract per Future to be added.
if any(market in s for s in stringContracts):
continue
# Make check to ensure it's only adding valid contracts.
# When converting a symbol to a string the string length is normally 15 characters long for valid contracts.
# This check is probably unnecessary.
if (len(contractString) > 10):
# Set the Rolling Windows for the contract
self.symbolData[security.Symbol] = SymbolData()
# Consolidate the contract
consolidator = QuoteBarConsolidator(timedelta(minutes=5))
consolidator.DataConsolidated += self.OnDataConsolidated
self.SubscriptionManager.AddConsolidator(security.Symbol, consolidator)
# Add contract consolidator to dictionary
self.consolidator_by_symbol[security.Symbol] = consolidator
# Add contract to contract list.
self.contracts.append(security.Symbol)
def OnDataConsolidated(self, sender, quoteBar):
from onDataConsolidated import OnDataConsolidated
newOnDataConsolidated = OnDataConsolidated(self)
newOnDataConsolidated.RunOnDataConsolidated(quoteBar)
def OnData(self, slice):
from onData import OnData
newOnData = OnData(self)
newOnData.RunOnData(slice, "Future")
def OnOrderEvent (self, orderEvent):
from onOrderEvent import OnOrderEvent
newOnOrderEvent = OnOrderEvent(self)
newOnOrderEvent.RunOnOrderEvent(orderEvent, "Future")
class SymbolData(object):
def __init__(self):
self.quickTradeBarWindow = RollingWindow[QuoteBar](5)
self.longTradeBarWindow = RollingWindow[QuoteBar](5)class FutureSetUp(QCAlgorithm):
def __init__(self, context):
self.context = context
def OpenInterestSecurityInitializer(self, security):
if security.Type == SecurityType.Future:
history = self.context.History([security.Symbol], timedelta(1))
if 'openinterest' in history:
oi = OpenInterest(self.context.Time, security.Symbol,
history.openinterest.dropna().iloc[-1])
security.SetMarketPrice(oi)
def GrabFrontMonthContracts(self, slice):
liquidContracts = []
for chain in slice.FutureChains:
chainValue = chain.Value
contracts = chainValue.Contracts
for contract in contracts.Values:
liquidContracts.append(contract)
if liquidContracts == None or len(liquidContracts) <= 0:
return None
else:
return liquidContracts
def SetContract(self, slice):
liquidContracts = self.GrabFrontMonthContracts(slice)
symbols = []
if (liquidContracts == None):
return None
for contract in liquidContracts:
contractString = str(contract.Symbol)
market = contractString.split()[0]
if contract.Symbol in self.context.contracts:
continue
stringContracts = []
for prevContract in self.context.contracts:
stringContracts.append(str(prevContract))
if any(market in s for s in stringContracts):
continue
self.context.contracts.append(contract.Symbol)
symbols.append(contract.Symbol)
return symbols
# Your New Python File