Overall Statistics |
Total Trades 58 Average Win 2.99% Average Loss -1.39% Compounding Annual Return 18.571% Drawdown 7.600% Expectancy 0.464 Net Profit 20.975% Sharpe Ratio 0.774 Sortino Ratio 0.998 Probabilistic Sharpe Ratio 60.557% Loss Rate 54% Win Rate 46% Profit-Loss Ratio 2.15 Alpha 0.051 Beta 0.191 Annual Standard Deviation 0.102 Annual Variance 0.01 Information Ratio -0.523 Tracking Error 0.132 Treynor Ratio 0.413 Total Fees $58.00 Estimated Strategy Capacity $130000000.00 Lowest Capacity Asset TLT SGNKIKYGE9NP Portfolio Turnover 7.13% |
# region imports from AlgorithmImports import * from tlt import * from sym2 import * # endregion class UglyBluePig(QCAlgorithm): def Initialize(self): self.SetStartDate(2023, 1, 1) self.SetCash(10000) self.leverage = 1 self.spy =self.AddEquity("SPY", Resolution.Hour).Symbol self.sym1 =self.AddEquity("TLT", Resolution.Daily).Symbol self.sym2 =self.AddEquity("QQQ", Resolution.Daily).Symbol # Percent of each stock to hold and Supertrend params. These params are optimized thru backtesting self.pct = .5 sym1Per = 4 sym1Mult = 1.75 sym2Per = 3 sym2Mult = 3.25 self.st1 = self.STR(self.sym1, sym1Per, sym1Mult, MovingAverageType.LinearWeightedMovingAverage) self.st2 = self.STR(self.sym2, sym2Per, sym2Mult, MovingAverageType.LinearWeightedMovingAverage) self.SetWarmup(5, Resolution.Daily) def OnData(self, data: Slice): # Call to second algo self.invested = [ x.Symbol.Value for x in self.Portfolio.Values if x.Invested ] #ugly_blue_pig = UglyBluePig() sym1 = Sym1(self) sym2 = Sym2(self) if self.Time.hour == 11: sym1.Call_a() sym2.Call_a() # Calll to main algo
#region imports #from AlgorithmImports import * class Sym2: def __init__(self, algo): self.algo=algo def Call_a(self): #self.algo.AddEquity("QQQ", Resolution.Hour) invested = [ x.Symbol.Value for x in self.algo.Portfolio.Values if x.Invested ] self.algo.Log("invested B: " + str(self.algo.invested)) profit = self.algo.Portfolio[self.algo.sym2].UnrealizedProfitPercent*100 self.algo.Log("{} Unrealized profit %: {:.2f}".format(self.algo.Time,profit)) long = self.algo.Securities[self.algo.sym2].Price > self.algo.st2.Current.Value shares = self.algo.Portfolio[self.algo.sym2].Quantity maxShares = round(self.algo.Portfolio.TotalPortfolioValue * self.algo.pct/self.algo.Securities[self.algo.sym2].Price) if long: if shares == 0: # Not invested self.algo.Log("Going long {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym2].Symbol)) self.algo.MarketOrder(self.algo.sym2, maxShares) elif shares < 0: self.algo.Log ("Closing short {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym2].Symbol)) self.algo.SetHoldings(self.algo.sym2, 0) else: if shares == 0: # Not invested self.algo.Log("Going short {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym2].Symbol)) self.algo.MarketOrder(self.algo.sym2, -maxShares) elif shares > 0: self.algo.Log ("Closing long {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym2].Symbol)) self.algo.SetHoldings(self.algo.sym2, 0) if profit >15 or profit < -7: self.algo.SetHoldings(self.algo.sym2,0) self.algo.Log("Exited because of {:.2f} profit".format(profit)) return 2
#region imports #from AlgorithmImports import * class Sym1: def __init__(self, algo): self.algo=algo def Call_a(self): #self.algo.AddEquity("QQQ", Resolution.Hour) invested = [ x.Symbol.Value for x in self.algo.Portfolio.Values if x.Invested ] self.algo.Log("invested B: " + str(self.algo.invested)) profit = self.algo.Portfolio[self.algo.sym1].UnrealizedProfitPercent*100 self.algo.Log("{} Unrealized profit %: {:.2f}".format(self.algo.Time,profit)) long = self.algo.Securities[self.algo.sym1].Price > self.algo.st1.Current.Value shares = self.algo.Portfolio[self.algo.sym1].Quantity maxShares = round(self.algo.Portfolio.TotalPortfolioValue * self.algo.pct/self.algo.Securities[self.algo.sym1].Price) if long: if shares == 0: # Not invested self.algo.Log("Going long {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym1].Symbol)) self.algo.MarketOrder(self.algo.sym1, maxShares) elif shares < 0: self.algo.Log ("Closing short {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym1].Symbol)) self.algo.SetHoldings(self.algo.sym1, 0) else: if shares == 0: # Not invested self.algo.Log("Going short {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym1].Symbol)) self.algo.MarketOrder(self.algo.sym1, -maxShares) elif shares > 0: self.algo.Log ("Closing long {} shares of {}".format(maxShares, self.algo.Securities[self.algo.sym1].Symbol)) self.algo.SetHoldings(self.algo.sym1, 0) if profit >15 or profit < -7: self.algo.SetHoldings(self.algo.sym1,0) self.algo.Log("Exited because of {:.2f} profit".format(profit)) return 2