Overall Statistics |
Total Trades 291 Average Win 2.48% Average Loss -1.68% Compounding Annual Return -62.821% Drawdown 42.600% Expectancy -0.090 Net Profit -22.283% Sharpe Ratio -0.889 Loss Rate 63% Win Rate 37% Profit-Loss Ratio 1.47 Alpha -0.483 Beta 3.184 Annual Standard Deviation 0.648 Annual Variance 0.42 Information Ratio -0.865 Tracking Error 0.633 Treynor Ratio -0.181 Total Fees $0.00 |
import numpy as np import decimal import datetime, time from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * ### <summary> ### Basic template algorithm simply initializes the date range and cash. This is a skeleton ### framework you can use for designing an algorithm. ### </summary> class BasicTemplateAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2018,8,20) #Set Start Date self.SetEndDate(2018,11,20) #Set End Date self.SetCash(2000) #Set Strategy Cash self.forex = self.AddForex("EURUSD", Resolution.Hour, Market.Oanda) self.load_symbols() self.SetBenchmark("EURUSD") for symbol in self.symbols: self.WilliamsPercentR = self.WILR(symbol, 20, Resolution.Hour) #7200 #fast_period = 300 slow_period = 40 #was 5/27 resolution.HF #self.fast = self.EMA(symbol, fast_period) self.slow = self.EMA(symbol, slow_period) overlayPlot = Chart("Overlay Plot") overlayPlot.AddSeries(Series("EURUSD", SeriesType.Line, 0)) overlayPlot.AddSeries(Series("Buy", SeriesType.Scatter, 0)) overlayPlot.AddSeries(Series("Sell", SeriesType.Scatter, 0)) overlayPlot.AddSeries(Series("WilliamsPercentR", SeriesType.Line, 1)) #overlayPlot.AddSeries(Series("GBPNZD", SeriesType.Line, 2)) overlayPlot.AddSeries(Series("EMA_slow", SeriesType.Line, 2)) self.AddChart(overlayPlot) self.SetWarmup(slow_period) self.first = True def OnData(self, data): for symbol in self.symbols: if not self.WilliamsPercentR.IsReady: return # get the indicator value if self.first and not self.IsWarmingUp: self.first = False current = data[symbol].Value buy_signal_triggered, sell_signal_triggered = False, False willsignal = self.WilliamsPercentR.Current.Value if self.Portfolio["EURUSD"].Invested == False: if willsignal > -10 and self.Securities["EURUSD"].Price > self.slow.Current.Value: #go short self.Debug("Going SHORT, EUR invested is " + str(self.Portfolio["EURUSD"].Invested)) #self.Debug("portfolio invested is " + str(self.Portfolio.Cash)) takeProfit = decimal.Decimal(0.0200) stoploss = decimal.Decimal(0.0037) allocation = decimal.Decimal(5) invested = self.Portfolio.TotalPortfolioValue * allocation #Buy stop limit , stop price should be lower than limit price limitPrice = self.Securities["EURUSD"].Price - takeProfit stopLimit = self.Securities["EURUSD"].Price + stoploss self.MarketOrder("EURUSD", -invested) self.LimitOrder("EURUSD", invested, limitPrice) self.StopMarketOrder("EURUSD", invested, stopLimit) #verified it works because my losses didn't exceed 2.5% a day sell_signal_triggered = True if self.Portfolio["GBPNZD"].Invested == False: if willsignal > -10 and self.Securities["GBPNZD"].Price > self.slow.Current.Value: #go short self.Debug("Going SHORT, gbp invested is " + str(self.Portfolio["GBPNZD"].Invested)) takeProfit = decimal.Decimal(0.0200) stoploss = decimal.Decimal(0.0037) allocation = decimal.Decimal(5) invested = self.Portfolio.TotalPortfolioValue * allocation #Buy stop limit , stop price should be lower than limit price limitPrice = self.Securities["GBPNZD"].Price - takeProfit stopLimit = self.Securities["GBPNZD"].Price + stoploss self.MarketOrder("GBPNZD", -invested) self.LimitOrder("GBPNZD", invested, limitPrice) self.StopMarketOrder("GBPNZD", invested, stopLimit) #verified it works because my losses didn't exceed 2.5% a day sell_signal_triggered = True if self.Portfolio["EURUSD"].Invested == False: if willsignal < -90 and self.Securities[symbol].Price < self.slow.Current.Value: #go long self.Debug("Going Long EUR invested is " + str(self.Portfolio["EURUSD"].Invested)) takeProfit = decimal.Decimal(0.0200) stoploss = decimal.Decimal(0.0037) allocation = decimal.Decimal(5) invested = self.Portfolio.TotalPortfolioValue * allocation #Buy stop limit , stop price should be lower than limit price limitPrice = self.Securities["EURUSD"].Price + takeProfit stopLimit = self.Securities["EURUSD"].Price - stoploss self.MarketOrder("EURUSD", invested) self.LimitOrder("EURUSD", -invested, limitPrice) self.StopMarketOrder("EURUSD", -invested, stopLimit) #verified it works because my losses didn't exceed 2.5% a day #self.Debug(" portfolio invested NOW is " + str(self.Portfolio.Invested)) buy_signal_triggered = True if self.Portfolio["GBPNZD"].Invested == False: if willsignal < -90 and self.Securities["GBPNZD"].Price < self.slow.Current.Value: #go long self.Debug("Going Long GBP invested is " + str(self.Portfolio["GBPNZD"].Invested)) takeProfit = decimal.Decimal(0.0200) stoploss = decimal.Decimal(0.0037) allocation = decimal.Decimal(5) invested = self.Portfolio.TotalPortfolioValue * allocation #Buy stop limit , stop price should be lower than limit price limitPrice = self.Securities["GBPNZD"].Price + takeProfit stopLimit = self.Securities["GBPNZD"].Price - stoploss self.MarketOrder("GBPNZD", invested) self.LimitOrder("GBPNZD", -invested, limitPrice) self.StopMarketOrder("GBPNZD", -invested, stopLimit) #verified it works because my losses didn't exceed 2.5% a day #self.Debug(" portfolio invested NOW is " + str(self.Portfolio.Invested)) buy_signal_triggered = True if self.Portfolio["GBPNZD"].Invested == True: if self.Portfolio["GBPNZD"].IsLong: if willsignal > -50 and (self.Securities["GBPNZD"].Price <= self.slow.Current.Value): self.Liquidate("GBPNZD") self.Debug("GBPNZD liquidated is " + str(self.Portfolio["GBPNZD"].Invested)) #self.Debug("post sale cash is " + str(self.Portfolio.Cash)) if self.Portfolio["GBPNZD"].IsShort: if willsignal < -50 and (self.Securities["GBPNZD"].Price >= self.slow.Current.Value): self.Liquidate("GBPNZD") if self.Portfolio["EURUSD"].Invested == True: if self.Portfolio["EURUSD"].IsLong: if willsignal > -50 and (self.Securities["EURUSD"].Price <= self.slow.Current.Value): self.Liquidate("EURUSD") self.Debug("EUR liquidated is " + str(self.Portfolio["EURUSD"].Invested)) #self.Debug("post sale cash is " + str(self.Portfolio.Cash)) if self.Portfolio["EURUSD"].IsShort: if willsignal < -50 and (self.Securities["EURUSD"].Price >= self.slow.Current.Value): self.Liquidate("EURUSD") if buy_signal_triggered: self.Plot("Overlay Plot", "Buy", current) elif sell_signal_triggered: self.Plot("Overlay Plot", "Sell", current) self.Plot("Overlay Plot", "EURUSD", current) self.Plot("Overlay Plot", "EMA_slow", self.slow.Current.Value) self.Plot("Overlay Plot", "WilliamsPercentR", self.WilliamsPercentR.Current.Value) def load_symbols(self) : syl_list = [ 'EURUSD', 'GBPNZD', ] self.symbols = [] for i in syl_list: self.symbols.append(self.AddForex(i, Resolution.Hour, Market.Oanda).Symbol)