Indicator on multi data feed
-
Hi everyone,
I have a question regarding calculating indicator with multi data feed, say I have 3 lines of data added onto strategy, when calculating sma, should I just loop through those 3 data object, create sma series one by one? and end up with a list of sma objects? Then how I can easily access them? I tried
strategy.sma[0][0], doesn't work. I think strategy.sma[0] returns one of sma series, correct?
Appreciate your help.FAN
-
@anfei said in Indicator on multi data feed:
should I just loop through those 3 data object, create sma series one by one? and end up with a list of sma objects
Yes
@anfei said in Indicator on multi data feed:
Then how I can easily access them?
That depends on how you store them.
@anfei said in Indicator on multi data feed:
I tried
strategy.sma[0][0], doesn't work. I think strategy.sma[0] returns one of sma series, correct?Again, accessing your own data structure is something nobody can tell you how to do. Unless you show what you tried, there is no way to tell what you did and why your attempts fail.
-
Thanks for your help and apologies for lack of details of my question.
in strategy class, under init, I put all SMA objects into a list, adding one element a time when looping through datasself.smas = [] for dd in self.datas: self.smas.append(bt.indicators.SimpleMovingAverage( dd, period=self.params.maperiod))
then I struggle to get the right syntax to access to it
if self.datas[0].close[0] > self.smas[0][0]:
this doesn't work. Please help. Or any other way to store and call them? Appreciate your help.
Also I want to make sure SMA is aligned with data series by finding the position in the list using list.index:
for i in firstStrategy.datas:
print(i)
print(firstStrategy.datas.index(i))but it shows an error on calling datas[1].
How can I make sure calling SMA[1] when working with datas[1]?
thanks
FAN
-
I have partially fixed the issue, current value of sma can be accessed via:
self.smas[0].sma[0]
or self.smas[0].lines.sma[0]might not be the decent way, happy to learn if any better ones.
but still have not figure out how to match the right position in list of SMAs with list of datas, sams[1] matching datas[1].
Thanks
FAN
-
Can be an option to hold all indicators in dictionaries and use data names as keys.
Also couple directions -
Search forum using the word multi
-
Thanks for your help.
Can you please take a look why below code does not work?
print(firstStrategy.datas[0]) print(firstStrategy.datas[1]) for i in firstStrategy.datas: print(i) print(firstStrategy.datas.index(i)) <backtrader.feeds.yahoo.YahooFinanceCSVData object at 0x000000000EDED9E8> <backtrader.feeds.yahoo.YahooFinanceCSVData object at 0x000000000EE79278> <backtrader.feeds.yahoo.YahooFinanceCSVData object at 0x000000000EDED9E8> 0 <backtrader.feeds.yahoo.YahooFinanceCSVData object at 0x000000000EE79278> Traceback (most recent call last): File "<ipython-input-200-e02b00cbff02>", line 5, in <module> print(firstStrategy.datas.index(i)) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\lineroot.py", line 281, in __eq__ return self._operation(other, operator.__eq__) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\lineroot.py", line 86, in _operation other, operation, r=r, intify=intify) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\lineroot.py", line 201, in _operation_stage1 return self._makeoperation(other, operation, r, self) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\lineroot.py", line 331, in _makeoperation return self.lines[0]._makeoperation(other, operation, r, _ownerskip) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\linebuffer.py", line 378, in _makeoperation _ownerskip=_ownerskip) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\linebuffer.py", line 522, in __call__ return super(MetaLineActions, cls).__call__(*args, **kwargs) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\metabase.py", line 89, in __call__ _obj, args, kwargs = cls.dopostinit(_obj, *args, **kwargs) File "C:\Users\fan\Anaconda3\lib\site-packages\backtrader\linebuffer.py", line 567, in dopostinit _obj._owner.addindicator(_obj) AttributeError: 'NoneType' object has no attribute 'addindicator'
-
The first thing is: what's your context?
Isolated code as the one you show gives no indication as to what you would try to achieve.
@anfei said in Indicator on multi data feed:
print(firstStrategy.datas[0]) print(firstStrategy.datas[1]) for i in firstStrategy.datas: print(i) print(firstStrategy.datas.index(i))
That's obviously not being executed inside a strategy, which means you have something in mind.
In any case this:
print(firstStrategy.datas.index(i))
seems to have no real purpose at all, since you are already iterating over the list of data feeds.
-
Can be an option to hold all indicators in dictionaries and use data names as keys.
thanks for the tip, will have a try
-