Overall Statistics |
Total Trades 3121 Average Win 0.06% Average Loss -0.04% Compounding Annual Return -4.445% Drawdown 15.900% Expectancy -0.261 Net Profit -15.650% Sharpe Ratio -1.633 Loss Rate 71% Win Rate 29% Profit-Loss Ratio 1.56 Alpha -0.031 Beta 0.002 Annual Standard Deviation 0.019 Annual Variance 0 Information Ratio -0.88 Tracking Error 0.106 Treynor Ratio -20.128 Total Fees $0.00 |
namespace QuantConnect { public class BasicTemplateAlgorithm : QCAlgorithm { private List<string> tickers = new List<string>(); private Dictionary<string, RelativeStrengthIndex> rsiDict = new Dictionary<string, RelativeStrengthIndex>(); private Dictionary<string, StandardDeviation> stdevDict = new Dictionary<string, StandardDeviation>(); private RelativeStrengthIndex rsi; private StandardDeviation stdev; public Resolution resolution = Resolution.Hour; //private decimal takeProfit = 0.00035m; private decimal leverage = 0.9m; private decimal shock = 2m; public override void Initialize() { tickers.Add("EURUSD"); tickers.Add("GBPUSD"); tickers.Add("USDJPY"); tickers.Add("AUDUSD"); //tickers.Add("EURJPY"); //tickers.Add("USDCAD"); //tickers.Add("EURGBP"); //tickers.Add("USDCHF"); //tickers.Add("USDMXN"); //tickers.Add("NZDUSD"); //tickers.Add("EURCHF"); //tickers.Add("USDRUB"); //tickers.Add("USDZAR"); //tickers.Add("USDSGD"); //tickers.Add("USDTRY"); //tickers.Add("EURSEK"); //tickers.Add("GBPJPY"); //tickers.Add("EURAUD"); //tickers.Add("EURNOK"); //tickers.Add("USDINR"); //tickers.Add("USDPLN"); //tickers.Add("USDCNY"); SetStartDate(2014, 1, 1); SetCash(100000); SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Cash); foreach (String fxPair in tickers){ AddForex(fxPair, resolution, Market.Oanda); Securities[fxPair].FeeModel = new OandaTransactionModel(); rsiDict[fxPair] = RSI(fxPair, 14); stdevDict[fxPair] = STD(fxPair, 14); var history = History<QuoteBar>(fxPair, 125); foreach (var quoteBar in history) { rsiDict[fxPair].Update(quoteBar.EndTime, quoteBar.Close); stdevDict[fxPair].Update(quoteBar.EndTime, quoteBar.Close); } } } public void OnData(QuoteBars data) { int toTrade = 0; List<string> longs = new List<string>(); List<string> shorts = new List<string>(); foreach(String fxPair in tickers){ if(data.ContainsKey(fxPair) == false){ Log("not there"); break; } Transactions.CancelOpenOrders(fxPair); SetHoldings(fxPair,0); rsi = rsiDict[fxPair]; stdev = stdevDict[fxPair]; if (!rsi.IsReady || !stdev.IsReady) return; decimal close = data[fxPair].Close; decimal open = data[fxPair].Open; bool greenBar = close > open; bool redBar = close < open; bool overBought = rsi.Current > 70; bool overSold = rsi.Current < 30; bool overShock = Math.Abs(close - open) > (shock*stdevDict[fxPair].Current); if((greenBar && overBought && overShock) && (Portfolio[fxPair].Quantity == 0)){ toTrade +=1; longs.Add(fxPair); } if((redBar && overSold && overShock) && (Portfolio[fxPair].Quantity == 0)){ toTrade +=1; shorts.Add(fxPair); } } if(toTrade == 0){ return; } decimal cash = (Portfolio.Cash * leverage) / toTrade; foreach(String fxPair in longs){ int shares = (int)(cash/data[fxPair].Price); MarketOrder(fxPair,shares); //LimitOrder(fxPair,-shares,data[fxPair].Price*(1+takeProfit)); } foreach(String fxPair in shorts){ int shares = (int)(cash/data[fxPair].Price); MarketOrder(fxPair,-shares); //StopMarketOrder(fxPair,shares,data[fxPair].Price*(1-takeProfit)); } } } }