Module backtrader.sizer
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 .utils.py3 import with_metaclass
from .metabase import MetaParams
class Sizer(with_metaclass(MetaParams, object)):
'''This is the base class for *Sizers*. Any *sizer* should subclass this
and override the ``_getsizing`` method
Member Attribs:
- ``strategy``: will be set by the strategy in which the sizer is working
Gives access to the entire api of the strategy, for example if the
actual data position would be needed in ``_getsizing``::
position = self.strategy.getposition(data)
- ``broker``: will be set by the strategy in which the sizer is working
Gives access to information some complex sizers may need like portfolio
value, ..
'''
strategy = None
broker = None
def getsizing(self, data, isbuy):
comminfo = self.broker.getcommissioninfo(data)
return self._getsizing(comminfo, self.broker.getcash(), data, isbuy)
def _getsizing(self, comminfo, cash, data, isbuy):
'''This method has to be overriden by subclasses of Sizer to provide
the sizing functionality
Params:
- ``comminfo``: The CommissionInfo instance that contains
information about the commission for the data and allows
calculation of position value, operation cost, commision for the
operation
- ``cash``: current available cash in the *broker*
- ``data``: target of the operation
- ``isbuy``: will be ``True`` for *buy* operations and ``False``
for *sell* operations
The method has to return the actual size (an int) to be executed. If
``0`` is returned nothing will be executed.
The absolute value of the returned value will be used
'''
raise NotImplementedError
def set(self, strategy, broker):
self.strategy = strategy
self.broker = broker
SizerBase = Sizer # alias for old naming
Classes
class Sizer (*args, **kwargs)
-
This is the base class for Sizers. Any sizer should subclass this and override the
_getsizing
methodMember Attribs:
-
strategy
: will be set by the strategy in which the sizer is workingGives access to the entire api of the strategy, for example if the actual data position would be needed in
_getsizing
::position = self.strategy.getposition(data)
-
broker
: will be set by the strategy in which the sizer is workingGives access to information some complex sizers may need like portfolio value, ..
Expand source code
class Sizer(with_metaclass(MetaParams, object)): '''This is the base class for *Sizers*. Any *sizer* should subclass this and override the ``_getsizing`` method Member Attribs: - ``strategy``: will be set by the strategy in which the sizer is working Gives access to the entire api of the strategy, for example if the actual data position would be needed in ``_getsizing``:: position = self.strategy.getposition(data) - ``broker``: will be set by the strategy in which the sizer is working Gives access to information some complex sizers may need like portfolio value, .. ''' strategy = None broker = None def getsizing(self, data, isbuy): comminfo = self.broker.getcommissioninfo(data) return self._getsizing(comminfo, self.broker.getcash(), data, isbuy) def _getsizing(self, comminfo, cash, data, isbuy): '''This method has to be overriden by subclasses of Sizer to provide the sizing functionality Params: - ``comminfo``: The CommissionInfo instance that contains information about the commission for the data and allows calculation of position value, operation cost, commision for the operation - ``cash``: current available cash in the *broker* - ``data``: target of the operation - ``isbuy``: will be ``True`` for *buy* operations and ``False`` for *sell* operations The method has to return the actual size (an int) to be executed. If ``0`` is returned nothing will be executed. The absolute value of the returned value will be used ''' raise NotImplementedError def set(self, strategy, broker): self.strategy = strategy self.broker = broker
Subclasses
Class variables
var broker
var frompackages
var packages
var params
var strategy
Methods
def getsizing(self, data, isbuy)
-
Expand source code
def getsizing(self, data, isbuy): comminfo = self.broker.getcommissioninfo(data) return self._getsizing(comminfo, self.broker.getcash(), data, isbuy)
def set(self, strategy, broker)
-
Expand source code
def set(self, strategy, broker): self.strategy = strategy self.broker = broker
-
class SizerBase (*args, **kwargs)
-
This is the base class for Sizers. Any sizer should subclass this and override the
_getsizing
methodMember Attribs:
-
strategy
: will be set by the strategy in which the sizer is workingGives access to the entire api of the strategy, for example if the actual data position would be needed in
_getsizing
::position = self.strategy.getposition(data)
-
broker
: will be set by the strategy in which the sizer is workingGives access to information some complex sizers may need like portfolio value, ..
Expand source code
class Sizer(with_metaclass(MetaParams, object)): '''This is the base class for *Sizers*. Any *sizer* should subclass this and override the ``_getsizing`` method Member Attribs: - ``strategy``: will be set by the strategy in which the sizer is working Gives access to the entire api of the strategy, for example if the actual data position would be needed in ``_getsizing``:: position = self.strategy.getposition(data) - ``broker``: will be set by the strategy in which the sizer is working Gives access to information some complex sizers may need like portfolio value, .. ''' strategy = None broker = None def getsizing(self, data, isbuy): comminfo = self.broker.getcommissioninfo(data) return self._getsizing(comminfo, self.broker.getcash(), data, isbuy) def _getsizing(self, comminfo, cash, data, isbuy): '''This method has to be overriden by subclasses of Sizer to provide the sizing functionality Params: - ``comminfo``: The CommissionInfo instance that contains information about the commission for the data and allows calculation of position value, operation cost, commision for the operation - ``cash``: current available cash in the *broker* - ``data``: target of the operation - ``isbuy``: will be ``True`` for *buy* operations and ``False`` for *sell* operations The method has to return the actual size (an int) to be executed. If ``0`` is returned nothing will be executed. The absolute value of the returned value will be used ''' raise NotImplementedError def set(self, strategy, broker): self.strategy = strategy self.broker = broker
Subclasses
Class variables
var broker
var frompackages
var packages
var params
var strategy
Methods
def getsizing(self, data, isbuy)
-
Expand source code
def getsizing(self, data, isbuy): comminfo = self.broker.getcommissioninfo(data) return self._getsizing(comminfo, self.broker.getcash(), data, isbuy)
def set(self, strategy, broker)
-
Expand source code
def set(self, strategy, broker): self.strategy = strategy self.broker = broker
-