Overall Statistics |
Total Trades 13 Average Win 0.39% Average Loss -0.05% Compounding Annual Return -47.122% Drawdown 13.600% Expectancy 3.034 Net Profit -0.348% Sharpe Ratio 497.724 Probabilistic Sharpe Ratio 0% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 7.07 Alpha 151.49 Beta 4.083 Annual Standard Deviation 0.316 Annual Variance 0.1 Information Ratio 653.376 Tracking Error 0.238 Treynor Ratio 38.479 Total Fees $2646.45 |
from datetime import timedelta #https://www.youtube.com/watch?v=AM52D58vGQk&t=231s class ParticleMultidimensionalInterceptor(QCAlgorithm): def Initialize(self): self.SetStartDate(2021, 1, 4) self.SetEndDate(2021, 1, 5) self.SetCash(100000) self.btcusd = self.AddCrypto("BTCUSD", Resolution.Minute, Market.GDAX) self.symbol = self.btcusd.Symbol self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash) ema_period = 200 rsi_period = 14 self.risk_reward = 2 self.previous_bar = None self.ema = ExponentialMovingAverage(ema_period) self.rsi = self.RSI(self.symbol, rsi_period, MovingAverageType.Simple, Resolution.Minute) self.RegisterIndicator(self.symbol, self.ema, Resolution.Minute) self.RegisterIndicator(self.symbol, self.rsi, Resolution.Minute) self.SetWarmup(ema_period) def OnData(self, data): self.Plot("EMA/Price", "EMA", self.ema.Current.Value) self.Plot("EMA/Price", "Price", data[self.symbol].Close) self.Plot("RSI", "RSI", self.rsi.Current.Value) # Wait until warmup period is over if not self.IsWarmingUp: engulfing = False if self.previous_bar is not None and self.previous_bar.Close < self.previous_bar.Open: if data[self.symbol].Close >= self.previous_bar.Open and data[self.symbol].Open <= self.previous_bar.Close: engulfing = True # If all 3 indicators agree if data[self.symbol].Close > self.ema.Current.Value and self.rsi.Current.Value > 50 and engulfing: # Make sure we don't have any open positions if not self.Portfolio.Invested: quantity = self.CalculateOrderQuantity(self.symbol, 1.0) self.MarketOrder(self.symbol, quantity) # Set stop loss to the opening price stopLoss = self.Securities[self.symbol].Open # Set profit target to x2 the risk delta risk_delta = self.Securities[self.symbol].Close - stopLoss target = self.Securities[self.symbol].Close + (risk_delta * 2) self.LimitOrder(self.symbol, -quantity, target, "Take Profit") self.StopMarketOrder(self.symbol, -quantity, stopLoss, "Stop Loss") self.previous_bar = data[self.symbol] def OnOrderEvent(self, orderEvent): order = self.Transactions.GetOrderById(orderEvent.OrderId) if order.Status == OrderStatus.Filled: if order.Type == OrderType.Limit or order.Type == OrderType.Limit: self.Transactions.CancelOpenOrders(order.Symbol) if order.Status == OrderStatus.Canceled: self.Log(str(orderEvent))