Module backtrader.observer
Expand source code
#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
#
# Copyright (C) 2015-2023 Daniel Rodriguez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from .lineiterator import LineIterator, ObserverBase, StrategyBase
from backtrader.utils.py3 import with_metaclass
class MetaObserver(ObserverBase.__class__):
def donew(cls, *args, **kwargs):
_obj, args, kwargs = super(MetaObserver, cls).donew(*args, **kwargs)
_obj._analyzers = list() # keep children analyzers
return _obj, args, kwargs # return the instantiated object and args
def dopreinit(cls, _obj, *args, **kwargs):
_obj, args, kwargs = \
super(MetaObserver, cls).dopreinit(_obj, *args, **kwargs)
if _obj._stclock: # Change clock if strategy wide observer
_obj._clock = _obj._owner
return _obj, args, kwargs
class Observer(with_metaclass(MetaObserver, ObserverBase)):
_stclock = False
_OwnerCls = StrategyBase
_ltype = LineIterator.ObsType
csv = True
plotinfo = dict(plot=False, subplot=True)
# An Observer is ideally always observing and that' why prenext calls
# next. The behaviour can be overriden by subclasses
def prenext(self):
self.next()
def _register_analyzer(self, analyzer):
self._analyzers.append(analyzer)
def _start(self):
self.start()
def start(self):
pass
Classes
class MetaObserver (*args, **kwargs)
-
Dirty job manager for a LineSeries
-
During new (class creation), it reads "lines", "plotinfo", "plotlines" class variable definitions and turns them into Classes of type Lines or AutoClassInfo (plotinfo/plotlines)
-
During "new" (instance creation) the lines/plotinfo/plotlines classes are substituted in the instance with instances of the aforementioned classes and aliases are added for the "lines" held in the "lines" instance
Additionally and for remaining kwargs, these are matched against args in plotinfo and if existent are set there and removed from kwargs
Remember that this Metaclass has a MetaParams (from metabase) as root class and therefore "params" defined for the class have been removed from kwargs at an earlier state
Expand source code
class MetaObserver(ObserverBase.__class__): def donew(cls, *args, **kwargs): _obj, args, kwargs = super(MetaObserver, cls).donew(*args, **kwargs) _obj._analyzers = list() # keep children analyzers return _obj, args, kwargs # return the instantiated object and args def dopreinit(cls, _obj, *args, **kwargs): _obj, args, kwargs = \ super(MetaObserver, cls).dopreinit(_obj, *args, **kwargs) if _obj._stclock: # Change clock if strategy wide observer _obj._clock = _obj._owner return _obj, args, kwargs
Ancestors
- MetaLineIterator
- MetaLineSeries
- MetaLineRoot
- MetaParams
- MetaBase
- builtins.type
Subclasses
Methods
def dopreinit(cls, _obj, *args, **kwargs)
-
Expand source code
def dopreinit(cls, _obj, *args, **kwargs): _obj, args, kwargs = \ super(MetaObserver, cls).dopreinit(_obj, *args, **kwargs) if _obj._stclock: # Change clock if strategy wide observer _obj._clock = _obj._owner return _obj, args, kwargs
Inherited members
-
class Observer (*args, **kwargs)
-
Base class for LineXXX instances that hold more than one line
Expand source code
class Observer(with_metaclass(MetaObserver, ObserverBase)): _stclock = False _OwnerCls = StrategyBase _ltype = LineIterator.ObsType csv = True plotinfo = dict(plot=False, subplot=True) # An Observer is ideally always observing and that' why prenext calls # next. The behaviour can be overriden by subclasses def prenext(self): self.next() def _register_analyzer(self, analyzer): self._analyzers.append(analyzer) def _start(self): self.start() def start(self): pass
Ancestors
Subclasses
- Broker
- Cash
- FundShares
- FundValue
- Value
- BuySell
- DrawDown
- DrawDownLength
- DrawDown_Old
- LogReturns
- TimeReturn
- DataTrades
- Trades
Class variables
var alias
var aliased
var csv
var frompackages
var linealias
var packages
var params
var plotinfo
var plotlines
Methods
def start(self)
-
Expand source code
def start(self): pass
Inherited members