Overall Statistics |
Total Trades 860 Average Win 0.37% Average Loss -0.60% Compounding Annual Return -98.909% Drawdown 89.800% Expectancy -0.883 Net Profit -89.773% Sharpe Ratio -7.857 Loss Rate 93% Win Rate 7% Profit-Loss Ratio 0.62 Alpha -3.504 Beta 0.033 Annual Standard Deviation 0.446 Annual Variance 0.199 Information Ratio -7.413 Tracking Error 0.471 Treynor Ratio -104.935 Total Fees $860.00 |
namespace QuantConnect { /* Designed as a "first use" algorithm by a trader new to robotic trading, with a cash trading account of minimal size. Does not use leverage or margin and waits 4 days from sell date to next purchase date to allow for funds settlement by the broker. Does not make a lot of money, but does not lose. It may however leave you holding stock for a long time if you choose a stock that is falling, never to come back (oops!). Happy trading! */ public class BeginnerAlgo : QCAlgorithm { private string symbol = "AAPL"; private ExponentialMovingAverage slow; private ExponentialMovingAverage fast; private decimal _old_price = 100000; private int _traded_dir; private int _current_dir; private Chart plotter; public override void Initialize() { // set up our analysis span SetStartDate(2015, 6, 1); SetEndDate(2015, 12, 1); SetCash(1000); // request "symbol's" data with minute resolution AddSecurity(SecurityType.Equity, symbol, Resolution.Minute); // create a 20 minute simple moving average slow = EMA(symbol, 40, Resolution.Minute); // create a 5 minute exponential moving average fast = EMA(symbol, 10, Resolution.Minute); plotter = new Chart("MAs", ChartType.Overlay); plotter.AddSeries(new Series("Price", SeriesType.Line)); plotter.AddSeries(new Series("SMA", SeriesType.Line)); plotter.AddSeries(new Series("EMA", SeriesType.Line)); AddChart(plotter); } public void OnData(TradeBars data) { // wait for our slow SMA to fully initialize if (!slow.IsReady) return; var holdings = Portfolio[symbol].Quantity; decimal currentPrice = data[symbol].Close; // indicator logic if (fast > slow) { _current_dir = 1; } else { _current_dir = -1; } // only trade when: currently in no trade && direction is up && first trade since indicator change && minimal distance if (!Portfolio.HoldStock && _current_dir == 1 && _current_dir != _traded_dir && Math.Abs(fast-slow) > 0.02M) { int quantity = (int) Math.Floor(Portfolio.Cash/currentPrice); Order(symbol, quantity); _traded_dir = 1; _old_price = currentPrice; } // only trade when: currently in no trade && direction is down && first trade since indicator change && minimal distance if (!Portfolio.HoldStock && _current_dir == -1 && _current_dir != _traded_dir && Math.Abs(fast-slow) > 0.02M) { int quantity = (int) Math.Floor(Portfolio.Cash/currentPrice); Order(symbol, -quantity); _traded_dir = -1; _old_price = currentPrice; } // calculate percentages (didn't use it, but you could) decimal pps = ((currentPrice - _old_price)/_old_price)*100; // simple exit logic based on reversion if (_traded_dir == 1 && _current_dir == -1) { Liquidate(symbol); _traded_dir = 0; } if (_traded_dir == -1 && _current_dir == 1) { Liquidate(symbol); _traded_dir = 0; } // Update plot Plot("MAs", "Price", currentPrice); Plot("MAs", "SMA", slow); Plot("MAs", "EMA", fast); } } }