| Overall Statistics |
|
Total Trades 232 Average Win 1.04% Average Loss -1.05% Compounding Annual Return 105.196% Drawdown 18.200% Expectancy 0.031 Net Profit 2.190% Sharpe Ratio -0.818 Probabilistic Sharpe Ratio 28.183% Loss Rate 48% Win Rate 52% Profit-Loss Ratio 0.99 Alpha 0 Beta 0 Annual Standard Deviation 0.982 Annual Variance 0.965 Information Ratio -0.818 Tracking Error 0.982 Treynor Ratio 0 Total Fees $573.04 Estimated Strategy Capacity $0 Lowest Capacity Asset GC Y6A3DH1FMBVH |
#region imports
from AlgorithmImports import *
import collections
from numpy.random import randn
import numpy as np
from numpy.random import seed
from scipy.stats import pearsonr
import numpy as np
import math
import requests
import json
#endregion
class DynamicCalibratedContainmentField(QCAlgorithm):
def Initialize(self):
self.SetStartDate(datetime.now() - timedelta(days=20)) # Set Start Date
self.SetEndDate(datetime.now()- timedelta(days=10)) #Set End Date
self.SetCash(30000)
self.delta = 0
self.contract = None
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash)
self.ticker = Futures.Metals.Gold
self.future = self.AddFuture(self.ticker, Resolution.Tick, extendedMarketHours=True)
self.future.SetFilter(0, 90)
self.ticket = None
self.enter = None
self.EnableAutomaticIndicatorWarmUp = True
self.days_left = 0
self.amount_trades = 0
self.StopTrading=False
self.DefaultOrderProperties.TimeInForce = TimeInForce.GoodTilCanceled
chart = Chart("CLOSING")
self.AddChart(chart)
chart.AddSeries(Series("Liquidation_signal", SeriesType.Scatter, "$", Color.Red, ScatterMarkerSymbol.Circle))
chart.AddSeries(Series("barHandler_after_ST", SeriesType.Scatter, "$", Color.Blue, ScatterMarkerSymbol.Circle))
chart.AddSeries(Series("barHandler_before_ST", SeriesType.Scatter, "$", Color.Green, ScatterMarkerSymbol.Circle))
self.consolidator_by_symbol = {}
self.option_contract = None
def OnData(self, data):
#selects new contract
if not self.Portfolio.Invested and self.contract is None:
for chain in data.FutureChains:
contracts = list(chain.Value)
if len(contracts) == 0:
continue
sortedByOIContracts = sorted(contracts, key=lambda k : k.OpenInterest, reverse=True)
contract = sortedByOIContracts[0]
self.contract = contract
#self.Buy(self.contract.Symbol, 1)
CountConsolidator = TickConsolidator(timedelta(minutes=1))
CountConsolidator.DataConsolidated += self.BarHandler
self.SubscriptionManager.AddConsolidator(contract.Symbol, CountConsolidator)
self.consolidator_by_symbol[contract.Symbol] = CountConsolidator
self.days_left = self.contract.Expiry
if not self.Portfolio.Invested and self.option_contract is None:
for continuous_future_symbol, futures_chain in data.FuturesChains.items():
# Select a Future Contract and create its canonical FOP Symbol
futures_contract = [contract for contract in futures_chain][0]
canonical_fop_symbol = Symbol.CreateCanonicalOption(futures_contract.Symbol)
fop_chain = data.OptionChains.get(canonical_fop_symbol)
if fop_chain is not None:
self.enter = fop_chain
if self.contract is None: return
if self.Time > self.days_left:
self.contract = None
#check if current date is open
hours = self.Securities[self.future.Symbol].Exchange.Hours
#if hours.IsDateOpen(self.Time):
self.StopTrading = False
#get next open/close date
self.todayOpen = hours.GetNextMarketOpen(self.Time, True)
self.todayClose = hours.GetNextMarketClose(self.Time, True)
#liquidate position 15 minutes before close if unrealized profit > 30
if self.todayClose - timedelta(minutes=15) < self.Time and self.StopTrading is not True:
if self.Portfolio[self.future.Symbol].UnrealizedProfit > 30:
self.StopTrading = True
self.Liquidate()
self.Plot("CLOSING", "Liquidation_signal",1.5)
self.Transactions.CancelOpenOrders()
#liquidate position 2 minutes before close
if self.todayClose - timedelta(minutes=2) < self.Time and self.StopTrading is not True:
self.StopTrading = True
self.Liquidate()
self.Plot("CLOSING", "Liquidation_signal",0.5)
self.Transactions.CancelOpenOrders()
#activate trading 2 minutes before open
if self.todayOpen - timedelta(minutes=2) < self.Time:
selfStopTrading = False
def BarHandler(self, sender, bar):
if self.IsWarmingUp:
return
self.Plot("CLOSING", "barHandler_before_ST",1)
#self.Plot("CLOSING", "up", self.Portfolio[self.future.Symbol].UnrealizedProfit)
if self.StopTrading is True:
return
self.Plot("CLOSING", "barHandler_after_ST",1.5)
currentContract = self.Securities[self.future.Mapped]
if not self.Portfolio.Invested:
quantity = 1
self.entry = self.MarketOrder(currentContract.Symbol, quantity)
def OnOrderEvent(self, orderEvent):
currentContract = self.Securities[self.future.Mapped]
quantity = 1
order = self.Transactions.GetOrderById(orderEvent.OrderId)
if order.Status == OrderStatus.Filled and order.Type == OrderType.Market and order.Direction == 0:
entry_price = orderEvent.FillPrice
self.limOrder =self.LimitOrder(currentContract.Symbol, -quantity, orderEvent.FillPrice + 2)
self.stopOrder1 = self.StopMarketOrder(currentContract.Symbol, -quantity, orderEvent.FillPrice - 2)
if order.Status == OrderStatus.Filled and order.Type == OrderType.Market and order.Direction == 1:
self.LimitOrder(currentContract.Symbol, quantity, orderEvent.FillPrice + 2)
stopOrder = self.StopMarketOrder(currentContract.Symbol, quantity, orderEvent.FillPrice - 2)
if order.Status == OrderStatus.Filled:
if order.Type == OrderType.Limit or order.Type == OrderType.StopMarket:
self.Plot("PROFIT", "value", self.Portfolio[currentContract.Symbol].LastTradeProfit)
self.Transactions.CancelOpenOrders(order.Symbol)
self.ticket = None
self.highest = 0
def OnEndOfDay(self):
#self.Debug(f"{self.Securities[self.future.Mapped].Exchange.Hours.GetMarketHours(self.Time)}")
self.Plot("Price","on close",self.future.Price)