Highest high since position was opened
-
Hi,
As a newbie I am looking for a simple/elegant way to get the highest high of a data feed since I opened a position in that asset.
Thanks -
Listen for the nofitication of a trade, write down the bar number and initialize a
highest
tracking variableFor the available attributes in a
Trade
see: Docs - Tradedef notify_trade(self, trade): if trade.justopened: self.position_bar = trade.baropen self.position_highest = float('-inf')
check during the regular
next
cycledef next(self): if self.position_bar: self.position_highest = max(self.position_highest, self.data.high[0])
You need to, of course, initialize
position_bar
and manage what happens when you close thetrade
. -
@backtrader Thank you for your quick reply!
-
See this for a more general solution: Blog - A Dynamic Indicator
-
@backtrader Actually I have a problem running this, following the solution in the blog post that you wrote. I am not sure if I am missing something but it seems that the indicator is computed all at once during strategy initialization. This is a problem since the indicator should be influenced by trades, which are computed later. This is my indicator code:
class DynamicHighest(bt.Indicator): """indicates the highest high since a trade was open.""" lines = ('dyn_highest',) def __init__(self): self._tradeopen = False self.addminperdiod = 2 def tradeopen(self, isopen): self._tradeopen = isopen print("tradeopen {isopen}".format(isopen=isopen)) def next(self): if self._tradeopen: print("trade is open") self.lines.dyn_highest[0] = max(self.data[0].high, self.dyn_highest[-1]) else: print("trade is close") self.lines.dyn_highest[0] = 0
now when I run cerebro I get this output:
trade is close trade is close trade is close . . . trade is close trade is close trade is close trade is close trade is close dyn_highest: 0.00 | stoplimit: -0.03 | close: 0.13 BUY tradeopen True dyn_highest: 0.00 | stoplimit: -0.03 | close: 0.15 dyn_highest: 0.00 | stoplimit: -0.03 | close: 0.19 dyn_highest: 0.00 | stoplimit: -0.03 | close: 0.17 dyn_highest: 0.00 | stoplimit: -0.03 | close: 0.19 dyn_highest: 0.00 | stoplimit: -0.03 | close: 0.20 dyn_highest: 0.00 | stoplimit: -0.04 | close: 0.19 dyn_highest: 0.00 | stoplimit: -0.04 | close: 0.20 dyn_highest: 0.00 | stoplimit: -0.04 | close: 0.19 dyn_highest: 0.00 | stoplimit: -0.04 | close: 0.19 dyn_highest: 0.00 | stoplimit: -0.04 | close: 0.23 . . .
So, as we see dyn_highest stays 0 the whole time.
Is there a way to prevent precalculation of the indicator?