Overall Statistics |
Total Trades 726 Average Win 0.07% Average Loss -0.07% Compounding Annual Return -73.666% Drawdown 7.600% Expectancy -0.273 Net Profit -6.368% Sharpe Ratio -11.058 Loss Rate 66% Win Rate 34% Profit-Loss Ratio 1.13 Alpha -0.828 Beta 0.801 Annual Standard Deviation 0.083 Annual Variance 0.007 Information Ratio -11.003 Tracking Error 0.073 Treynor Ratio -1.144 Total Fees $0.00 |
namespace QuantConnect.MAAlgorithm { public class MAAlgorithm : QCAlgorithm { public string[] Symbols = {"EURUSD","NZDUSD","AUDUSD","USDCAD"}; private Dictionary<string, RollingWindow<QuoteBar>> _windows = new Dictionary<string, RollingWindow<QuoteBar>>(); private Dictionary<string, ExponentialMovingAverage> fast = new Dictionary<string, ExponentialMovingAverage>(); private Dictionary<string, ExponentialMovingAverage> slow = new Dictionary<string, ExponentialMovingAverage>(); public override void Initialize() { SetStartDate(2017, 04, 01); SetEndDate(2017, 04, 20); SetCash(10000); SetBrokerageModel(BrokerageName.OandaBrokerage); foreach (var symbol in Symbols) { AddSecurity(SecurityType.Forex, symbol, Resolution.Hour); Securities[symbol].FeeModel = new ConstantFeeModel(0); _windows[symbol] = new RollingWindow<QuoteBar>(2); fast[symbol] = EMA(symbol, 13, Resolution.Hour); slow[symbol] = EMA(symbol, 48, Resolution.Hour); } } public void OnData(QuoteBars data) { foreach (var symbol in Symbols) { var holdingsL = Portfolio[symbol].IsLong; var holdingsS = Portfolio[symbol].IsShort; var currentHigh = data[symbol].High; var currentLow = data[symbol].Low; var quantity = 10000; _windows[symbol].Add(data[symbol]); if (!_windows[symbol].IsReady) return; var previousLow = _windows[symbol][1].Low; var previousHigh = _windows[symbol][1].High; if (!holdingsL && fast[symbol] > slow[symbol]) { Log("Long " + symbol + " at " + Securities[symbol].Price); MarketOrder(symbol, quantity); } if (holdingsL && ((currentLow < previousLow) || (fast[symbol] < slow[symbol]))) { Log("Sold " + symbol + " at " + Securities[symbol].Price); Liquidate(symbol); } if (!holdingsS && fast[symbol] < slow[symbol]) { Log("Short " + symbol + " at " + Securities[symbol].Price); MarketOrder(symbol, -quantity); } if (holdingsS && ((currentHigh > previousHigh) || (fast[symbol] > slow[symbol]))) { Log("Covered " + symbol + " at " + Securities[symbol].Price); Liquidate(symbol); } } } } }