Overall Statistics |
Total Trades 15 Average Win 4.35% Average Loss -1.16% Compounding Annual Return 7.616% Drawdown 11.100% Expectancy 0.185 Net Profit 8.180% Sharpe Ratio 0.773 Probabilistic Sharpe Ratio 39.725% Loss Rate 75% Win Rate 25% Profit-Loss Ratio 3.74 Alpha 0.058 Beta 0.094 Annual Standard Deviation 0.107 Annual Variance 0.011 Information Ratio -0.561 Tracking Error 0.312 Treynor Ratio 0.875 Total Fees $15.00 |
import clr clr.AddReference("System") clr.AddReference("QuantConnect.Algorithm") clr.AddReference("QuantConnect.Indicators") clr.AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * class QuantumCalibratedComputer(QCAlgorithm): def Initialize(self): self.SetBenchmark('SPY') self.SetStartDate(2020, 1, 1) #Set Start Date self.SetEndDate(2021, 1, 25) #Set End Date self.SetCash(2400) #Set Strategy Cash self.symbols = { 'a': ['PSQ', 34, 100, 2], } self.fast, self.slow, self.atr = {}, {}, {} for key, symbol in self.symbols.items(): code = symbol[0] self.AddEquity(code) # self.AddForex("EURUSD", Resolution.Hour, Market.Oanda) slow, fast = 120, 60 self.fast[code] = self.SMA(code, fast, Resolution.Daily) self.slow[code] = self.SMA(code, slow, Resolution.Daily) self.atr[code] = self.ATR(code, 15, MovingAverageType.Simple, Resolution.Daily) self.PlotIndicator('atr' + code, self.atr[code]) self.PlotIndicator('fast' + code, self.fast[code]) self.PlotIndicator('slow' + code, self.slow[code]) self.SetWarmup(150) self.Schedule.On(self.DateRules.EveryDay(self.symbols['a'][0]), self.TimeRules.AfterMarketOpen(self.symbols['a'][0], 10), self.SetSignal_a) def SetSignal_a(self): self.SetSignal(self.symbols['a']) def SetSignal_b(self): self.SetSignal(self.symbols['b']) def SetSignal(self, symbol): code = symbol[0] pos_per_time = symbol[1] max_pos = symbol[2] atr_number = symbol[3] breakout = 5 opens = self.History(self.Symbol(code), breakout, Resolution.Daily)['open'] if not self.slow[code].IsReady or not self.fast[code].IsReady or not self.atr[code].IsReady: # self.Log('indicators is not ready') return p = self.Securities[code].Price ma_slow = self.slow[code].Current.Value ma_fast = self.fast[code].Current.Value atr = self.atr[code].Current.Value highest = max(opens) lowest = min(opens) pos = self.Portfolio[code].Quantity avg_open = self.Portfolio[code].AveragePrice pl = 0 if avg_open > 0: if pos > 0: pl = (p - avg_open) / avg_open if pos < 0: pl = (avg_open - p) / avg_open self.Log(code + ' price ' + self.f(p) + ' position ' + self.f(pos) + ' avg_open ' + self.f(avg_open) + ' atr ' + self.f(atr) + ' ma_slow ' + self.f(ma_slow) + ' ma_fast ' + self.f(ma_fast) + ' highest ' + self.f(highest) + ' lowest ' + self.f(lowest) ) is_long, is_short = pos > 0, pos < 0 if is_long: stop_loss_p = avg_open - atr * atr_number if p <= stop_loss_p: self.Liquidate(code) is_long = False if is_short: stop_loss_p = avg_open + atr * atr_number if p >= stop_loss_p: self.Liquidate(code) is_short = False pl = -1 if is_long and (p < ma_fast or p < ma_slow): self.Liquidate(code) is_long = False pl = -1 if is_short and (p > ma_fast or p > ma_slow): self.Liquidate(code) is_short = False pl = -1 if (p >= ma_slow and p >= ma_fast and p >= highest and abs(pos) < max_pos and pl >= 0): self.MarketOrder(code, pos_per_time) stop_loss_p = p - atr * atr_number self.StopMarketOrder(code, pos_per_time * -1, stop_loss_p) if (p <= ma_slow and p <= ma_fast and p <= lowest and abs(pos) < max_pos and pl >= 0): self.MarketOrder(code, pos_per_time * -1) stop_loss_p = p + atr * atr_number self.StopMarketOrder(code, pos_per_time, stop_loss_p) def OnEndOfDay(self, data): pass def f(self, f): if f is None: return 'None' if type(f) != float: f = float(f) s = str('{:.6f}'.format(f)) if s.endswith('.000000'): s = s[:-7] return s