trade 交易
对于正常采用自由资金购买股票,不能做空的情况下。当针对某个行情数据对象下,一个订单使得仓位从0变为正值,则打开了一个交易,会触发 notify_trade();此后,当某个订单使仓位从正值变为0,则该交易关闭,会触发 notify_trade()
一个交易可以由多张订单组成
举个例子:
第一次下单,买100股,仓位从 0 变成 100。打开交易,触发notify_trade()
第二次下单,卖100股,仓位从 200 变成 100。不触发notify_trade()
第三次下单,买100股,仓位从 100 变成 0。关闭交易,触发notify_trade()
再加上可以做空的情况进行分析:
当仓位从0变成非0,则打开交易;此后仓位从非0,变为0,则关闭交易。
如果某个订单使得仓位从正值变到负值,或负值变到正值。则意味着两个动作,一个交易被关闭(非0->0),一个新的交易被打开(0->非0)。
打开交易,触发notify_trade,此时trade.status=1,open
关闭交易,触发notify_trade,此时trade.status=2,close
策略中 self.close():
不能做空的情况下,self.close()会一次性市价卖出全部仓位,关闭交易
可以做空的情况下,self.close()默认市价买回所有卖空仓位,关闭交易
trade对象的属性
ref:唯一交易标识符,int
data:交易涉及到行情数据对象
status:状态。0:Created、1:Open、2:Closed
tradeid:交易id,int,由创建订单时的参数tradeid设置, 如:self.buy(tradeid=1)。默认为0,用于区分不同类型的交易
size(int):交易当前的数量
price(float):交易的当前价格
value(float):交易的当前市值
commission(float):当前累计佣金
pnl(float):当前毛利或损失
pnlcomm(float):扣佣后的净利润
isclosed(boolen):交易是否关闭
isopen(boolen)::交易是否开放
justopened(boolen):交易是否刚刚打开
baropen(int):交易打开的bar
dtopen(float):交易打开的日期时间,使用方法open_datetime获取python的datetime.datetime,或使用backtrader提供的 num2date
barclose(int):交易关闭的bar
dtclose(float):交易关闭的日期时间
barlen(int):交易开放的bar数
historyon(boolen):是否记录交易历史
history(list):交易更新事件列表
trade对象的方法
getdataname(self,):获取涉及的行情数据对象名字
open_datetime(self, tz-None, naive=True):交易打开日期时间
close_datetime(self, tz-None, naive=True):交易关闭日期时间
update(self, order, size, price, value, commission, pnl, comminfo):更新当前交易
策略的 _trades 属性
作用:记录了发生过的交易trade列表
使用:
self._trades[self.data0][0]
含义:返回 与行情数据self.data0 相关的,tradeid为0 的trades列表
trade的history属性
一个记录每笔交易的详细历史。
使用:
首先创建cerebro时开启记录交易历史
cerebro = bt.Cerebro(tradehistory=True)
获取数据
def notify_trade(self, trade):
for h in trade.history:
每个h中含有 status, event两个属性
h.status.status
h.status.dt
h.size
h.event.order
h.event.size
。。。