| Overall Statistics |
|
Total Trades 967 Average Win 0.49% Average Loss -1.23% Compounding Annual Return -61.474% Drawdown 87.000% Expectancy -0.160 Net Profit -59.718% Sharpe Ratio -0.36 Probabilistic Sharpe Ratio 5.945% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 0.40 Alpha -0.225 Beta -0.501 Annual Standard Deviation 0.863 Annual Variance 0.745 Information Ratio -0.5 Tracking Error 0.967 Treynor Ratio 0.621 Total Fees $102.76 |
class TwoEMAstrategyForex(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 15) # Set Start Date
self.SetCash(1000) # Set Strategy Cash
self.SetBrokerageModel(BrokerageName.FxcmBrokerage, AccountType.Margin)
self.currency_pair = self.GetParameter("currency_pair") #grab currency pair from Algorithm Parameters
self.AddForex(self.currency_pair, Resolution.Minute)
self.Consolidate(self.currency_pair, timedelta(minutes=15), self.OnDataConsolidated)
self.closeWindow = RollingWindow[float](2) #create a rolling window to store
self.SetWarmUp(200)
self.RRR = float(self.GetParameter("RRR")) #Reward Risk ratio
self.risk = float(self.GetParameter("risk")) # % of account to risk at SL
self.distance = float(self.GetParameter("deltaDistance"))
self.emaFast = ExponentialMovingAverage(9)
self.RegisterIndicator(self.currency_pair, self.emaFast, timedelta(minutes=15))
self.emaSlow = ExponentialMovingAverage(21)
self.RegisterIndicator(self.currency_pair, self.emaSlow, timedelta(minutes=15))
self.emaTrend = ExponentialMovingAverage(200)
self.RegisterIndicator(self.currency_pair, self.emaTrend, timedelta(minutes=15))
self.long = False
def OnData(self, data):
pass
def OnDataConsolidated(self, bar):
self.currentBar = bar #this is the current quote bar
self.closedBar = float((self.currentBar).Close)
#self.Debug(str((self.currentBar).Close))
if not self.emaSlow.IsReady or not self.emaFast.IsReady or not self.emaTrend.IsReady:
pass
#check if 9EMA > 21EMA
if self.emaFast.Current.Value > self.emaSlow.Current.Value:
#check if price is above 200EMA
#if self.closedBar > self.emaTrend.Current.Value:
#check if last was short
if self.long == False:
#Calcualte Quantity to buy
#self.Portfolio.MarginRemaining
self.quantity = ((float(self.Portfolio.MarginRemaining) * self.risk)/self.distance)
self.MarketOrder(self.currency_pair, self.quantity)
self.StopMarketOrder(self.currency_pair, self.quantity * -1, self.closedBar - self.distance)
self.LimitOrder(self.currency_pair, self.quantity * -1, self.closedBar + self.distance*self.RRR)
#signal last was long
self.long = True
#check if 9EMA < 21EMA
elif self.emaFast.Current.Value < self.emaSlow.Current.Value:
#check if price is below 200EMA
#if self.closedBar < self.emaTrend.Current.Value:
#check if last was long
if self.long == True:
#self.Portfolio.MarginRemaining
self.quantity = ((float(self.Portfolio.MarginRemaining) * self.risk)/self.distance)
self.MarketOrder(self.currency_pair, self.quantity * -1)
self.StopMarketOrder(self.currency_pair, self.quantity, self.closedBar + self.distance)
self.LimitOrder(self.currency_pair, self.quantity, self.closedBar - self.distance*self.RRR)
#signal last was short
self.long = False
self.closeWindow.Add(str((self.currentBar).Close))