Overall Statistics |
Total Trades 187 Average Win 1.61% Average Loss -1.46% Compounding Annual Return 5.082% Drawdown 14.400% Expectancy 0.222 Net Profit 31.731% Sharpe Ratio 0.559 Loss Rate 42% Win Rate 58% Profit-Loss Ratio 1.11 Alpha -0.014 Beta 0.463 Annual Standard Deviation 0.097 Annual Variance 0.01 Information Ratio -0.876 Tracking Error 0.106 Treynor Ratio 0.118 Total Fees $585.67 |
using System.Collections.Concurrent; namespace QuantConnect { public class FractalDimmension : QCAlgorithm { string tradeSymbol = "SPY"; //Data Required List<string> _symbols = new List<string>() { "SPY" }; TradeBars _bars = new TradeBars(); //global vars Minimum _min; Maximum _max; Sum _sum; SimpleMovingAverage _sma; StandardDeviation _sd; decimal _fractalDimmension; decimal _chaosIndex; BollingerBands _bb; DateTime lastTradeTime; decimal _delta; //Initialize the data and resolution you require for your strategy: public override void Initialize() { //Start and End Date range for the backtest: SetStartDate(2010, 1, 1); SetEndDate(DateTime.Now.AddDays(-1)); //Cash allocation SetCash(100000); //Add as many securities as you like. All the data will be passed into the event handler: foreach (var symbol in _symbols) { AddSecurity(SecurityType.Equity, symbol, Resolution.Daily); //Securities[symbol].TransactionModel = new CustomTransactionModel(); Securities[symbol].SetDataNormalizationMode(DataNormalizationMode.Raw); } //_symbols.AddRange(_forexSymbols); //updated inside OnData _bb = new BollingerBands(100, 1); _sd = new StandardDeviation(30); _sum = new Sum(10); _sma = new SimpleMovingAverage(30); _min = MIN(tradeSymbol, 10, Resolution.Daily); _max = MAX(tradeSymbol, 10, Resolution.Daily); } //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol. public void OnData(TradeBars data) { UpdateBars(data); if (_bars.Count != _symbols.Count) return; //foreach(var symbol in _symbols) //{ //if (_consolidator.Update(_bars[tradeSymbol])) //{ try { _delta = _max - _min; //updating custom indies TradeBar bar; if (_bars.TryGetValue(tradeSymbol, out bar)) { _bb.Update(bar.Time, _delta); _sum.Update(bar.Time, _bars[tradeSymbol].High-_bars[tradeSymbol].Low); } if(_delta != 0) { _fractalDimmension = _sum / _delta; } if (_bars.TryGetValue(tradeSymbol, out bar)) { _sma.Update(bar.Time, _fractalDimmension); _sd.Update(bar.Time, _fractalDimmension); } if(_sd != 0) { _chaosIndex = (_fractalDimmension - _sma)/_sd; } //indies Plot("Indicators", "FractalDimmension", _fractalDimmension); //exit //if((data[tradeSymbol].Time-lastTradeTime).TotalDays > 5) if(Portfolio[tradeSymbol].IsLong && _fractalDimmension > _sma) { Liquidate(tradeSymbol); //Log("Liquidated at "+_bars[tradeSymbol].Time); } else if(Portfolio[tradeSymbol].IsShort && _chaosIndex > 0) { Liquidate(tradeSymbol); //Log("Liquidated at "+_bars[tradeSymbol].Time); } //entries /*if(!Portfolio[tradeSymbol].Invested && _chaosIndex < -1) { SetHoldings(tradeSymbol, -0.85); if (LiveMode) { //Notify.Email("info@supernovacapital.com", "QC Bought", "Bought: "+Time.ToString("u")); } lastTradeTime = data[tradeSymbol].Time; //Log("Bought at "+_bars[tradeSymbol].Time+" index time "+_indTime); } else*/ if(!Portfolio[tradeSymbol].Invested && _fractalDimmension < _sma) { SetHoldings(tradeSymbol, 0.85); lastTradeTime = data[tradeSymbol].Time; } } catch(Exception err) { Log("ERROR. "+err.Message); } //}//end of consolidator check //} // end of foreach } // end of ondata //Update the global "_bars" object private void UpdateBars(TradeBars data) { foreach (var bar in data.Values) { if (!_bars.ContainsKey(bar.Symbol)) { _bars.Add(bar.Symbol, bar); } _bars[bar.Symbol] = bar; } } } // end of algo } //end of namesace