Overall Statistics |
Total Trades 1167 Average Win 0.22% Average Loss -0.05% Compounding Annual Return -3.944% Drawdown 7.000% Expectancy -0.283 Net Profit -4.060% Sharpe Ratio -0.675 Loss Rate 87% Win Rate 13% Profit-Loss Ratio 4.72 Alpha -0.028 Beta 0.015 Annual Standard Deviation 0.04 Annual Variance 0.002 Information Ratio -0.934 Tracking Error 0.114 Treynor Ratio -1.851 Total Fees $2334.00 |
-no value-
namespace QuantConnect { /* * QuantConnect University: 50-10 EMA - Exponential Moving Average Cross * * The classic exponential moving average cross implementation using a custom class. * The algorithm uses allows for a safety margin so you can reduce the "bounciness" * of the trading to confirm the crossing. */ public class QCUMovingAverageCross : QCAlgorithm { //Define required variables: int quantity = 0; decimal price = 0; decimal tolerance = 0m; //0.1% safety margin in prices to avoid bouncing. string symbol = "USDJPY"; // DateTime sampledToday = DateTime.Now; //Set up the EMA Class: // ExponentialMovingAverage emaShort; // ExponentialMovingAverage emaLong; SimpleMovingAverage emaShort; SimpleMovingAverage emaLong; //Initialize the data and resolution you require for your strategy: public override void Initialize() { SetStartDate(2016, 01, 04); SetEndDate(DateTime.Now); SetCash(25000); AddSecurity(SecurityType.Forex, symbol, Resolution.Minute); // AddForex(symbol, Resolution.Minute); // var minConsolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(5)); // minConsolidator.DataConsolidated += OnThirtyMinutes; // SubscriptionManager.AddConsolidator(symbol, minConsolidator); emaShort = new SimpleMovingAverage(10); emaLong = new SimpleMovingAverage(50); RegisterIndicator(symbol, emaShort, TimeSpan.FromMinutes(30)); RegisterIndicator(symbol, emaLong, TimeSpan.FromMinutes(30)); // emaShort = EMA(symbol, 10, Resolution.Daily); // emaLong = EMA(symbol, 50, Resolution.Daily); } private void OnThirtyMinutes(object sender, TradeBar consolidated) { price = consolidated.Close; //Log(consolidated.Time.ToString("o") + " >> " + Symbol + ">> LONG >> 100 >> " + Portfolio[Symbol].Quantity); // if you want code to run every five minutes then you can run it inside of here } //Handle TradeBar Events: a TradeBar occurs on every time-interval public void OnData(TradeBars data) { //One data point per day: // if (sampledToday.Date == data[symbol].Time.Date) return; //Only take one data point per day (opening price) price = Securities[symbol].Close; // sampledToday = data[symbol].Time; //Wait until EMA's are ready: if (!emaShort.IsReady || !emaLong.IsReady) return; //Get fresh cash balance: Set purchase quantity to equivalent 10% of portfolio. decimal cash = Portfolio.Cash; int holdings = Portfolio[symbol].Quantity; //quantity = Convert.ToInt32((cash * 0.5m) / price); quantity = 10000; bool longCond = price > emaShort && price > emaLong && (price-emaLong)<60; bool shortCond = price < emaShort && price < emaLong && (emaLong-price)<60; if (holdings > 0 || holdings == 0) { //If we're long, or flat: check if EMA crossed negative: and crossed outside our safety margin: if (shortCond) { //Now go short: Short-EMA signals a negative turn: reverse holdings if (holdings >0) { MarketOrder(symbol, -20000); } else { MarketOrder(symbol, -10000); } Log(Time.ToShortDateString() + " > Go Short > Holdings: " + holdings.ToString() + " Quantity:" + quantity.ToString() + " price: " +price+ " maShort: " + emaShort.Samples+" maLong: "+emaLong.Samples); } } else if (holdings < 0 || holdings == 0) { //If we're short, or flat: check if EMA crossed positive: and crossed outside our safety margin: if (longCond) { if (holdings <0) { MarketOrder(symbol, 20000); } else { MarketOrder(symbol, 10000); } //Now go long: Short-EMA crossed above long-EMA by sufficient margin Log(Time.ToShortDateString() + "> Go Long > Holdings: " + holdings.ToString() + " Quantity:" + quantity.ToString() + " price: " +price+ " maShort: " + emaShort.Samples+" maLong: "+emaLong.Samples); } } } } }