| Overall Statistics |
|
Total Trades 529 Average Win 0.04% Average Loss -0.02% Compounding Annual Return 0.158% Drawdown 0.900% Expectancy 0.054 Net Profit 0.307% Sharpe Ratio 0.3 Loss Rate 62% Win Rate 38% Profit-Loss Ratio 1.81 Alpha 0.005 Beta -0.225 Annual Standard Deviation 0.004 Annual Variance 0 Information Ratio -3.469 Tracking Error 0.004 Treynor Ratio -0.006 Total Fees $0.00 |
import decimal as d
import datetime
from datetime import timedelta
class ParameterizedAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2016,2,1) #Set Start Date
self.SetEndDate(2017,12,30) #Set End Date
self.SetCash(1000) #Set Strategy Cash
# Find more symbols here: http://quantconnect.com/data
self.SetBrokerageModel(BrokerageName.OandaBrokerage)
self.forex = self.AddSecurity(SecurityType.Forex, "EURUSD", Resolution.Hour)
self.chosenForex = self.forex.Symbol
self.Securities[self.chosenForex].SetLeverage(20)
self.Log("~~~~~~~~~~~LEVERAGE~~~~~~~~~~~~")
self.Log(str(self.Securities[self.chosenForex].Leverage))
self.Log("~~~~~~~~~~~OPEN HOURS~~~~~~~~~~~~")
self.Log(str(self.Securities[self.chosenForex].Exchange.TradingDaysPerYear))
self.HMAValue30 = self.HMA(self.chosenForex, 30, Resolution.Hour)
self.HMAValue20 = self.HMA(self.chosenForex, 20, Resolution.Hour)
self.HMAValue10 = self.HMA(self.chosenForex, 10, Resolution.Hour)
self.PSARValue = self.PSAR(self.chosenForex, d.Decimal(0.002), d.Decimal(0.002), d.Decimal(0.2), Resolution.Hour)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday, DayOfWeek.Friday), self.TimeRules.At(17, 0), Action(self.EveryWeekBeforeMarketClose))
self.Schedule.On(self.DateRules.Every(DayOfWeek.Sunday, DayOfWeek.Sunday), self.TimeRules.At(17, 0), Action(self.EveryWeekAfterMarketOpen))
self.IsInvested = False
self.StopLoss = None
self.ProfitTake = None
self.MarketIsOpen = False
self.repeatSell = False
self.repeatBuy = False
self.HMA30History = []
self.HMA20History = []
self.HMA10History = []
self.HMA30HistoryLength = 3
self.HMA20HistoryLength = 3
self.HMA10HistoryLength = 3
self.PSARHistory =[]
self.PSARHistoryLength = 3
self.PriceHistory = []
self.PriceHistoryLength = 3
self.PreviousHMA = 0
self.Log("USDJPY START")
self.SetWarmUp(200)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.'''
currentPrice = data[self.chosenForex].Value
self.currentPrice = data[self.chosenForex].Value
if len(self.PriceHistory) >= self.PriceHistoryLength:
self.PriceHistory.pop(0)
self.PriceHistory.append(data[self.chosenForex].Value)
if len(self.HMA30History) >= self.HMA30HistoryLength:
self.HMA30History.pop(0)
self.HMA30History.append(self.HMAValue30.Current.Value)
if len(self.HMA20History) >= self.HMA20HistoryLength:
self.HMA20History.pop(0)
self.HMA20History.append(self.HMAValue20.Current.Value)
if len(self.HMA10History) >= self.HMA10HistoryLength:
self.HMA10History.pop(0)
self.HMA10History.append(self.HMAValue10.Current.Value)
if len(self.PSARHistory) >= self.PSARHistoryLength:
self.PSARHistory.pop(0)
self.PSARHistory.append(self.PSARValue.Current.Value)
if len(self.HMA30History) < self.HMA30HistoryLength or not self.HMAValue30.IsReady:
return
OneTwoThreeHMA = False
if self.HMAValue10.Current.Value > self.HMAValue20.Current.Value and self.HMAValue20.Current.Value > self.HMAValue30.Current.Value:
OneTwoThreeHMA = True
HMAInUpturn = self.HMA30History[0] < self.HMA30History[1] and self.HMA30History[2] > self.HMA30History[1]
HMAInDownturn = self.HMA30History[2] < self.HMA30History[1]
PSARInBull = data[self.chosenForex].Value > self.PSARValue.Current.Value
if self.currentPrice > 0:
self.Plot("Price", "Price", d.Decimal(10000*d.Decimal(self.currentPrice)))
self.Plot("Price", "HMA30", d.Decimal(10000*d.Decimal(self.HMAValue30.Current.Value)))
self.Plot("Price", "HMA20", d.Decimal(10000*d.Decimal(self.HMAValue20.Current.Value)))
self.Plot("Price", "HMA10", d.Decimal(10000*d.Decimal(self.HMAValue10.Current.Value)))
self.Plot("Price", "PSAR", d.Decimal(10000*d.Decimal(self.PSARValue.Current.Value)))
if self.IsWarmingUp:
return
if HMAInUpturn and PSARInBull and self.MarketIsOpen and not self.IsInvested:
self.Log("BOUGHT!")
marketOrder = self.MarketOrder(self.chosenForex, 100, False, "MarketOrder in intial investment in Ondata")
if marketOrder.Status == OrderStatus.Filled:
self.IsInvested = True
#self.ProfitTake = self.LimitOrder(self.chosenForex, -100, d.Decimal(data[self.chosenForex].Value + d.Decimal(0.05)), "Profit take in initial investment")
#self.StopLoss = self.StopMarketOrder(self.chosenForex, -100, d.Decimal(data[self.chosenForex].Value - d.Decimal(0.05)), "Loss stop in initial investment")
else:
marketOrder.Cancel("Order not filled so cancelled")
elif (HMAInDownturn or not PSARInBull) and self.IsInvested:
self.Log("SOLD!")
marketOrder = self.Liquidate(self.chosenForex)
#self.StopLoss.Cancel("Bull Market so stoploss cancelled.")
#self.ProfitTake.Cancel("Bull Market so takeprofit cancelled.")
self.IsInvested = False
#def OnEndOfDay(self):
# if self.currentPrice > 0:
# self.Plot("Price", "Price", d.Decimal(10000*d.Decimal(self.currentPrice)))
#self.Plot("RSI", "RSIValue", d.Decimal(self.RSIValue.Current.Value))
def EveryWeekBeforeMarketClose(self):
self.Liquidate(self.chosenForex)
self.MarketIsOpen = False
def EveryWeekAfterMarketOpen(self):
self.MarketIsOpen = True