| Overall Statistics |
|
Total Trades 61 Average Win 1.50% Average Loss -1.21% Compounding Annual Return 3.261% Drawdown 13.800% Expectancy 0.301 Net Profit 8.356% Sharpe Ratio 0.463 Probabilistic Sharpe Ratio 14.547% Loss Rate 42% Win Rate 58% Profit-Loss Ratio 1.24 Alpha 0.025 Beta 0.043 Annual Standard Deviation 0.051 Annual Variance 0.003 Information Ratio 0.552 Tracking Error 0.076 Treynor Ratio 0.547 Total Fees $0.00 Estimated Strategy Capacity $380000.00 Lowest Capacity Asset USDJPY 8G |
# region imports
from AlgorithmImports import *
# endregion
class CustomIndexStrategy(QCAlgorithm):
def Initialize(self):
self.Pair_1 = "USDJPY"
self.holdingDays = 1
self.SetStartDate (2020, 1, 1)
self.SetEndDate(2022,7,1)
self.SetCash(10000)
self.SetBrokerageModel(BrokerageName.OandaBrokerage)
self.EURSEK = self.AddForex(self.Pair_1, Resolution.Daily, Market.Oanda)
self.symbols = [self.Pair_1]
self.prevPrices = { symbol : RollingWindow[QuoteBar](7) for symbol in self.symbols }
self.ticketPair1 = None
self.ticketPair2 = None
self.maximumholdingdays = 4
self.pas = False
self.volume = 2
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Friday), self.TimeRules.At(12, 0), self.MondayTrade)
def OnData(self,data):
self.quantity_1 = self.CalculateOrderQuantity(self.Pair_1 , self.volume)
for symbol in self.symbols:
if data.ContainsKey(symbol):
self.prevPrices[symbol].Add( data[symbol] )
if not all([ window.IsReady for window in self.prevPrices.values() ]):
return
self.pas = True
Pair1_window = self.prevPrices[self.Pair_1]
self.Pair1_6D = Pair1_window[6].Close
self.Pair1_5D = Pair1_window[5].Close
self.Pair1_4D = Pair1_window[4].Close
self.Pair1_3D = Pair1_window[3].Close
self.Pair1_2D = Pair1_window[2].Close
self.Pair1_1D = Pair1_window[1].Close
self.Pair1_0D = Pair1_window[0].Close
if self.ticketPair2 is not None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.UtcTime >= self.ticketPair2.Time + timedelta(days = self.maximumholdingdays):
self.Liquidate()
self.ticketPair2 = None
if self.ticketPair1 is not None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.UtcTime >= self.ticketPair1.Time + timedelta(days = self.maximumholdingdays):
self.Liquidate()
self.ticketPair1 = None
def MondayTrade(self):
if self.pas is False: return
if self.ticketPair2 is None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.Pair1_0D < self.Pair1_1D < self.Pair1_2D < self.Pair1_3D < self.Pair1_4D :
self.ticketPair2 = self.MarketOrder(self.Pair_1, self.quantity_1 )
self.priceLong= self.ticketPair2.AverageFillPrice
self.Log(self.priceLong)
if self.ticketPair1 is None and self.Securities[self.Pair_1].Exchange.ExchangeOpen is True and self.Pair1_0D > self.Pair1_1D > self.Pair1_2D > self.Pair1_3D > self.Pair1_4D :
self.ticketPair1 = self.MarketOrder(self.Pair_1, -self.quantity_1)
self.priceShort = self.ticketPair1.AverageFillPrice
self.Log(self.priceShort)