backtrader学习(一) 策略执行顺序

常态是假想策略有一个光标,在行情数据(策略迭代表)上逐行移动,每运行到一个bar,有单子先处理单子,然后触发一次next()函数
Cerebro.run()执行后:
Init()_
一般添加self新的属性值,最常见的是新增技术指标self.ma15 = XXX self.ma60 = XX,一般而言在该方法中,backtrader会用矢量化方法将所有指标计算完毕加载到迭代表中(在cerebro.run中可以修改)

② start()
只运行一次,告知策略启动,一般用不到

③ prenext()
由于技术指标计算需要消耗最初的若干根bar,在backtrader的机制中,会自动取计算各个指标的所需要的最大bar数,将其确定为“最小周期”(上例中就是60);当bar的个数没有达到这个最小周期的时候,就不会执行next()而是执行prenext。

执行顺序是,在光标逐行移动第1根到第59根bar上时,由于数据不完整,无法进入next方法判断开仓,于是会调用prenext()方法59次。当光标移到第60根bar时,出现了第一个ma60值,具有了完整的策略数据,可以进入next方法判断是否开仓了。于是不会再调用prenext,而是首先调用nextstart()方法(如果策略中没覆盖就不会运行它)。

④nextstart()
只运行一次,告知下面将使用next()方法,可以不覆盖,但是一旦覆盖,只有在nextstart()里面调用next()方法,才会在第60根bar上执行next(),否则会跳转到第61根bar上才开始执行next()

⑤ next()
在第60根bar上执行next中的相应逻辑,即调用相应的数据和指标值等数据,判断是否发出开平仓信号,以及结合仓位风控管理等判断是否下单。
假设第60根上判断未发生开平仓,即第六十天结束后未发出开仓指令,那么光标继续迭代跳转到第61根上,模拟开启下一天 ,并继续调用next()函数。假设第61根bar上判断开仓,即第六十一天结束时,根据指标变化和仓位管理确定开仓,那么策略会创建一个order实例 (程序中下单动作是在next()中使用self.buy()函数创建策略的self.order实例,当调用buy和sell方法后,都会生成订单,并且返回一个order(或者order子类)的实例,每个实例中记录开仓时间、order类型等信息 ,并包含有一个唯一的ref标识符,用于区分不同的order)。接着bt机制将该 order 提交给broker经纪商,第61天结束。
接下来光标移动到第62根bar,开启第62天。此时由于有昨天发出的单子在(self.order不为None),bt机制模拟开盘前处理单子,暂不运行next。

⑥notify_order() 和 notify_trade()
注:Order.status共有submitted accepted complete canceled margin rejected expired partial等属性。
首先,bt机制发现,策略中存在order实例,且 order.satatus由None变成了submitted,即发送至broker模块,那么bt机制按照响应-反馈机制自动触发notify_order()方法,但该方法一般只是做输出各种信息、数据使用,一般不作策略逻辑处理。
然后,在回测模式中,order.status变成submitted后,会自动经过broker模块变成accepted,模拟经纪商接受订单并向交易所下单。由于order状态改变,再次调用notify_order方法。此时bt机制会结合订单类型(市价单 限价单等)根据第62根bar的开高低收,判断是否成交,并将结果回报给broker。
如果是最简单的市价单,其规则是这一根bar下单后,以下一根bar的开盘价全部成交,也就是说逻辑上一定会全部成交。针对这种情况,bt机制判断成交,broker回报订单成交,self.order.status变成complete,触发notify_order,同时策略创建self.trade属性(计算各种卖价、市价、保证金、手续费等存在trade中),并自动触发notify_trade方法,可以自己编辑输出各种信息。(此时可以将Self.order重新设置为None,方便后面next中实现已有单不发新单的逻辑)
最后,此时单子已处理完成,bt机制将针对地62根bar,运行next方法,继续判断是否开平仓。
如果是限价单,可能判断第62根bar的数据未能使order成交,那么order.status将保持accepted状态,并继续运行针对62根bar的next方法。但一般会在next方法中加入已经有pending order时不再发新单的逻辑判断。

⑦stop()
迭代全部结束后,策略结束的时候会调用一次这个函数,如果想要输出到excel一些策略运行的信息,可以在这个函数里面进行,如df.to_csv()输出到excel中相应的策略运行信息,如每个bar的value是多少。默认是空的,可以要可以不要’’’

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值