Overall Statistics |
Total Trades 990 Average Win 2.05% Average Loss -1.92% Compounding Annual Return 31.304% Drawdown 32.900% Expectancy 0.306 Net Profit 383.701% Sharpe Ratio 1.037 Loss Rate 37% Win Rate 63% Profit-Loss Ratio 1.07 Alpha 0.23 Beta 0.056 Annual Standard Deviation 0.228 Annual Variance 0.052 Information Ratio 0.508 Tracking Error 0.25 Treynor Ratio 4.26 Total Fees $0.00 |
namespace QuantConnect { public class ForexAlgorithm : QCAlgorithm { public string[] symbols = {"AUDUSD","EURAUD","EURCAD","EURGBP","EURJPY","EURNZD","EURUSD","GBPUSD","NZDUSD","USDCAD","USDJPY"}; private Dictionary<string, RelativeStrengthIndex> rsi = new Dictionary<string, RelativeStrengthIndex>(); private Dictionary<string, ExponentialMovingAverage> srsi = new Dictionary<string, ExponentialMovingAverage>(); AverageTrueRange ATR; public decimal ATRL; public decimal ATRS; public decimal EPL; public decimal EPS; public DateTime EntryTimeL; public DateTime EntryTimeS; RollingWindow<decimal>eu; RollingWindow<bool>Long; RollingWindow<bool>Short; public bool open; public override void Initialize() { SetStartDate(2016, 1, 1); SetEndDate(DateTime.Now); SetCash(10000); foreach (var symbol in symbols) { AddSecurity(SecurityType.Forex, symbol, Resolution.Hour); rsi[symbol]=RSI(symbol,14, MovingAverageType.Wilders,Resolution.Hour); srsi[symbol]=new ExponentialMovingAverage(20).Of(rsi[symbol]); SetWarmup(1005); } ATR = ATR("EURUSD",20,MovingAverageType.Wilders,Resolution.Hour); eu = new RollingWindow<decimal>(1005); Long = new RollingWindow<bool>(5); Short = new RollingWindow<bool>(5); } public decimal MA_Simple(int period, int ii) { if (period != 0 && ii > period) { decimal summ = 0; for (int i = 0; i <= period; i++) { summ = summ + eu[i]; } summ = summ / period; return summ; } else return -1; } public void OnData(QuoteBars data) { if (!ATR.IsReady) return; if (!(ATR>0)) return; var qty = Math.Floor(Portfolio.TotalPortfolioValue*2); var stopDistL = 8*ATRL; var stopDistS = 8*ATRS; var holdTime = 42; var currentPrice = data["EURUSD"].Price; var EURAUD = srsi["EURAUD"]; var EURCAD = srsi["EURCAD"]; var EURGBP = srsi["EURGBP"]; var EURJPY = srsi["EURJPY"]; var EURNZD = srsi["EURNZD"]; var EURUSD = srsi["EURUSD"]; var AUDUSD = srsi["AUDUSD"]; var GBPUSD = srsi["GBPUSD"]; var NZDUSD = srsi["NZDUSD"]; var USDJPY = srsi["USDJPY"]; var USDCAD = srsi["USDCAD"]; var USDAUD = 100-AUDUSD; var USDEUR = 100-EURUSD; var USDGBP = 100-GBPUSD; var USDNZD = 100-NZDUSD; var eurIndex = (EURAUD+EURCAD+EURGBP+EURJPY+EURNZD+EURUSD+EURUSD+EURUSD)/8; var usdIndex = (USDAUD+USDCAD+USDGBP+USDJPY+USDNZD+USDEUR+USDEUR+USDEUR)/8; var EU = eurIndex-usdIndex; eu.Add(EU); if(!eu.IsReady) return; var midline = MA_Simple(1000,1001); var lag = (eu[0]+eu[1]+eu[2]+eu[3])/4; var a = eu[0]>lag; var CrossAbove = a; var CrossBelow = !a; var BelowMid = EU < midline; var AboveMid = EU > midline; var longCondition = CrossAbove && BelowMid; var shortCondition = CrossBelow && AboveMid; Long.Add(longCondition); if (!Long.IsReady) return; Short.Add(shortCondition); if (!Short.IsReady) return; var Buy = Long[0] && !Long[1]; var Sell = Short[0] && !Short[1]; if (Portfolio["EURUSD"].IsLong && Buy) { MarketOrder("EURUSD", qty, false, "Adding Long EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Adding " + qty + " long EURUSD at " + currentPrice); Notify.Sms("5714396200","Algorithm added long EURUSD"); Notify.Sms("4796502560","Algorithm added long EURUSD"); Notify.Sms("8188529720","Algorithm added long EURUSD"); Notify.Sms("2088663574","Algorithm added long EURUSD"); Notify.Sms("6315665273","Algorithm added long EURUSD"); Notify.Sms("6317042200","Algorithm added long EURUSD"); EPL = data["EURUSD"].Price; EntryTimeL = Time; ATRL = ATR; } if (!Portfolio["EURUSD"].IsLong && Buy) { if (Portfolio.Invested) { SetHoldings("EURUSD", 0, false, "Clear EURUSD"); } MarketOrder("EURUSD", qty, false, "Initial Long EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Opened " + qty + " long EURUSD at " + currentPrice); Notify.Sms("5714396200","Algorithm opened long EURUSD"); Notify.Sms("4796502560","Algorithm opened long EURUSD"); Notify.Sms("8188529720","Algorithm opened long EURUSD"); Notify.Sms("2088663574","Algorithm opened long EURUSD"); Notify.Sms("6315665273","Algorithm opened long EURUSD"); Notify.Sms("6317042200","Algorithm opened long EURUSD"); EntryTimeL = Time; EPL = data["EURUSD"].Price; ATRL = ATR; } var timeExit = (Time - EntryTimeL) >= TimeSpan.FromHours(holdTime); var stopL = EPL - data["EURUSD"].Price >= stopDistL; if (Portfolio["EURUSD"].IsLong && (timeExit||stopL)) { SetHoldings("EURUSD", 0, false, "Close EURUSD"); if (timeExit) { Log("Closed long due to time"); Notify.Sms("5714396200","Algorithm got timed out long EURUSD"); Notify.Sms("4796502560","Algorithm got timed out long EURUSD"); Notify.Sms("8188529720","Algorithm got timed out long EURUSD"); Notify.Sms("2088663574","Algorithm got timed out long EURUSD"); Notify.Sms("6315665273","Algorithm got timed out long EURUSD"); Notify.Sms("6317042200","Algorithm got timed out long EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Closed all EURUSD longs at " + currentPrice); } if(stopL) { Log("Closed long due to stop out"); Notify.Sms("5714396200","Algorithm got stopped out long EURUSD"); Notify.Sms("4796502560","Algorithm got stopped out long EURUSD"); Notify.Sms("8188529720","Algorithm got stopped out long EURUSD"); Notify.Sms("2088663574","Algorithm got stopped out long EURUSD"); Notify.Sms("6315665273","Algorithm got stopped out long EURUSD"); Notify.Sms("6317042200","Algorithm got stopped out long EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Closed all EURUSD longs at " + currentPrice); } } if (Portfolio["EURUSD"].IsShort && Sell) { MarketOrder("EURUSD", -qty, false, "Adding Short EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Adding " + qty + " short EURUSD at " + currentPrice); Notify.Sms("5714396200","Algorithm added short EURUSD"); Notify.Sms("4796502560","Algorithm added short EURUSD"); Notify.Sms("8188529720","Algorithm added short EURUSD"); Notify.Sms("2088663574","Algorithm added short EURUSD"); Notify.Sms("6315665273","Algorithm added short EURUSD"); Notify.Sms("6317042200","Algorithm added short EURUSD"); EPS = data["EURUSD"].Price; EntryTimeS = Time; ATRS = ATR; } if (!Portfolio["EURUSD"].IsShort && Sell) { if (Portfolio.Invested) { SetHoldings("EURUSD", 0, false, "Clear EURUSD"); } MarketOrder("EURUSD", -qty, false, "Initial Short EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Opened " + qty + " short EURUSD at " + currentPrice); Notify.Sms("5714396200","Algorithm opened short EURUSD"); Notify.Sms("4796502560","Algorithm opened short EURUSD"); Notify.Sms("8188529720","Algorithm opened short EURUSD"); Notify.Sms("2088663574","Algorithm opened short EURUSD"); Notify.Sms("6315665273","Algorithm opened short EURUSD"); Notify.Sms("6317042200","Algorithm opened short EURUSD"); EntryTimeS = Time; EPS = data["EURUSD"].Price; ATRS = ATR; } var timeExit1 = (Time - EntryTimeS) >= TimeSpan.FromHours(holdTime); var stopS = data["EURUSD"].Price-EPS >= stopDistS; if (Portfolio["EURUSD"].IsShort && (timeExit1||stopS)) { SetHoldings("EURUSD", 0, false, "Close EURUSD"); if (timeExit1) { Log("Closed short due to time"); Notify.Sms("5714396200","Algorithm got timed out short EURUSD"); Notify.Sms("4796502560","Algorithm got timed out short EURUSD"); Notify.Sms("8188529720","Algorithm got timed out short EURUSD"); Notify.Sms("2088663574","Algorithm got timed out short EURUSD"); Notify.Sms("6315665273","Algorithm got timed out short EURUSD"); Notify.Sms("6317042200","Algorithm got timed out short EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Closed all EURUSD shorts at " + currentPrice); } if(stopS) { Log("Closed short due to stop out"); Notify.Sms("5714396200","Algorithm got stopped out short EURUSD"); Notify.Sms("4796502560","Algorithm got stopped out short EURUSD"); Notify.Sms("8188529720","Algorithm got stopped out short EURUSD"); Notify.Sms("2088663574","Algorithm got stopped out short EURUSD"); Notify.Sms("6315665273","Algorithm got stopped out short EURUSD"); Notify.Sms("6317042200","Algorithm got stopped out short EURUSD"); Notify.Email("bullandmoon@gmail.com","EURUSD Algo Trade","Closed all EURUSD shorts at " + currentPrice); } } } } }