| Overall Statistics |
|
Total Trades 311 Average Win 0.05% Average Loss -0.05% Compounding Annual Return 0.426% Drawdown 1.400% Expectancy 0.036 Net Profit 0.284% Sharpe Ratio 0.169 Probabilistic Sharpe Ratio 20.580% Loss Rate 45% Win Rate 55% Profit-Loss Ratio 0.87 Alpha 0.005 Beta 0.036 Annual Standard Deviation 0.018 Annual Variance 0 Information Ratio 0.941 Tracking Error 0.047 Treynor Ratio 0.086 Total Fees $0.00 Estimated Strategy Capacity $5100000.00 Lowest Capacity Asset USDJPY 8G |
from System.Drawing import Color
import math
class HyperActiveRedBear(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 2, 6) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin)
self.Pair = self.AddForex('USDJPY', Resolution.Minute, Market.Oanda, leverage=50)
self.Pip = self.Pair.SymbolProperties.MinimumPriceVariation
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(18, 0), Action(self.CalcHL))
self.Data = {'High': 0, 'Low': 9999}
self.Entry = {'Long': None, 'Short': None}
self.Closed = True
self.Long = False
self.Short = False
self.TakeProfit1 = True
self.TakeProfit2 = True
self.StopLoss = None
self.Size = None
stockPlot = Chart('Trade Plot')
stockPlot.AddSeries(Series('Buy', SeriesType.Scatter, "$", Color.Green, ScatterMarkerSymbol.Triangle))
stockPlot.AddSeries(Series('Sell', SeriesType.Scatter, "$", Color.Red, ScatterMarkerSymbol.TriangleDown))
stockPlot.AddSeries(Series('Liquidate', SeriesType.Scatter, "$", Color.Blue, ScatterMarkerSymbol.Diamond))
self.AddChart(stockPlot)
def OnData(self, data):
self.Data['High'] = data['USDJPY'].High if data['USDJPY'].High > self.Data['High'] else self.Data['High']
self.Data['Low'] = data['USDJPY'].Low if data['USDJPY'].Low < self.Data['Low'] else self.Data['Low']
self.Plot("Trade Plot", 'Close', data['USDJPY'].Close)
if self.Entry['Long'] == None or self.Entry['Short'] == None:
return
if self.Closed:
return
if self.Long == False and self.Short == False:
# check to enter trade
if data['USDJPY'].High > self.Entry['Long'] and self.Closed != True:
# self.Size = self.Entry['Long'] / (self.Pip * 25) * 0.08 * self.Portfolio.Cash
self.Size = self.Portfolio.MarginRemaining
self.LimitOrder('USDJPY', self.Size, self.Entry['Long'], tag='Enter Long')
self.Plot('Trade Plot', 'Buy', self.Entry['Long'])
self.StopLoss = self.Entry['Long'] - (self.Pip * 25)
self.Long = True
return
#if data['USDJPY'].Low < self.Entry['Short']:
# self.Size = self.Entry['Short'] / (self.Pip * 25) * 0.08 * self.Portfolio.Cash
#self.Size = self.Portfolio.MarginRemaining
#self.LimitOrder('USDJPY', -self.Size, self.Entry['Short'], tag='Enter Short')
#self.Plot('Trade Plot', 'Sell', self.Entry['Short'])
#self.StopLoss = self.Entry['Short'] + (self.Pip * 25)
#self.Short = True
#return
elif self.Long:
if self.TakeProfit1 and data['USDJPY'].High > self.Entry['Long'] + (self.Pip * 15):
# order to sell a third and raise stop loss
size = math.ceil(self.Size / 3)
self.LimitOrder('USDJPY', -size, self.Entry['Long'] + (self.Pip * 15), tag='Take Profit 1 Long')
self.Size = self.Size - size
self.TakeProfit1 = False
self.StopLoss = self.Entry['Long']
return
elif self.TakeProfit2 and data['USDJPY'].High > self.Entry['Long'] + (self.Pip * 30):
# order to sell another third and raise stop loss
size = math.ceil(self.Size / 2)
self.LimitOrder('USDJPY', -size, self.Entry['Long'] + (self.Pip * 30), tag='Take Profit 2 Long')
self.Size = self.Size - size
self.TakeProfit2 = False
self.StopLoss = self.Entry['Long'] + (self.Pip * 15)
return
elif self.TakeProfit1 == False and self.TakeProfit2 == False and data['USDJPY'].High > self.Entry['Long'] + (self.Pip * 50):
# order to sell the rest
self.LimitOrder('USDJPY', -self.Size, self.Entry['Long'] + (self.Pip * 50), tag='Take Profit 3 Long')
self.Plot('Trade Plot', 'Liquidate', self.StopLoss)
self.Reset()
return
elif data['USDJPY'].Low < self.StopLoss and self.Closed != True:
# sell all of it
self.LimitOrder('USDJPY', -self.Size, self.StopLoss, tag='Stop Loss Long')
self.Plot('Trade Plot', 'Liquidate', self.StopLoss)
self.Reset()
return
elif self.Short:
if self.TakeProfit1 and data['USDJPY'].Low < self.Entry['Short'] - (self.Pip * 15):
# order to sell a third and raise stop loss
size = math.ceil(self.Size / 3)
self.LimitOrder('USDJPY', size, self.Entry['Short'] - (self.Pip * 15), tag='Take Profit 1 Short')
self.Size = self.Size - size
self.TakeProfit1 = False
self.StopLoss = self.Entry['Short']
return
elif self.TakeProfit2 and data['USDJPY'].Low < self.Entry['Short'] - (self.Pip * 30):
# order to sell another third and raise stop loss
size = math.ceil(self.Size / 2)
self.LimitOrder('USDJPY', size, self.Entry['Short'] - (self.Pip * 30), tag='Take Profit 2 Short')
self.Size = self.Size - size
self.TakeProfit2 = False
self.StopLoss = self.Entry['Short'] - (self.Pip * 15)
return
elif self.TakeProfit1 == False and self.TakeProfit2 == False and data['USDJPY'].Low < self.Entry['Short'] - (self.Pip * 50):
# order to sell the rest
self.LimitOrder('USDJPY', self.Size, self.Entry['Short'] - (self.Pip * 50), tag='Take Profit 3 Short')
self.Plot('Trade Plot', 'Liquidate', self.StopLoss)
self.Reset()
return
elif data['USDJPY'].High > self.StopLoss and self.Closed == False:
# sell all of it
self.LimitOrder('USDJPY', self.Size, self.StopLoss, tag='Stop Loss Short')
self.Plot('Trade Plot', 'Liquidate', self.StopLoss)
self.Reset()
return
def CalcHL(self):
self.Debug('Running CalcHL')
if self.Data['High'] == 0 or self.Data['Low'] == 9999:
self.Entry['Long'] = None
self.Entry['Short'] = None
self.Closed = False
self.Data = {'High': 0, 'Low': 9999}
return
else:
self.Entry['Long'] = self.Data['High'] + (self.Pip * 7)
self.Entry['Short'] = self.Data['Low'] - (self.Pip * 7)
self.Data = {'High': 0, 'Low': 9999}
self.Closed = False
return
def Reset(self):
self.Closed = True
self.Long = False
self.Short = False
self.TakeProfit1 = True
self.TakeProfit2 = True
self.StopLoss = None
self.Size = None