Overall Statistics |
Total Trades 7 Average Win 1.89% Average Loss 0% Compounding Annual Return 1.946% Drawdown 32.200% Expectancy 0 Net Profit 0.535% Sharpe Ratio 0.288 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.785 Beta -4.545 Annual Standard Deviation 0.532 Annual Variance 0.283 Information Ratio 0.023 Tracking Error 0.627 Treynor Ratio -0.034 Total Fees $7.03 |
using System; using System.Collections.Generic; using System.Linq; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; /* Risk Management total Cash : 10.000 Euro or Dollar = tradeCashAllocation trade 5 Stocks (=NumberStocksInPorftfolio) per trade risk 80 % of tradeCashAllocation / maxallowedStocks actula number NumberStocksInPorftfolio reinvest profit tradeCashAllocation += netprofit */ namespace QuantConnect.Algorithm.CSharp { public class RSI_Algorithm : QCAlgorithm { //region "Variables" Resolution _resolution=Resolution.Daily; private const decimal minPrice = 5; private const decimal minVolume = 500000m; private const decimal tpPercent = 1.0m; private bool _Once = true; private const int rsiPeriods = 14; private const int lSMALen = 8; private int NumberStocksInPorftfolio = 0; private decimal tradeCashAllocation = 50000m; // dictionary to easily access SymbolData class parameters // private readonly Dictionary<Symbol, SymbolData> Data = new Dictionary<Symbol, SymbolData>(); private readonly Dictionary<string, SymbolData> SymbData = new Dictionary<string, SymbolData>(); private SecurityChanges sChanges = SecurityChanges.None; string ETF_symbol = "SPY"; DateTime sampledToday = DateTime.Now; decimal price = 0; // this is the ticket from our market order (entrance) // private OrderTicket MarketTicket; private const decimal MaximumLeverage = 4; private const int maxallowedStocks = 5; // this is the ticket from our stop loss order (exit) private OrderTicket StopLossTicket; public override void Initialize() { UniverseSettings.Resolution = _resolution; UniverseSettings.Leverage = 1; SetStartDate(2014, 08, 20); SetEndDate(2014, 11, 30); SetCash(tradeCashAllocation); // SetWarmup(rsiPeriods); AddSecurity(SecurityType.Equity, ETF_symbol, _resolution); // Add_SymbolData(ETF_symbol); AddUniverse(coarse => { return (from cf in coarse where cf.Price > minPrice where cf.Volume > minVolume // orderby cf.Price descending orderby cf.Volume descending select cf.Symbol).Take(15); }); //list_universe_menbers() } public void OnData(TradeBars data) { Debug(string.Join(",", data.Keys)); decimal orderSize = 0; // var securitiesWithHoldings; //Debug("30) "); // Debug("1) " + Time.Date.ToShortDateString() + " " + Stock.Symbol + " hSMA=" + SymbData[Stock.Symbol].hSMA + " iRSI="+ SymbData[Stock.Symbol].iRSI + " SymDate Count=" + SymbData.Count.ToString()); if (sChanges == SecurityChanges.None) return; if (IsWarmingUp) return; if ( _Once) { _Once = false; Debug("Once: list members "); list_universe_menbers(); } foreach (var Stock in SymbData.Values) { // Debug("10) Suche in data " + Stock.Symbol); //Debug("01) " + Time.Date.ToShortDateString() + " " + Stock.Symbol ); if (! data.ContainsKey(Stock.Symbol) ) { Debug("10) not found in data " + Stock.Symbol); if (search_universe_menbers(Stock.Symbol) == false) Debug("11) not found in unives " + Stock.Symbol); if (search_universe_menbers(Stock.Symbol) == true) Debug("12) but found in unives " + Stock.Symbol); // list_universe_menbers(); // var securitiesWithHoldings = Securities.Values.ToList(); var securitiesWithHoldings = data.Values.ToList(); var fi = securitiesWithHoldings.Count; Debug (" count data.Values=" + fi ); foreach (var x in data.Values) { // Debug(" -- actual symbol in data=" + x.Symbol ); //+ " " + x.IsReady ); // if (symbolData.IsReady } continue; } // Debug("40) "); //One data point per day: if (sampledToday.Date == data[Stock.Symbol].Time.Date) return; // sampledToday = data[Stock.Symbol].Time; // Debug("20) " + Time.Date.ToShortDateString()); if (data.ContainsKey(Stock.Symbol)) { Stock.hSMA.Update(Time, data[Stock.Symbol].Close); Stock.iRSI.Update(Time, data[Stock.Symbol].Close); } // Debug("50) "); //Only take one data point per day (opening price) price = Securities[Stock.Symbol].Close; Securities[Stock.Symbol].SetLeverage(1m); var securitiesWithHoldings2 = Securities.Values.Where(sec => sec.HoldStock).ToList(); NumberStocksInPorftfolio = securitiesWithHoldings2.Count; // Debug("11) " + Time.Date.ToShortDateString() + " " + Stock.Symbol + " hSMA="+ SymbData[Stock.Symbol].hSMA + " iRSI="+ SymbData[Stock.Symbol].iRSI + " SymDate Count=" + SymbData.Count.ToString()); // Portfolio["IBM"].LastTradeProfi // expect capture 10% of the daily range //var shares = 3; //shares = (int)Math.Floor(Portfolio.Cash / data["MSFT"].Close); if ( Portfolio[Stock.Symbol].Invested) { Debug(" Stocks in Portfolio=" + NumberStocksInPorftfolio + " Invested:" + Stock.Symbol + " price=" + price + " Invested=" + Portfolio[Stock.Symbol].Invested); Log(" Stocks in Portfolio=" + NumberStocksInPorftfolio + " Invested:" + Stock.Symbol + " price=" + price + " Invested=" + Portfolio[Stock.Symbol].Invested); } if ( !Portfolio[Stock.Symbol].Invested && Stock.iRSI == 0m) { Debug(" Error Stock.iRSI == 0m ; Count=" + NumberStocksInPorftfolio + " " + Stock.Symbol + " Cash=" + Portfolio.Cash + " iRSI="+ SymbData[Stock.Symbol].iRSI ); Log(" Error Stock.iRSI == 0m ; Count=" + NumberStocksInPorftfolio + " " + Stock.Symbol + " Cash=" + Portfolio.Cash + " iRSI="+ SymbData[Stock.Symbol].iRSI ); } //foreach (var other_stock in Portfolio.Values) //{ //if ( Portfolio[other_stock.Symbol].Invested && Stock.iRSI == 0m) // Debug(" Count=" + NumberStocksInPorftfolio + " " + other_stock.Symbol + " Cash=" + Portfolio.Cash ); //} Debug("Trace x-> " + Time.Date.ToShortDateString() + " Cash=" + Portfolio.Cash + " " + Stock.Symbol + " hSMA=" + Stock.hSMA + " iRSI=" + Stock.iRSI + " orderSize=" + orderSize + " price=" + Securities[Stock.Symbol].Close); // --------------- BUY -------------------------------------- if ( !Portfolio[Stock.Symbol].Invested && Stock.iRSI < 32.0m && NumberStocksInPorftfolio < maxallowedStocks+1) { if (LiveMode) { tradeCashAllocation = 10000m; } orderSize = Math.Floor((tradeCashAllocation * 0.6m / maxallowedStocks) / Securities[Stock.Symbol].Close); var CashperStock = tradeCashAllocation * 0.6m / maxallowedStocks; Debug("Buy x-> " + Time.Date.ToShortDateString() + " " + Stock.Symbol + " CashperStock= " + CashperStock + " " + CashperStock/price ) ; //MarketTicket = StopMarketOrder(Stock.Symbol, orderSize, price * 0.97m); // 0.95m); Debug("Buy x-> " + Time.Date.ToShortDateString() + " " + Stock.Symbol + " hSMA=" + Stock.hSMA + " iRSI=" + Stock.iRSI + " orderSize=" + orderSize + " price=" + Securities[Stock.Symbol].Close); Log("BUY -> "+ Time.Date.ToShortDateString() + " " + Stock.Symbol + " " + price); SetHoldings(Stock.Symbol, orderSize); // MarketTicket = MarketOrder(Stock.Symbol, shares); // LimitOrder(_symbol, quantity, (_price * 0.95m)); //var takeProfit = Stock.Close*tpPercent; //LimitOrder(Stock.Symbol, 1 /*Stock.Quantity*/, price); var stopLossPercentage = 7m/100m; // 7 Percent orderSize = (int)Portfolio[Stock.Symbol].AbsoluteQuantity; var stopPrice = Securities[Stock.Symbol].Low*(1.0m - stopLossPercentage); StopLossTicket = StopMarketOrder(Stock.Symbol, - orderSize, stopPrice); Debug("Submitted stop loss @ " + Time.Date.ToShortDateString() + " " + stopPrice.SmartRounding()); Log("Submitted stop loss @ " + Time.Date.ToShortDateString() + " " + stopPrice.SmartRounding()); } if ( Portfolio[Stock.Symbol].Invested && Stock.Symbol == "eee") { // submit stop loss order for max loss on the trade var stopLossPercentage = 0.03m; orderSize = (int)Portfolio[Stock.Symbol].AbsoluteQuantity; var stopPrice = Securities[Stock.Symbol].Low*(1 - stopLossPercentage); StopLossTicket = StopMarketOrder(Stock.Symbol, - orderSize, stopPrice); Log("Submitted stop loss @ " + stopPrice.SmartRounding()); } if ( Portfolio[Stock.Symbol].Invested && Stock.iRSI > 60 ) { Log("SELL >> " + Time.Date.ToShortDateString() + " " + Stock.Symbol + " price=" + price + " iRSI=" + Stock.iRSI ); Debug("Sell >> " + Time.Date.ToShortDateString() + " " + Stock.Symbol + " price=" + price + " iRSI=" + Stock.iRSI ); Liquidate(Stock.Symbol); } // sampledToday = data[Stock.Symbol].Time; } //sampledToday = data["SPY"].Time.Date; } // end of OnData public override void OnSecuritiesChanged(SecurityChanges changes) { sChanges = changes; foreach (var removed in changes.RemovedSecurities) { SymbData.Remove(removed.Symbol); // if (removed.Invested) // { // Liquidate(removed.Symbol); // } } foreach (var added in changes.AddedSecurities) { if (!SymbData.ContainsKey(added.Symbol)) { Add_SymbolData(added.Symbol); Debug( " new--> Added: " + Time.Date.ToShortDateString() + " " + added.Symbol); } } } // end of OnSecuritiesChanged public void list_universe_menbers() { foreach (var universe in UniverseManager.Values) { // User defined universe has symbols from AddSecurity/AddEquity calls if (universe is UserDefinedUniverse) { continue; } var symbols = universe.Members.Keys; foreach (Symbol symbol in symbols) { Debug(" -- actual symbol=" +symbol); } } foreach (SecurityHolding x in Portfolio.Values){ Debug(" -- actual symbol in Portfolio=" + x.Symbol); } } public bool search_universe_menbers (string SymName) { foreach (var universe in UniverseManager.Values) { // User defined universe has symbols from AddSecurity/AddEquity calls if (universe is UserDefinedUniverse) { continue; } var symbols = universe.Members.Keys; foreach (Symbol symbol in symbols) { //Debug(" -- actual symbol=" +symbol); if (symbol == SymName) return true; } } return false; } public void Add_SymbolData(string SymbolName) { var sma = SMA(SymbolName, lSMALen, Resolution.Daily); // Simple Moving Average var rsi = RSI(SymbolName, rsiPeriods, MovingAverageType.Simple, Resolution.Daily); var history = History(SymbolName, rsiPeriods, Resolution.Daily); int count = history.Count(); // Debug (" History count=" + count + " " + Time.Date.ToShortDateString() + " added " + SymbolName); foreach (var tradeBar in history) { rsi.Update(tradeBar.EndTime, tradeBar.Close); } history = History(SymbolName, lSMALen, Resolution.Daily); foreach (var tradeBar in history) { sma.Update(tradeBar.EndTime, tradeBar.Close); } SymbData.Add(SymbolName, new SymbolData { Symbol = SymbolName, hSMA = sma, iRSI = rsi, }); } } class SymbolData { public string Symbol; public SimpleMovingAverage hSMA { get; set; } public RelativeStrengthIndex iRSI { get; set; } // Quick and dirty - store most recent close here public SimpleMovingAverage Close { get; set; } } }