Overall Statistics |
Total Trades 8 Average Win 0% Average Loss -8.65% Compounding Annual Return -57.776% Drawdown 64.600% Expectancy -1 Net Profit -57.743% Sharpe Ratio -1.319 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.678 Beta -0.25 Annual Standard Deviation 0.539 Annual Variance 0.291 Information Ratio -1.516 Tracking Error 0.556 Treynor Ratio 2.847 |
namespace QuantConnect { /* * QuantConnect University: Bollinger Bands Example: */ public class BollingerBandsAlgorithm : QCAlgorithm { string _symbol = "UNG"; BollingerBands _bb; RelativeStrengthIndex _rsi; AverageTrueRange _atr; ExponentialMovingAverage _ema; SimpleMovingAverage _sma; MovingAverageConvergenceDivergence _macd; decimal _price; int blocks = 10; decimal start_cash = 25000; bool transaction = false; //Initialize the data and resolution you require for your strategy: public override void Initialize() { //Initialize SetStartDate(2014, 1, 1); SetEndDate(2014, 12, 31); SetCash(start_cash); //Add as many securities as you like. All the data will be passed into the event handler: AddSecurity(SecurityType.Equity, _symbol, Resolution.Minute); //Set up Indicators: _bb = BB(_symbol, 20, 1, MovingAverageType.Simple, Resolution.Minute); _rsi = RSI(_symbol, 14, MovingAverageType.Simple, Resolution.Minute); _atr = ATR(_symbol, 14, MovingAverageType.Simple, Resolution.Minute); _ema = EMA(_symbol, 14, Resolution.Minute); _sma = SMA(_symbol, 14, Resolution.Minute); _macd = MACD(_symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute); } public void OnData(TradeBars data) { if (!_bb.IsReady || !_rsi.IsReady) return; if(transaction == false) { _price = data[_symbol].Close; int quantity = (int)Math.Floor(start_cash/10/data[_symbol].Close); if ((!Securities[_symbol].HoldStock) && (transaction == false)) { //int quantity = (int)Math.Floor(Portfolio.Cash / data[_symbol].Close); //Order function places trades: enter the string symbol and the quantity you want: if(_price <_bb.LowerBand) { Order(_symbol, quantity); transaction = true; Debug("Buy first " + quantity.ToString()); } } /* if((_price > Securities[_symbol].Holdings.AveragePrice) && (Securities[_symbol].Holdings.HoldingsValue > 10000) && (transaction == false)) { Order(_symbol,-Securities[_symbol].Holdings.Quantity/2); transaction = true; //Debug("Dump half " + (-Securities[_symbol].Holdings.Quantity/2).ToString()); } */ Debug("Price : " + _price.ToString("F2") + " avg = " + Securities[_symbol].Holdings.AveragePrice.ToString("F2") +" num: " + Securities[_symbol].Holdings.Quantity.ToString("F2")); if (((_price * (decimal)0.95) > (Securities[_symbol].Holdings.AveragePrice)) && (_price < _bb.LowerBand) && (transaction == false)) { Order(_symbol, quantity); transaction = true; Debug("Buy Low " + quantity.ToString()); } /* if((_price > _bb.UpperBand) && (transaction == false)) { if(Securities[_symbol].Holdings.Quantity > quantity) { Order(_symbol,-quantity); transaction = true; //Debug("Sell High " + quantity.ToString()); } else { Liquidate(_symbol); //Debug("Liquidate"); transaction = true; } } */ } } // Fire plotting events once per day: public override void OnEndOfDay() { //if (!_bb.IsReady) return; Plot("BB", "Price", _price); Plot("BB", _bb.UpperBand, _bb.MiddleBand, _bb.LowerBand); //Plot("RSI", _rsi); //Plot("ATR", _atr); //Plot("MACD", "Price", _price); //Plot("MACD", _macd.Fast, _macd.Slow); Plot("Averages", _ema, _sma); transaction = false; //Debug("Holdings SPY on " + Time.ToShortDateString() + " = " + Securities[_symbol].Holdings.Quantity.ToString()); //Debug("Value = " + Securities[_symbol].Holdings.HoldingsValue.ToString("F2")); } } }