| Overall Statistics |
|
Total Trades 135 Average Win 3.05% Average Loss -1.67% Compounding Annual Return 4.462% Drawdown 24.600% Expectancy 0.263 Net Profit 57.657% Sharpe Ratio 0.403 Loss Rate 55% Win Rate 45% Profit-Loss Ratio 1.82 Alpha 0.037 Beta 0.235 Annual Standard Deviation 0.101 Annual Variance 0.01 Information Ratio 0.241 Tracking Error 0.101 Treynor Ratio 0.173 Total Fees $0.00 |
class Crossing(QCAlgorithm):
'''Basic template algorithm simply initializes the date range and cash'''
def Initialize(self):
'''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
self.SetTimeZone("Africa/Douala")
self.SetStartDate(2009,1, 1) #Set Start Date
self.SetEndDate(2019,6, 3) #Set End Date
self.SetCash(1000) #Set Strategy Cash
self.ProfitTarget = None
self.StopLoss = None
# Find more symbols here: http://quantconnect.com/data
self.eurusd = self.AddForex("EURUSD", Resolution.Daily)
self.window = RollingWindow[QuoteBar](53)
self.ichi = self.ICHIMOKU("EURUSD", 9, 26, 26, 52, 26, 26, Resolution.Daily)
self.ichi.Updated += self.ichiUpdated
self.ichiWin = RollingWindow[IndicatorDataPoint](2)
def ichiUpdated(self, sender, updated):
'''Adds updated values to rolling window'''
self.ichiWin.Add(updated)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
if data.ContainsKey("EURUSD"):
self.window.Add(data["EURUSD"])
# Wait for windows to be ready.
if not (self.window.IsReady and self.ichi.IsReady): return
currBar = self.window[0]
prev1 = self.window[1]
self.Debug("Price: {0} -> {1} ... {2} -> {3}".format(
prev1.Time, prev1.Low,
currBar.Time, currBar.Low
)
)
#self.Debug(str(self.ichi.Tenkan)+" "+str(self.ichi.Kijun))
sl = min([currBar.Low, prev1.Low])
tp = currBar.Open + ((prev1.Close - sl) * 1.5)
self.Debug("Prev open {} kijun {} prev close {}".format(prev1.Open, self.ichi.Kijun, prev1.Close))
self.Debug("Tenken {}, Kijun {}, Senkoua {} and SenkouB {}".format(self.ichi.Tenkan, self.ichi.Kijun, self.ichi.SenkouA, self.ichi.SenkouB))
if not self.Portfolio.Invested:
if prev1.Open < self.ichi.Kijun.Current.Value and prev1.Close > self.ichi.Kijun.Current.Value:
self.Debug("OK ooh")
self.MarketOrder("EURUSD", 2000)
self.ProfitTarget = self.LimitOrder("EURUSD", -2000, round(tp, 5))
self.StopLoss = self.StopMarketOrder("EURUSD", -2000, round(sl, 5))
def OnOrderEvent(self, orderEvent):
if not self.StopLoss or not self.ProfitTarget: return;
filledOrderId = orderEvent.OrderId
if self.StopLoss.OrderId == filledOrderId:
self.ProfitTarget.Cancel()
if self.ProfitTarget.OrderId == filledOrderId:
self.StopLoss.Cancel()