backtrader卖出self.sell和self.close的区别

博客介绍了大A交易中仓位卖出规则,可从总仓位卖出指定size个仓位,不指定则默认卖1个;也可一次性清空持仓。同时强调每次买卖最少100股为一手,使用中size应为100或其倍数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

self.sell(size=100)

表示从总仓位中卖出size个仓位,如果不指定,则默认卖出1个仓位

self.close()

表示当前标的所有持仓全部一次性清空

在大A交易请注意,每次买入,卖出最少都是100股,为一手,因此为了和实际更加切合,使用中size最少100,或者100的倍数

``` class FundStrategy(bt.Strategy): params = ( ('period', 30), # 持有周期参数化 ('ema_period', 25), # EMA周期 ('rsi_period', 14), # RSI周期 ('stake', 1000), # 固定交易量 ('stop_loss', 0.05), # 5%止损 ('take_profit', 0.10) # 10%止盈 ) def log(self, txt, dt=None): dt = dt or self.datas[0].datetime.date(0) print(f'{dt.isoformat()}, {txt}') def __init__(self): self.dataclose = self.datas[0].close self.order = None self.buyprice = None self.buycomm = None # 初始化总资金记录 self.total_value = self.broker.getvalue() # 初始化技术指标 self.ema = bt.indicators.ExponentialMovingAverage(self.datas[0], period=self.params.ema_period) self.rsi = bt.indicators.RSI(self.datas[0], period=self.params.rsi_period) self.macd = bt.indicators.MACDHisto(self.datas[0]) # 跟踪买入时间 self.bar_executed = 0 def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log( f'已买入 {order.executed.size}股, 价格: {order.executed.price:.2f}, 费用: {order.executed.value:.2f}, 佣金: {order.executed.comm:.2f}') self.buyprice = order.executed.price self.buycomm = order.executed.comm self.bar_executed = len(self) # 记录买入时间 # 设置止损止盈 stop_price = self.buyprice * (1 - self.params.stop_loss) take_price = self.buyprice * (1 + self.params.take_profit) self.sell(exectype=bt.Order.StopTrail, price=stop_price, trailpercent=self.params.stop_loss) self.sell(exectype=bt.Order.Limit, price=take_price, oco=self.order) # OCO订单 else: self.log( f'已卖出 {order.executed.size}股, 价格: {order.executed.price:.2f}, 费用: {order.executed.value:.2f}, 佣金: {order.executed.comm:.2f}') self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('订单取消/保证金不足/拒绝') self.order = None def prenext(self): self.next() def next(self): self.log(f'收盘价: {self.dataclose[0]:.2f}, ' f'EMA: {self.ema[0]:.2f}, ' f'RSI: {self.rsi[0]:.2f}') if self.order: return # 存在未完成订单时禁止新交易 # 买入条件:价格上穿EMA且RSI未超买 if not self.position and self.ema[0]!=np.nan: if (self.dataclose[0] > self.ema[0] and self.rsi[0] < 70 and len(self) >= self.params.ema_period): self.log(f'触发买入信号 EMA:{self.ema[0]:.2f} RSI:{self.rsi[0]:.2f}') # self.order = self.buy(size=self.params.stake) cash = self.broker.getcash() # 可用资金 price = self.dataclose[0] # 当前价格 if price > 0: # 计算30%仓位对应的股数(必须是100的整数倍) target_value = cash * 0.3 max_lots = int(target_value // (price * 100)) # 最大可买手数 size = max_lots * 100 # 转换为股数 if size >= 100: self.log(f'准备买入{size}股({max_lots}手)') self.order = self.buy(size=size) else: self.log('可用资金不足买入1手(100股)') else: self.log('价格为0,跳过买入') # 卖出逻辑 else: if self.position.size > 0: size = self.position.size # A股允许卖出非整百股(但需保证最低交易单位) self.log(f'准备卖出{size}股') self.order = self.sell(size=size) if (len(self) - self.bar_executed) >= self.params.period: self.log('持有期满强制平仓') self.order = self.close()```这里的代码有问题,会出现EMA: nan, RSI: nan
最新发布
03-19
``` #基本策略、开始买,结束卖。不做任何考虑。 class FundStrategy(bt.Strategy): 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 # 增加移动平均指标 # 增加划线的指标 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 enough cash if order.status in [order.Completed]: if order.isbuy(): self.log( '已买入, 价格: %.2f, 费用: %.2f, 佣金 %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # Sell self.log('已卖出, 价格: %.2f, 费用: %.2f, 佣金 %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('订单取消/保证金不足/拒绝') self.order = None def notify_trade(self, trade): #交易执行后,在这里处理 if not trade.isclosed: return self.log('交易利润, 毛利润 %.2f, 净利润 %.2f' % (trade.pnl, trade.pnlcomm)) #记录下盈利数据。 #Gross:毛利;Net:净利 def prenext(self): self.next() def next(self): self.log('Close, %.2f' % self.dataclose[0]) if self.order: return if self.is_bar_start(self.datas[0]): self.buy() # self.order = self.buy() elif self.is_bar_stop(self.datas[0]): self.log('卖出单, %.2f' % self.dataclose[0]) self.order = self.sell() return def is_bar_stop(self, data): if len(data) >= data.buflen() - 1: if self.getposition(data).size != 0: print("------bar ends ------") return True else: return False def is_bar_start(self, data): if self.getposition(data).size == 0: print("------bar starts ------") return True else: return False```优化一下,每次购买,买入3层仓,数量要求是100的整数,因为是a股
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值