简体   繁体   English

有人在使用backtrader吗? 如何在方法中保留引用?

[英]Anyone uses backtrader? How can I keep a reference in a method?

I'm trying to use backtrader module( https://www.backtrader.com/ ). 我正在尝试使用backtrader模块( https://www.backtrader.com/ )。

My purpose is just to compare the current price and the price of the last buy execution and execute sell() if the current price is lower than the last execution price. 我的目的只是比较当前价格和最后一次购买执行的价格,如果当前价格低于最后执行价格,则执行sell()。

I asked the same question to its community and the administrator said "You need to keep a reference to the order notified in notify_order, to later use it in next." 我向其社区询问了相同的问题,管理员说:“您需要保留对notify_order中通知的订单的引用,以便以后在下一个版本中使用。” However, I'm afraid I still don't understand how to do it, after reading through my python textbooks. 但是,恐怕在阅读完python教科书后,我仍然不明白该怎么做。 ( https://community.backtrader.com/topic/298/how-can-i-get-the-price-at-which-buy-executed/5 ) https://community.backtrader.com/topic/298/how-can-i-get-the-price-at-which-buy-exected/5

In short, I want to refer to order.executed.price inside def next(self): 简而言之,我想在def next(self):引用order.executed.price def next(self):

I'd appreciate it if I could get some hints on this problem. 如果能得到有关此问题的一些提示,我将不胜感激。 Thank you! 谢谢!

import datetime  # For datetime objects
import os.path  # To manage paths
import sys  # To find out the script name (in argv[0])

# Import the backtrader platform
import backtrader as bt


# Create a Stratey
class TestStrategy(bt.Strategy):
params = (
    ('maperiod', 15),
)

def log(self, txt, dt=None):
    ''' Logging function fot this strategy'''
    dt = dt or self.datas[0].datetime.date(0)
    print('%s, %s' % (dt.isoformat(), txt))

def __init__(self):
    # Keep a reference to the "close" line in the data[0] dataseries
    self.dataclose = self.datas[0].close

    # To keep track of pending orders and buy price/commission
    self.order = None
    self.buyprice = None
    self.buycomm = None

    # Add a MovingAverageSimple indicator
    self.sma = bt.indicators.SimpleMovingAverage(
        self.datas[0], period=self.params.maperiod)

    self.atr = bt.indicators.ATR(self.datas[0])
    self.stoch = bt.indicators.StochasticSlow(self.datas[0])
    self.ema14 = bt.indicators.ExponentialMovingAverage(self.datas[0], period=14)
    self.ema28 = bt.indicators.ExponentialMovingAverage(self.datas[0], period=28)
    self.rsi = bt.indicators.RSI(self.datas[0])

    # Indicators for the plotting show
    bt.indicators.ExponentialMovingAverage(self.datas[0], period=25)
    bt.indicators.WeightedMovingAverage(self.datas[0], period=25,
                                        subplot=True)
    bt.indicators.StochasticSlow(self.datas[0])
    bt.indicators.MACDHisto(self.datas[0])
    rsi = bt.indicators.RSI(self.datas[0])
    bt.indicators.SmoothedMovingAverage(rsi, period=10)
    bt.indicators.ATR(self.datas[0], plot=False)

def notify_order(self, order):
    if order.status in [order.Submitted, order.Accepted]:
        # Buy/Sell order submitted/accepted to/by broker - Nothing to do
        return

    # Check if an order has been completed
    # Attention: broker could reject order if not enougth cash
    if order.status in [order.Completed, order.Canceled, order.Margin]:
        if order.isbuy():
            self.log(
                'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                (order.executed.price,
                 order.executed.value,
                 order.executed.comm))

            self.buyprice = order.executed.price
            self.buycomm = order.executed.comm
        else:  # Sell
            self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                     (order.executed.price,
                      order.executed.value,
                      order.executed.comm))

        self.bar_executed = len(self)

    # Write down: no pending order
    self.order = None

def notify_trade(self, trade):
    if not trade.isclosed:
        return

    self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
             (trade.pnl, trade.pnlcomm))

def next(self):
    # Simply log the closing price of the series from the reference
    self.log('Close, %.2f' % self.dataclose[0])

    # Check if an order is pending ... if yes, we cannot send a 2nd one
    if self.order:
        return

    # Check if we are in the market
    if not self.position:

        # Not yet ... we MIGHT BUY if ...
        if self.stoch[0] > 80:

            # BUY, BUY, BUY!!! (with all possible default parameters)
            self.log('BUY CREATE, %.2f' % self.dataclose[0])

            # Keep track of the created order to avoid a 2nd order
            self.order = self.buy()

    else:
        if self.position.price < self.dataclose[0]:
            # SELL, SELL, SELL!!! (with all possible default parameters)
            self.log('SELL CREATE, %.2f' % self.dataclose[0])

            # Keep track of the created order to avoid a 2nd order
            self.order = self.sell()

In notify_order() you can say something like this: notify_order()您可以这样说:

self.last_executed_price = order.executed.price

Then you can use that variable inside other functions. 然后,您可以在其他函数中使用该变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 streamlit 中显示 backtrader 返回的图表? - How I display the graph that return by backtrader in streamlit? 谁能帮我解决我在Python 2.7中不断遇到的TypeError问题? - Can anyone help me with this TypeError I keep getting in Python 2.7? 如何使用 ccxt 为 backtrader 创建 pandasData - How to created pandasData for backtrader with ccxt 如果我在Python中引用了一个绑定方法,那么单独保持对象存活吗? - If I have a reference to a bound method in Python, will that alone keep the object alive? 如何在 backtrader 中检查馈送数据? - How to check fed data in backtrader? 如何在一个文件中调用使用另一个文件已更改的数据结构的方法? - How can I call a method in one file that uses a data structure that has been changed by another file? 删除用户会影响使用匹配结果计数的增量唯一引用。 如何保持增量? - Deleting user affects incremental unique reference which uses count of matching results. How to keep increment? Python:如何克服使用特殊方法的损坏变量的锁? - Python: How can I defeat a lock in mangled variable which uses a special method? 运行 Cerebro 后,我在 backtrader 中的投资组合价值没有发生任何变化,我如何检查它是否正常工作 - After running Cerebro nothing is happening to my portfolio value in backtrader, how do i check if it is working or not 我在我的代码中使用了 Selenium,但我一直收到错误。 谁能帮忙?” - I'm using Selenium in my code, but I keep getting an error. Can anyone help?"
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM