| Overall Statistics |
|
Total Trades 21 Average Win 4.95% Average Loss -13.79% Compounding Annual Return -15.026% Drawdown 44.900% Expectancy -0.185 Net Profit -28.691% Sharpe Ratio -0.241 Probabilistic Sharpe Ratio 1.475% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 0.36 Alpha -0.066 Beta -0.146 Annual Standard Deviation 0.286 Annual Variance 0.082 Information Ratio -0.304 Tracking Error 0.292 Treynor Ratio 0.471 Total Fees $0.00 |
import pandas as pd
from datetime import timedelta, datetime
from System.Drawing import Color
class InsideDayBreakout(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 1) # Set Start Date
self.SetCash(1000) # Set Strategy Cash
self.AddForex("USDJPY", Resolution.Daily,Market.Oanda)
self.SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin)
self.SetTimeZone(TimeZones.Utc)
self.SetWarmUp(3)
self.riskPercentage = 7
self.lastOrderEvent = None
self.insideDay = False
self.window = RollingWindow[QuoteBar](3)
self.buyTicket = None
self.sellTicket = None
pricePlot = Chart('Chart Data')
pricePlot.AddSeries(Series('Open',SeriesType.Candle,0))
pricePlot.AddSeries(Series('High',SeriesType.Candle,0))
pricePlot.AddSeries(Series('Low',SeriesType.Candle,0))
pricePlot.AddSeries(Series('Close',SeriesType.Candle,0))
self.AddChart(pricePlot)
def OnData(self, data):
if data.ContainsKey("USDJPY"):
self.window.Add(data["USDJPY"])
self.Plot('Chart Data', 'Open',data.QuoteBars["USDJPY"].Open)
self.Plot('Chart Data', 'High', data.QuoteBars["USDJPY"].High)
self.Plot('Chart Data', 'Low', data.QuoteBars["USDJPY"].Low)
self.Plot('Chart Data', 'Close', data.QuoteBars["USDJPY"].Close)
if not self.window.IsReady:
return
self.todaysHigh = self.window[0].High
self.todaysLow = self.window[0].Low
self.yesterdaysHigh = self.window[1].High
self.yesterdaysLow = self.window[1].Low
if (self.todaysHigh < self.yesterdaysHigh and self.todaysLow > self.yesterdaysLow and self.Time.weekday() != 6):
self.insideDay = True
self.Log("Inside Day")
if self.insideDay == True:
self.buyPrice = round(self.todaysHigh,3)
self.sellPrice = round(self.todaysLow,3)
self.hlRange = round(self.todaysHigh - self.todaysLow,3)
self.Quantity = (self.riskPercentage / 100 * self.Portfolio.Cash * self.window[0].Close) / self.hlRange
#Placing buy orders if inside bar true and not Sunday
if not self.Portfolio.Invested and self.insideDay == True:
#place buyorders to open
self.buyEntryTicket = self.StopMarketOrder("USDJPY", self.Quantity, self.buyPrice)
self.sellEntryTicket = self.StopMarketOrder("USDJPY", -self.Quantity, self.sellPrice)
#place first limit order
self.firstBuyTarget = self.LimitOrder("USDJPY", -self.Quantity, self.buyPrice + self.hlRange)
self.firstSellTarget = self.LimitOrder("USDJPY", self.Quantity, self.sellPrice - self.hlRange)
#place second limit order
#self.secondBuyTarget = self.LimitOrder("USDJPY", -self.remainingQuantity, self.buyPrice + 0.5 * self.hlRange)
#self.secondSellTarget = self.LimitOrder("USDJPY", self.remainingQuantity, self.buyPrice - 0.5 * self.hlRange)
#place stop order
self.buyStopLoss = self.StopMarketOrder("USDJPY", -self.Quantity, self.sellPrice)
self.sellStopLoss = self.StopMarketOrder("USDJPY", self.Quantity, self.buyPrice)
#message oders placed
self.Debug("Stop entry orders placed")
#self.sellTicket = self.StopMarketOrder("USDJPY", - self.Quantity, self.sellPrice)
def OnOrderEvent(self, orderEvent):
if orderEvent.Status != OrderStatus.Filled:
return
#cancel sell limit oders if stop order hit
if self.buyStopLoss.Status == OrderStatus.Filled:
self.firstBuyTarget.Cancel
#self.secondBuyTarget.Cancel
self.Debug("long position stopped out, limit orders cancelled")
#cancel sell stop orders if limit orders hit
if self.firstBuyTarget.Status == OrderStatus.Filled:
self.buyStopLoss.Cancel
self.Debug("buy target reached, stop cancelled")
#cancel buy limit oders if stop order hit
if self.sellStopLoss.Status == OrderStatus.Filled:
self.firstSellTarget.Cancel
#self.secondBuyTarget.Cancel
self.Debug("short position stopped out, limit orders cancelled")
#cancel sell stop orders if limit orders hit
if self.firstSellTarget.Status == OrderStatus.Filled:
self.sellStopLoss.Cancel
self.Debug("sell target reached, stop cancelled")
#update quantity for second target and stop order
#if self.firstBuyTarget.Status == OrderStatus.Filled:
#updateSettings = UpdateOrderFields()
#updateSettings.Quantity = self.Portfolio["USDJPY"].Quantity *-1
#self.buyStopLoss.Update(updateSettings)
#self.secondBuyTarget.Update(updateSettings)
#self.Debug("Order quantity updated")
#if self.sellTicket.Status == OrderStatus.Filled:
#self.profitTargetOne = self.sellPrice - 0.5 * self.hlRange
#self.profitTargetTwo = self.sellPrice - self.hlRange
#self.LimitOrder("USDJPY", 0.5 * self.Quantity, self.profitTargetOne)
#self.LimitOrder("USDJPY", 0.5 * self.Quantity, self.profitTagetTwo)
#self.StopMarketOrder("USDJPY", self.Quantity, self.buyPrice)
#self.Debug("SX - Limit and stop order placed")