Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
// using System; using QuantConnect.Brokerages; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Market; using QuantConnect.Indicators; using QuantConnect.Orders; using QuantConnect.Orders.Fees; using QuantConnect.Securities; // using Telegram.Bot; // using Telegram.Bot.Types.Enums; namespace QuantConnect.Algorithm.CSharp { public class GeekyFluorescentYellowCaribou : QCAlgorithm { private MovingAverageConvergenceDivergence _macd; private RelativeStrengthIndex _rsi; private Momentum _mom; private VolumeWeightedAveragePriceIndicator _vwap; private AwesomeOscillator _awesomeOscillator; private AverageTrueRange _atr; private OrderTicket _takeprofit; private OrderTicket _initial; //private string _symbol = "RELIANCE"; private string _symbol = "TSLA"; private TimeSpan tradingStartTime = new TimeSpan(9, 15, 0); private TimeSpan tradingEndTime = new TimeSpan(15, 00, 0); private Resolution _resolution = Resolution.Minute; //private Identity _prevClose; //private SuperTrend _superTrend; private DonchianChannel _donchianChannel; private int capital = 100000; private bool enableTgNotifications = true; private string holdings = "| Ticker | Market | Quantity | AveragePrice | CurrentPrice |" + "\n" + "|------|------|------|------|------|------|\n"; // private TelegramBotClient botClient = new TelegramBotClient(""); public override void Initialize() { // SetTimeZone(TimeZones.Kolkata); // backtest parameters SetStartDate(2020, 8, 1); SetEndDate(2021, 1, 15); //SetAccountCurrency(Currencies.INR); // cash allocation for backtesting SetCash(capital); SetBenchmark(t => 0); //AddEquity(_symbol, _resolution, Market.NSE); AddEquity(_symbol, _resolution); //Securities[_symbol].SetFeeModel(new ZerodhaFeeModel()); Securities[_symbol].SetLeverage(4); Securities[_symbol].SetBuyingPowerModel(new CashBuyingPowerModel()); _macd = new MovingAverageConvergenceDivergence( 12, 26, 9); _rsi = new RelativeStrengthIndex( 14, MovingAverageType.Exponential); _mom = new Momentum( 14); _vwap = VWAP(_symbol,14); //_superTrend = new SuperTrend("superTrend", 10, 3); _atr = new AverageTrueRange( 14); _donchianChannel = new DonchianChannel( 20); _awesomeOscillator = new AwesomeOscillator( 34, 5); var renkoConsolidator = new RenkoConsolidator(8); renkoConsolidator.DataConsolidated += (sender, renkoBar) => { HandleRenkoClose(renkoBar); }; // register the consolidator for updates SubscriptionManager.AddConsolidator(_symbol, renkoConsolidator); //RegisterIndicator(_symbol, _superTrend, renkoConsolidator); RegisterIndicator(_symbol, _macd, renkoConsolidator); RegisterIndicator(_symbol, _atr, renkoConsolidator); RegisterIndicator(_symbol, _mom, renkoConsolidator); RegisterIndicator(_symbol, _rsi, renkoConsolidator); RegisterIndicator(_symbol, _donchianChannel, renkoConsolidator); RegisterIndicator(_symbol, _awesomeOscillator, renkoConsolidator); //SetBrokerageModel(BrokerageName.Zerodha); } public void HandleRenkoClose(RenkoBar renkoBar) { var isMarketOpen = Time.TimeOfDay >= tradingStartTime && Time.TimeOfDay < tradingEndTime; if (!isMarketOpen) { Log("Not our trading time!"); return; } if (!_macd.IsReady /*|| !_superTrend.IsReady*/ || !_atr.IsReady || !_awesomeOscillator.IsReady || !_donchianChannel.IsReady) { return; } var entryLimitPrice = (_atr.Current / 2) + renkoBar.Close; //var trend = _superTrend > renkoBar.Close ? "Red" : "Green"; var quantity = (Portfolio.Cash/entryLimitPrice).SmartRounding(); // Let's go long if ( !Portfolio.Invested && renkoBar.Direction == BarDirection.Rising && _awesomeOscillator > 0 && renkoBar.High >= _donchianChannel.UpperBand.Current.Value //&& //renkoBar.Close > _superTrend.Current.Value && //trend == "Green" ) { //Send a Telegram Notifications // sendTgNotification("**Going Long on " + _symbol + " at " + Time + " ** \n" + // statsNotification(renkoBar, _awesomeOscillator, // _donchianChannel, _atr.Current, _vwap, trend)); //Take Long Positions //SetHoldings(_symbol, 1.0); if (_takeprofit == null || _takeprofit.Status == OrderStatus.Filled) { _initial = LimitOrder(_symbol, quantity, entryLimitPrice); } } //Exit Long if (Portfolio.Invested && Portfolio[_symbol].IsLong && _donchianChannel.UpperBand != renkoBar.High) { if (_initial.Status == OrderStatus.Filled) { _takeprofit = LimitOrder(_symbol, -Portfolio[_symbol].Quantity, entryLimitPrice.SmartRounding()); } } //let's go short if ( !Portfolio.Invested && renkoBar.Direction == BarDirection.Falling && renkoBar.Low <= _donchianChannel.LowerBand.Current.Value&& _donchianChannel.Current > renkoBar.Close && // _superTrend.Current > renkoBar.Close && _awesomeOscillator.Current < 0 //&& //trend == "Red" ) { //Send a Telegram Notification // sendTgNotification("**Going Short on " + _symbol + " at " + Time + " ** \n" + // statsNotification(renkoBar, _awesomeOscillator, // _donchianChannel, _atr.Current, _vwap, trend)); //Liquidate the portfolio //Liquidate(); if (_takeprofit == null || _takeprofit.Status == OrderStatus.Filled) { _initial = LimitOrder(_symbol, -Portfolio[_symbol].Quantity, entryLimitPrice.SmartRounding()); } } if (Portfolio.Invested && Portfolio[_symbol].IsShort && _donchianChannel.LowerBand != renkoBar.Low) { if (_initial.Status == OrderStatus.Filled) { _takeprofit = LimitOrder(_symbol, -Portfolio[_symbol].Quantity, entryLimitPrice.SmartRounding()); } } } public override void OnOrderEvent(OrderEvent orderEvent) { if (orderEvent.Status == OrderStatus.Filled) { //sendTgNotification(orderEvent.ToString()); } } public override void OnEndOfDay(Symbol symbol) { foreach (var security in Portfolio) { holdings += "|" + Time + "|" + security.Key.ID.Symbol + "|" + security.Key.ID.Market + "|" + security.Value.Quantity + "|" + security.Value.AveragePrice + "|" + security.Value.Price + "|\n"; } //sendTgNotification("Net P/L for the day: "+Portfolio[_symbol].NetProfit); } public override void OnEndOfAlgorithm() { // sendTgNotification("## End Of The Day: \n"+ // "**Free Margin Available:**` "+Portfolio.Cash.SmartRounding()+"`\n"+ // "**Holdings:**"+"\n"+ // holdings); } private string statsNotification( RenkoBar renkoBar, decimal awesomeOscillator, DonchianChannel donchianChannel, decimal _atrCurrentPrice, decimal vwap, string trend ) { return "**DateTime:** `" + Time + "`\n" + "**RenkoBar Open:** `" + renkoBar.Open.RoundToSignificantDigits(2) + "`\n" + "**RenkoBar High:** `" + renkoBar.High.RoundToSignificantDigits(2) + "`\n" + "**RenkoBar Low:** `" + renkoBar.Low.RoundToSignificantDigits(2) + "`\n" + "**RenkoBar Close:** `" + renkoBar.Close.RoundToSignificantDigits(2) + "`\n" + "**RenkoBar Direction:** `" + renkoBar.Direction + "`\n" + "**SuperTrend Direction:** `" + trend + "`\n" + "**Awesome Oscillator:** `" + awesomeOscillator.RoundToSignificantDigits(2) + "`\n" + "**Donchian Channel UpperBand:** `" + donchianChannel.UpperBand.Current.Value.RoundToSignificantDigits(2) + "`\n" + "**Donchian Channel MiddleBand:** `" + donchianChannel.Current.Value.RoundToSignificantDigits(2) + "`\n" + "**Donchian Channel LowerBand:** `" + donchianChannel.LowerBand.Current.Value.RoundToSignificantDigits(2) + "`\n" + "**AverageTrueRange:** `" + _atrCurrentPrice.RoundToSignificantDigits(2) + "`\n" + "**VWAP:** `" + vwap.RoundToSignificantDigits(2) + "`\n"; } // private async void sendTgNotification(string text) // { // if (enableTgNotifications) // { // await botClient.SendTextMessageAsync( // chatId: "", //My TG ChatID // text: text.Replace("#", "\\#").Replace("-", "\\-").Replace("|", "\\|").Replace(".", "\\."), // parseMode: ParseMode.MarkdownV2 // ); // } // } } }