Overall Statistics |
Total Trades 83 Average Win 1.82% Average Loss -1.18% Compounding Annual Return -20.268% Drawdown 12.900% Expectancy -0.256 Net Profit -10.841% Sharpe Ratio -0.904 Loss Rate 71% Win Rate 29% Profit-Loss Ratio 1.54 Alpha -0.207 Beta -0.731 Annual Standard Deviation 0.182 Annual Variance 0.033 Information Ratio -0.509 Tracking Error 0.208 Treynor Ratio 0.225 Total Fees $0.00 |
import numpy as np import decimal from datetime import datetime 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,3,20) #Set Start Date self.SetEndDate(2018,9,20) #Set End Date self.SetCash(50000) #Set Strategy Cash self.forex = self.AddForex("EURUSD", Resolution.Hour, Market.Oanda) self.load_symbols() self.SetBenchmark("EURUSD") for symbol in self.symbols: self.MovingAverageConvergenceDivergence = self.MACD(symbol, 9, 20, 9, MovingAverageType.Exponential, Resolution.Hour) fast_period = 5 slow_period = 25 #was 27 but i am trying to test my indicators 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("MACD", SeriesType.Line, 1)) overlayPlot.AddSeries(Series("MACD_Signal", SeriesType.Line, 1)) overlayPlot.AddSeries(Series("EMA", 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.MovingAverageConvergenceDivergence.IsReady: return # get the indicator value if self.first and not self.IsWarmingUp: self.first = False #define a small tolerance on our checks to avoid bouncing? tolerance = 0.0015 #intolerance = 0.00005 signalDeltaPercent = self.MovingAverageConvergenceDivergence.Signal.Current.Value current = data[symbol].Value highVector = decimal.Decimal(1.0015) lowVector = decimal.Decimal(0.9995) buy_signal_triggered, sell_signal_triggered = False, False if not self.Portfolio.Invested: if self.Portfolio.Invested <= 500000: if (self.fast.Current.Value * lowVector) < self.slow.Current.Value and signalDeltaPercent < -tolerance: #downtrend, go short #set stop price and limit price at +-2% onePercent = decimal.Decimal(1.00217) takeProfit = decimal.Decimal(0.99617) #raised this from 99617 to try to increase profits twoPercent = decimal.Decimal(1.00261) #was 1.00261 allocation = decimal.Decimal(6) invested = self.Portfolio.TotalPortfolioValue * allocation #Buy stop limit , stop price should be lower than limit price stopPrice = self.Securities[symbol].Price * onePercent limitPrice = self.Securities[symbol].Price * takeProfit stopLimit = self.Securities[symbol].Price * twoPercent #self.Debug("signalDeltaPercent is " + str(signalDeltaPercent)) self.MarketOrder(symbol, -invested) #self.LimitOrder(symbol, invested, limitPrice) #self.Debug(self.Portfolio.TotalPortfolioValue) self.StopMarketOrder(symbol, invested, stopLimit) #verified it works because my losses didn't exceed 2.5% a day sell_signal_triggered = True if not self.Portfolio.Invested: if self.Portfolio.Invested <= 500000: if (self.fast.Current.Value * highVector) > self.slow.Current.Value and signalDeltaPercent > tolerance: #uptrend, Go Long #set stop price and limit price at +-2% onePercent = decimal.Decimal(0.99773) takeProfit = decimal.Decimal(1.00461) #raised this from 00461 to try to increase profits twoPercent = decimal.Decimal(0.99897) #was 0.99897 and i was getting 0.00248 pips/0.07% loss days allocation = decimal.Decimal(6) invested = self.Portfolio.TotalPortfolioValue * allocation #Buy stop limit , stop price should be lower than limit price stopPrice = self.Securities[symbol].Price * onePercent limitPrice = self.Securities[symbol].Price * takeProfit stopLimit = self.Securities[symbol].Price * twoPercent self.MarketOrder(symbol, invested) #self.LimitOrder(symbol, -invested, limitPrice) #sell shares if SL/TP self.StopMarketOrder(symbol, -invested, stopLimit) #verified it works because my losses didn't exceed 2.5% a day buy_signal_triggered = True if self.Portfolio.Invested: highVector = decimal.Decimal(1.005) lowVector = decimal.Decimal(0.9994) if self.Portfolio[symbol].IsLong: if (self.fast.Current.Value * lowVector) < self.slow.Current.Value: # and signalDeltaPercent > 0: self.Liquidate(symbol) if self.Portfolio[symbol].IsShort: if (self.fast.Current.Value * highVector) > self.slow.Current.Value: # and signalDeltaPercent < 0: self.Liquidate(symbol) 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", "MACD_Signal", float(self.MovingAverageConvergenceDivergence.Signal.Current.Value)) self.Plot("Overlay Plot", "EMA", self.fast.Current.Value) self.Plot("Overlay Plot", "EMA_slow", self.slow.Current.Value) def load_symbols(self) : syl_list = [ 'EURUSD', #'USDCAD', #'AUDUSD', #'USDCHF', ] self.symbols = [] for i in syl_list: self.symbols.append(self.AddForex(i, Resolution.Hour, Market.Oanda).Symbol)