python - Backtrader - 卖单上的 order.executed.value 错误?
问题描述
使用样板策略假设买卖 1 股(仅限多头/每个买入订单都与卖出订单相结合)。
出于某种原因,当我卖出股票时,它会以与开仓时相同的金额记录交易价值(股票 * 价格),尽管股价不同。
输出:
2018-02-15 10:30:00, BUY ORDER PLACED, Price: 169.79, Cost: 0.00, Comm: 0.00
2018-02-15 10:30:00, BUY ORDER EXECUTED, Price: 172.06, Cost: 172.06, Comm: 0.17
2018-03-19 14:30:00, SELL ORDER PLACED, Price: 174.19, Cost: 0.00, Comm: 0.00
2018-03-19 14:30:00, SELL ORDER EXECUTED, Price: 174.88, Cost: 172.06, Comm: 0.17
上图我们可以看到买单在 172.06 执行(交易价值(即成本)在交易 1 股时是相同的),但是卖单以不同的价格执行(174.88)但仍然具有相同的交易价值和佣金?
示例代码:
class Test(bt.SignalStrategy):
def __init__(self):
self.sma1 = bt.ind.SMA(period=100)
self.dataclose= self.datas[0].close
self.order = None
self.buyprice = None
self.buycomm = None
self.sellprice = None
self.sellcomm = None
def log(self, txt, dt=None):
dt = dt or self.data.datetime.datetime(0)
print('%s, %s' % (dt, txt))
def notify_order(self, order):
# 1. If order is submitted/accepted, do nothing
if order.status in [order.Submitted, order.Accepted]:
return
# 2. If order is buy/sell executed, report price executed
if order.status in [order.Completed]:
if order.isbuy():
self.log('BUY ORDER PLACED, Price:{0:8.2f}, Cost:{1:8.2f}, Comm:{2:8.2f}'.format(order.created.price,order.created.value,order.created.comm))
self.log('BUY ORDER EXECUTED, Price:{0:8.2f}, Cost:{1:8.2f}, Comm:{2:8.2f}'.format(order.executed.price,order.executed.value,order.executed.comm))
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
if order.issell():
self.log('SELL ORDER PLACED, Price:{0:8.2f}, Cost:{1:8.2f}, Comm:{2:8.2f}'.format(order.created.price,order.created.value,order.created.comm))
self.log('SELL ORDER EXECUTED, Price:{0:8.2f}, Cost:{1:8.2f}, Comm:{2:8.2f}'.format(order.executed.price, order.executed.value,order.executed.comm))
self.sellprice = order.executed.price
self.sellcomm = order.executed.comm
self.bar_executed = len(self) #when was trade executed
# 3. If order is canceled/margin/rejected, report order canceled
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
self.order = None
def next(self):
if self.order:
return
if self.getposition(data=self.data).size == 0:
if data.close[0] > self.sma1:
self.buy()
else:
if data.close[0] < self.sma1:
self.close()
解决方案
您的佣金可能设定为 0.1%,因此在
172.06 * 0.001 = 0.172 = 0.17(四舍五入)
174.88 * 0.001 = 0.174 = 0.17(四舍五入)
您需要在进出时收取费用
推荐阅读
- javascript - 在 angularMaterialTable 中使用 *ngIf
- python - 在 DolphinDB 中的 Datetime 列上像 pandas 一样滚动
- r - 在单元格中保存一列
- google-apps-script - Apps 脚本 - 如何用普通字符替换 Google Docs 中的智能引号字符?
- javascript - 从同一数组中的其他索引值插入索引值
- jquery - 如何编写 Angular 8 的 jQuery ajax 等价物?
- flutter - 如何在执行长操作时只允许使用流或缓冲流事件的单个执行任务
- linux - Shell 将管道值作为文件输入发送
- c# - 浮点数如何保持这个值?1571563892。在范围内,但改为1571564000,多出12个
- java - Maven 构建无法在 jenkins websphere 部署插件中部署