Indicator development - missing a key piece
-
I'm still not sure when to use init and when to use next.
The indicator I'm trying to build is simple.
it's effectively: (i'm making up the actual formula, as this one is proprietary, but it's all regular variables off the data object)
if the close > last close then x, if close < last close then y, if close == lastclose then 0
effectively, what i want is:
x = self.data.close - self.data.close(-1) * self.data.high
y = self.data.close(-1) - self.data.close * self.data.highself.lines.myindicator = x if close > close(-1) else y if close < close(-1) else 0
but that throws an error, and i'm really not sure where to start, there's so much about the indicators I don't really get at this point.
bool should return bool, returned LineOwnOperation
effectively - can I run boolean operations in init? if so, how? if not - then I guess I have to do this in next - but I run into trouble there too.
-
never mind, solved by using next
-
@cemdev said in Indicator development - missing a key piece:
x = self.data.close - self.data.close(-1) * self.data.high y = self.data.close(-1) - self.data.close * self.data.high self.lines.myindicator = x if close > close(-1) else y if close < close(-1) else 0
(Use ``` to quote code blocks)
The above is almost ok for
__init__
. The problem being that not everything in python can be overridden andif ... elif ... else
is one of those things. One needs to usebacktrader.If
(capitalI
to distinguish it even withfrom backtrader import *
)See here: Docs - Platform Concepts, specifically the section Some non-overriden operators/functions
With that in mind
self.lines.myindicator = bt.If(close > close(-1), x, bt.If(close < close(-1), y, 0))
Which effectively says:
if close > close(-1) then x elif close < close(-1) then y else 0
-
oh, that is EXCELLENT. Many thanks for the responses, especially on a sunday. i have it working with next, but i'll refactor with this, seems much cleaner.