Overall Statistics |
Total Trades 1274 Average Win 0.31% Average Loss -0.26% Compounding Annual Return -100.000% Drawdown 79.100% Expectancy -0.929 Net Profit -79.055% Sharpe Ratio -13.669 Loss Rate 97% Win Rate 3% Profit-Loss Ratio 1.16 Alpha -12.861 Beta -2.964 Annual Standard Deviation 0.965 Annual Variance 0.932 Information Ratio -13.512 Tracking Error 0.985 Treynor Ratio 4.451 Total Fees $4713.80 |
using QuantConnect.Data.Consolidators; using QuantConnect.Orders; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using QuantConnect.Algorithm; using QuantConnect.Data.Market; using QuantConnect.Data; using QuantConnect.Securities; namespace QuantConnect { /* * QuantConnect University: Bollinger Bands Example: */ public class IndicatorSuiteAlgorithm : QCAlgorithm { string _symbol = "SPY"; // var futureGold = AddFuture(Futures.Metals.Gold); private const string RootSP500 = Futures.Indices.SP500EMini; public Symbol SP500 = QuantConnect.Symbol.Create(RootSP500, SecurityType.Future, Market.USA); ExponentialMovingAverage _ema; SimpleMovingAverage _sma, sma5, sma9; int hold = 0; int counter = 0; int time = 0; // RelativeStrengthIndex rsi2; // decimal limitprice; OrderTicket ticket; //RSI Custom Data: decimal _price; decimal _price2 = 0m; //Initialize the data and resolution you require for your strategy: public override void Initialize() { //Initialize SetStartDate(2017, 4, 18); SetEndDate(2017, 5, 18); SetCash(25000); //Add as many securities as you like. All the data will be passed into the event handler: AddSecurity(SecurityType.Equity, _symbol, Resolution.Minute); //Add the Custom Data: var futureSP500 = AddFuture(RootSP500); futureSP500.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(60)); //Set up Indicators: _ema = EMA(_symbol, 14, Resolution.Daily); _sma = SMA(_symbol, 1, Resolution.Minute); sma5 = SMA(_symbol, 5, Resolution.Minute); sma9 = SMA(_symbol, 9, Resolution.Minute); //Custom Data Indicator: //1. Manually create instance of indicator class //2. Create a "consolidator". If you don't need one use "IdentityDataConsolidator" which means "pass data through". // var bitcoinIdentityConsolidator = new IdentityDataConsolidator<Bitcoin>(); //3. Manually Register Indicator to receive updates (using data.Value to generate indicator). // RegisterIndicator("SPY", _rsiCustom, bitcoinIdentityConsolidator, x => x.Value); //Note: If you want you could manually update the indicator class values with _rsiCustom.Update(): } //Custom data event handler: public void OnData(TradeBars data) { if((time > 572) && (time < 959)) { counter++; _price = data["SPY"].Close; Plot("sma", sma5, sma9); Plot("amount",Portfolio["SPY"].Quantity); } } public override void OnData(Slice slice) { if((time > 572) && (time < 959)) { Console.WriteLine(time); Console.WriteLine(Time); // short stuff //___________________________________________________________________________________________________ if ((sma5 < sma9) && (hold == 0)) { // short order if (!Portfolio.Invested) { foreach(var chain in slice.FutureChains) { // find the front contract expiring no earlier than in 90 days var contract = ( from futuresContract in chain.Value.OrderBy(x => x.Expiry) where futuresContract.Expiry > Time.Date.AddDays(5) select futuresContract ).FirstOrDefault(); // if found, trade it if (contract != null) { MarketOrder(contract.Symbol, -2); } } } hold= -1; } if((hold == -1) && (sma5 >= sma9)) { // sell Liquidate(); hold = 0; } // Long stuff //___________________________________________________________________________________________________ if ((sma5 > sma9) && (hold == 0)) { // short order if (!Portfolio.Invested) { foreach(var chain in slice.FutureChains) { // find the front contract expiring no earlier than in 90 days var contract = ( from futuresContract in chain.Value.OrderBy(x => x.Expiry) where futuresContract.Expiry > Time.Date.AddDays(5) select futuresContract ).FirstOrDefault(); // if found, trade it if (contract != null) { MarketOrder(contract.Symbol, 2); } } } hold = 1; } if((hold == 1) && (sma5 <= sma9)) { // sell Liquidate(); hold = 0; } if(time == 960) Liquidate(); _price2 = _price; } time++; } // Fire plotting events once per day: public override void OnEndOfDay() { Console.WriteLine("End of day"); // Order("SPY", -Portfolio["SPY"].Quantity); // sell all futures //Custom data indicator Liquidate(); time = 0; //Plot("STD", _std); // Plot("AROON", _aroon.AroonUp, _aroon.AroonDown); // Plot("MOM", _mom); // Plot("MACD", "Price", _price); // Plot("MACD", _macd.Fast, _macd.Slow); // Plot("Averages", _ema, _sma); } } }