BackTrader 中文文档(八)(1)

简介: BackTrader 中文文档(八)


原文:www.backtrader.com/

订单

订单。

译文:www.backtrader.com/docu/order/

Cerebrobacktrader 中的关键控制系统,而 Strategy(一个子类)是最终用户的关键控制点。后者需要一种方法将系统的其他部分链接起来,这就是订单发挥关键作用的地方。

订单Strategy 中的逻辑决策转化为适合 Broker 执行操作的消息。这是通过以下方式完成的:

  • 创建
    通过 Strategy 的方法:buy\``,sellclose(Strategy),它们返回一个order`实例作为参考。
  • 取消
    通过 Strategy 的方法:cancel(Strategy),它接受一个订单实例进行操作。

订单也作为一种向用户传达信息的方法,通知经纪人运行情况。

  • 通知
    对 Strategy 方法:notify_order(Strategy),报告一个order实例。

订单创建。

在调用 buysellclose 时,以下参数适用于创建:

  • data默认值None)。
    要创建订单的数据。如果为 None,则系统中的第一个数据,self.datas[0] 或 self.data0(又名 self.data),将被使用。
  • size(默认值:None)。
    要使用的单位数据的大小(正数)用于订单。
    如果为 None,则将使用通过 getsizer 检索到的 sizer 实例来确定大小。
  • price(默认值:None)。
    要使用的价格(实时经纪人可能对实际格式施加限制,如果不符合最小跳动要求)。
    None 对于 MarketClose 订单是有效的(市场确定价格)。
    对于 LimitStopStopLimit 订单,此值确定触发点(在 Limit 的情况下,触发显然是订单应该匹配的价格)。
  • plimit(默认值:None)。
    仅适用于 StopLimit 订单。这是在Stop触发后设置隐式限价订单的价格(其中使用了price)。
  • exectype(默认值:None)。可能的值:
  • Order.MarketNone。市价订单将以下一个可用价格执行。在回测中,它将是下一个柱的开盘价。
  • Order.Limit。只能以给定的 price 或更好的价格执行的订单。
  • Order.Stop。在 price 触发并像 Order.Market 订单一样执行的订单。
  • Order.StopLimit。在 price 触发并作为隐式限价订单执行的订单,其价格由 pricelimit 给出。
  • valid(默认值:None)。可能的值:
  • None:这将生成一个不会过期的订单(也称为有效直至取消),并保持在市场上直到匹配或取消。实际上,经纪人往往会强加时间限制,但通常时间跨度很长,可以视为不会过期。
  • datetime.datetimedatetime.date 实例:日期将用于生成一个在给定日期时间之前有效的订单(也称为有效截止日期)。
  • Order.DAY0timedelta(): 将生成一个直到Session 结束(又称day订单)有效的订单
  • numeric value: 假定这是与matplotlib编码中的日期时间相对应的值(backtrader使用的编码),并将用于生成直到那个时间点有效的订单(good till date)。
  • tradeid(默认:0
    这是backtrader用来跟踪同一资产上重叠交易的内部值。当订单状态发生变化时,该tradeid会发送回策略
  • **kwargs:其他经纪人实现可能支持额外的参数。backtraderkwargs传递给创建的订单对象
    例如:如果backtrader直接支持的 4 种订单执行类型不够用,例如Interactive Brokers的情况下,可以将以下内容作为kwargs传递:
orderType='LIT', lmtPrice=10.0, auxPrice=9.8` 
  • 这将覆盖由backtrader创建的设置,并生成具有touched价格为 9.8 和limit价格为 10.0 的LIMIT IF TOUCHED订单。

注意

close方法将检查当前仓位,并相应地使用buysell来有效地close该仓位。 size也将自动计算,除非参数是来自用户的输入,在这种情况下可以实现部分closereversal

订单通知

要接收通知,用户子类的Strategy必须重写notify_order方法(默认行为是什么也不做)。以下内容适用于这些通知:

  • 在调用策略的next方法之前发出
  • 可能(并且将)在相同的next周期内多次发生对于相同或不同状态的相同order订单可能在next再次被调用之前提交给经纪人接受并且其执行完成。在这种情况下,至少会有 3 个通知,其status值如下:
  • Order.Submitted因为订单已发送给经纪人
  • Order.Accepted因为订单已被经纪人接受并等待可能的执行。
  • Order.Completed因为在示例中它被迅速匹配和完全填充(这在Market订单通常情况下可能是发生的)。

即使在相同的状态下,通知也可能多次发生在Order.Partial的情况下。这个状态不会在backtesting经纪人(不考虑匹配时的成交量)中看到,但是肯定会被真实的经纪人设置。

真实的经纪人可能在更新仓位之前发出一个或多个执行,这组执行将组成Order.Partial通知。

实际执行数据在属性中:order.executed,它是OrderData类型的对象(参见下文的引用),具有常见的字段如sizeprice

创建时的值存储在order.created中,在order的整个生命周期内保持不变。

订单状态值

以下内容已定义:

  • Order.Created:在创建Order实例时设置。 除非订单实例是手动创建而不是通过买入卖出关闭,否则永远不会被最终用户看到。
  • Order.Submitted:在订单实例已传输到经纪人时设置。 这只意味着它已经发送。 在回测模式下,这将是一个立即的动作,但是在实际的时间中,这可能需要一段时间才能与真正的经纪人完成,这可能会接收订单,只有在转发到交易所时才会首次通知。
  • Order.Acceptedbroker已接受订单并且已经在系统中(或已经在交易所中)等待根据设置的参数(如执行类型,大小,价格和有效性)执行
  • Order.Partial:订单已部分执行。 order.executed包含当前填充的size和平均价格。
    order.executed.exbits包含一个详细的ExecutionBits列表,详细说明了部分填充情况
  • Order.Complete:订单已完全填充的平均价格。
  • Order.Rejected:经纪人已拒绝订单。 一个参数(例如确定其生存期的valid)可能不被经纪人接受,订单将无法被接受。
    原因将通过strategynotify_store方法通知。 尽管这可能看起来很奇怪,但原因是真实生活的经纪人将通过事件通知这一点,该事件可能与订单直接相关也可能与订单无关。 但是来自经纪人的通知仍然可以在notify_store中看到。
    此状态将不会在回测经纪人中看到
  • Order.Margin:订单执行将意味着保证金调用,并且先前接受的订单已从系统中移除
  • Order.Cancelled(或Order.Canceled):用户请求取消的确认
    必须考虑到通过策略的cancel方法取消订单的请求不是取消的保证。 订单可能已经被执行,但是经纪人可能尚未通知,和/或通知可能尚未传递给策略。
  • Order.Expired:先前接受的订单其具有时间有效性已过期并已从系统中移除

参考:订单和相关类

这些对象是backtrader生态系统中的通用类。 在与其他经纪人操作时,它们可以被扩展和/或包含额外的嵌入信息。 请参阅适当经纪人的参考资料。

backtrader.order.Order()

持有创建/执行数据和订单类型的类。

订单可能具有以下状态:

  • 已提交:已发送到经纪人并等待确认
  • 已接受:经纪人接受的
  • 部分:部分执行
  • 已完成:已完全执行
  • 已取消:用户取消的已取消
  • 已过期:已过期
  • 保证金:没有足够的现金执行订单。
  • 被拒绝:被经纪人拒绝
    这可能发生在订单提交时(因此订单不会达到已接受的状态)或在执行之前,每个新的条价格因为现金已经被其他来源提取(类似期货的工具可能会减少现金或订单已经被执行)

成员属性:

  • ref:唯一的订单标识符
  • created:持有创建数据的 OrderData
  • executed:持有执行数据的订单数据
  • info:通过方法 addinfo() 传递的自定义信息。它以 OrderedDict 的形式保留,已经被子类化,因此还可以使用‘.’符号指定键

用户方法:

  • isbuy():返回一个布尔值,指示订单是否购买
  • issell():返回一个布尔值,指示订单是否卖出
  • alive():如果订单处于部分或已接受状态,则返回布尔值
backtrader.order.OrderData(dt=None, size=0, price=0.0, pricelimit=0.0, remsize=0, pclose=0.0, trailamount=0.0, trailpercent=0.0)

包含创建和执行的实际订单数据。

在创建时进行的请求,在执行时进行的实际结果。

成员属性:

  • exbits:此 OrderData 的 OrderExecutionBits 的可迭代对象
  • dt:日期时间(浮点数)创建/执行时间
  • size:请求/执行大小
  • price:执行价格注意:如果未给出价格且未给出价格限制,则将在订单创建时使用当前收盘价作为参考
  • pricelimit:保存 StopLimit 的价格限制(先触发)
  • trailamount:追踪止损的绝对价格距离
  • trailpercent:追踪止损的百分比价格距离
  • value:整个比特大小的市场价值
  • comm:整个比特执行的佣金
  • pnl:由此比特生成的 pnl(如果有东西被关闭)
  • margin:订单所产生的保证金(如果有)
  • psize:当前开放位置大小
  • pprice:当前开放位置价格
类 backtrader.order.OrderExecutionBit(dt=None, size=0, price=0.0, closed=0, closedvalue=0.0, closedcomm=0.0, opened=0, openedvalue=0.0, openedcomm=0.0, pnl=0.0, psize=0, pprice=0.0)

用于保存订单执行信息。 “比特” 不确定订单是否已完全/部分执行,它只是保存信息。

成员属性:

  • dt:日期时间(浮点数)执行时间
  • size:执行了多少
  • price:执行价格
  • closed:执行关闭了现有的位置多少
  • opened:执行打开了多少新的位置
  • openedvalue:打开部分的市值
  • closedvalue:关闭部分的市值
  • closedcomm:关闭部分的佣金
  • openedcomm:打开部分的佣金
  • value:整个比特大小的市场价值
  • comm:整个比特执行的佣金
  • pnl:由此比特生成的 pnl(如果有东西被关闭)
  • psize:当前开放位置大小
  • pprice:当前开放位置价格

订单管理和执行

原文:www.backtrader.com/docu/order-creation-execution/order-creation-execution/

如果订单不能模拟,回测和因此backtrader将不完整。为此,平台提供了以下功能。

对于订单管理的 3 个基本原则:

  • buy
  • sell
  • cancel

注意

显然,update原语是一种逻辑,但常识告诉我们,这种方法主要由使用判断性交易方法的手动操作者使用。

对于订单执行逻辑,有以下执行类型:

  • Market
  • Close
  • Limit
  • Stop
  • StopLimit

订单管理

一些例子:

# buy the main date, with sizer default stake, Market order
order = self.buy()
# Market order - valid will be "IGNORED"
order = self.buy(valid=datetime.datetime.now() + datetime.timedelta(days=3))
# Market order - price will be IGNORED
order = self.buy(price=self.data.close[0] * 1.02)
# Market order - manual stake
order = self.buy(size=25)
# Limit order - want to set the price and can set a validity
order = self.buy(exectype=Order.Limit,
                 price=self.data.close[0] * 1.02,
                 valid=datetime.datetime.now() + datetime.timedelta(days=3)))
# StopLimit order - want to set the price, price limit
order = self.buy(exectype=Order.StopLimit,
                 price=self.data.close[0] * 1.02,
                 plimit=self.data.close[0] * 1.07)
# Canceling an existing order
self.broker.cancel(order)

注意

所有订单类型都可以通过创建一个Order实例(或其子类之一),然后通过以下方式传递给经纪人:

order = self.broker.submit(order)

注意

broker本身有buysell的基本原则,但对于默认参数要求更严格。

订单执行逻辑

经纪人对订单执行有两个主要准则(假设?)

  • 当前数据已经发生,不能用于执行订单。
    如果策略中的逻辑是这样的:
if self.data.close > self.sma:  # where sma is a Simple Moving Average
     self.buy()` 
  • 期望不能是订单将以正在逻辑中检查的close价格执行,因为它已经发生。
    订单可以在下一个一组开/高/低/收价格点的范围内(以及订单中规定的条件)第一次执行
  • 交易量不起作用
    如果交易者选择非流动资产或者精确地击中价格柱的极端点(高/低),它在实际交易中确实会发生。
    但是击中高/低点是很少发生的(如果你这样做…你就不需要backtrader),并且所选择的资产将有足够的流动性来吸收任何常规交易的订单

市场

执行:

  • 下一个一组开/高/低/收价格的开盘价(通常称为

原因:

  • 如果逻辑在时间点 X 执行并发出Market订单,那么接下来会发生的价格是即将到来的open价格

注意

这个订单总是执行,并且忽略了用于创建它的pricevalid参数

Close

执行:

  • 当下一个柱子实际关闭时,使用下一个柱子的close价格

原因:

  • 大多数回测数据源已经包含了关闭的柱子,订单将立即以下一个柱子的close价格执行。日线数据源是最常见的例子。
    但是系统可以提供“tick”价格,并且实际柱(时间/日期方面)会不断更新新的 tick,而不会实际移动到下一个柱(因为时间和/或日期尚未更改)
    只有当时间或日期发生变化时,柱子才会真正关闭并执行订单

Limit

执行:

  • 订单创建时设置的price,如果data触及它,从下一个价格柱开始。
    如果设置了valid且时间点已到达,则订单将被取消

价格匹配:

  • backtrader尝试为Limit订单提供最逼真的执行价格。使用 4 个价格点(开盘价/最高价/最低价/收盘价),可以部分推断请求的价格是否可以改善。对于Buy订单
  • 情况 1:
    如果柱的开盘价低于限价,则订单立即以开盘价执行。订单已在会话开启阶段清算
  • 情况 2:
    如果开盘价没有穿过限价但最低价低于限价,则在会话期间已见到限价,订单可以执行
  • 对于Sell订单,逻辑显然是相反的。

停止

执行:

  • 如果数据触及触发价格,则设置在订单创建时,从下一个价格柱开始。
    如果设置了valid且时间点已到达,则订单将被取消

价格匹配:

  • backtrader尝试为Stop订单提供最逼真的触发价格。使用 4 个价格点(开盘价/最高价/最低价/收盘价),可以部分推断请求的价格是否可以改善。对于Buy\Stoporders
  • 情况 1:
    如果柱的开盘价高于止损价,则订单立即以开盘价执行。
    旨在在价格向上移动反对现有空头头寸时停止损失
  • 情况 2:
    如果开盘价没有穿过止损价但最高价高于止损价,则在会话期间已见到止损价,订单可以执行
  • 对于SellStop订单,逻辑显然是相反的。

停止限价

执行:

  • 触发价格设置订单,从下一个价格柱开始。

价格匹配:

  • 触发:使用Stop匹配逻辑(但仅触发并将订单转换为Limit订单)
  • 限价:使用Limit价格匹配逻辑

一些样本

一如既往,图片(带代码)价值数百万长的解释。请注意,片段集中在订单创建部分。完整代码在底部。

使用价格在简单移动平均线上/下方关闭策略来生成买入/卖出信号

信号在图表底部可见:使用交叉指示器的CrossOver

将生成的“买入”订单的参考保留,以允许系统中最多同时存在一个订单。

执行类型:市价

在图表中看到,订单是在信号生成后的一个价格柱后执行的,使用开盘价。

if self.p.exectype == 'Market':
                self.buy(exectype=bt.Order.Market)  # default if not given
                self.log('BUY CREATE, exectype Market, price %.2f' %
                         self.data.close[0])

输出图表。

命令行和输出:

$ ./order-execution-samples.py --exectype Market
2006-01-26T23:59:59+00:00, BUY CREATE, exectype Market, price 3641.42
2006-01-26T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-01-27T23:59:59+00:00, BUY EXECUTED, Price: 3643.35, Cost: 3643.35, Comm 0.00
2006-03-02T23:59:59+00:00, SELL CREATE, 3763.73
2006-03-02T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-03-03T23:59:59+00:00, SELL EXECUTED, Price: 3763.95, Cost: 3763.95, Comm 0.00
...
...
2006-12-11T23:59:59+00:00, BUY CREATE, exectype Market, price 4052.89
2006-12-11T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-12-12T23:59:59+00:00, BUY EXECUTED, Price: 4052.55, Cost: 4052.55, Comm 0.00

执行类型:关闭

现在订单也是在信号后一个柱执行的,但是使用收盘价。

elif self.p.exectype == 'Close':
                self.buy(exectype=bt.Order.Close)
                self.log('BUY CREATE, exectype Close, price %.2f' %
                         self.data.close[0])

输出图表。

命令行和输出:

$ ./order-execution-samples.py --exectype Close
2006-01-26T23:59:59+00:00, BUY CREATE, exectype Close, price 3641.42
2006-01-26T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-01-27T23:59:59+00:00, BUY EXECUTED, Price: 3685.48, Cost: 3685.48, Comm 0.00
2006-03-02T23:59:59+00:00, SELL CREATE, 3763.73
2006-03-02T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-03-03T23:59:59+00:00, SELL EXECUTED, Price: 3763.95, Cost: 3763.95, Comm 0.00
...
...
2006-11-06T23:59:59+00:00, BUY CREATE, exectype Close, price 4045.22
2006-11-06T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-07T23:59:59+00:00, BUY EXECUTED, Price: 4072.86, Cost: 4072.86, Comm 0.00
2006-11-24T23:59:59+00:00, SELL CREATE, 4048.16
2006-11-24T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-27T23:59:59+00:00, SELL EXECUTED, Price: 4045.05, Cost: 4045.05, Comm 0.00
2006-12-11T23:59:59+00:00, BUY CREATE, exectype Close, price 4052.89
2006-12-11T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-12-12T23:59:59+00:00, BUY EXECUTED, Price: 4059.74, Cost: 4059.74, Comm 0.00

执行类型:限价

在几行之前计算有效性,以防已作为参数传递。

if self.p.valid:
                valid = self.data.datetime.date(0) + \
                        datetime.timedelta(days=self.p.valid)
            else:
                valid = None

设置了比信号生成价格(信号栏收盘价)低 1%的限价。请注意,这样可以防止上述许多订单被执行。

elif self.p.exectype == 'Limit':
                price = self.data.close * (1.0 - self.p.perc1 / 100.0)
                self.buy(exectype=bt.Order.Limit, price=price, valid=valid)
                if self.p.valid:
                    txt = 'BUY CREATE, exectype Limit, price %.2f, valid: %s'
                    self.log(txt % (price, valid.strftime('%Y-%m-%d')))
                else:
                    txt = 'BUY CREATE, exectype Limit, price %.2f'
                    self.log(txt % price)

输出图表。

仅发出了 4 个订单。试图捕捉小幅下跌的价格限制完全改变了输出结果。

命令行和输出:

$ ./order-execution-samples.py --exectype Limit --perc1 1
2006-01-26T23:59:59+00:00, BUY CREATE, exectype Limit, price 3605.01
2006-01-26T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-05-18T23:59:59+00:00, BUY EXECUTED, Price: 3605.01, Cost: 3605.01, Comm 0.00
2006-06-05T23:59:59+00:00, SELL CREATE, 3604.33
2006-06-05T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-06-06T23:59:59+00:00, SELL EXECUTED, Price: 3598.58, Cost: 3598.58, Comm 0.00
2006-06-21T23:59:59+00:00, BUY CREATE, exectype Limit, price 3491.57
2006-06-21T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-06-28T23:59:59+00:00, BUY EXECUTED, Price: 3491.57, Cost: 3491.57, Comm 0.00
2006-07-13T23:59:59+00:00, SELL CREATE, 3562.56
2006-07-13T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-07-14T23:59:59+00:00, SELL EXECUTED, Price: 3545.92, Cost: 3545.92, Comm 0.00
2006-07-24T23:59:59+00:00, BUY CREATE, exectype Limit, price 3596.60
2006-07-24T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED

执行类型:带有效期的限价

为了不永远等待限价订单,该订单仅在 4(日历)天内有效,而这可能只有在价格对“买入”订单不利时才能执行。

输出图表。

生成了更多订单,但除了一个“买入”订单外,所有订单均已到期,进一步限制了操作数量。

命令行和输出:

$ ./order-execution-samples.py --exectype Limit --perc1 1 --valid 4
2006-01-26T23:59:59+00:00, BUY CREATE, exectype Limit, price 3605.01, valid: 2006-01-30
2006-01-26T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-01-30T23:59:59+00:00, BUY EXPIRED
2006-03-10T23:59:59+00:00, BUY CREATE, exectype Limit, price 3760.48, valid: 2006-03-14
2006-03-10T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-03-14T23:59:59+00:00, BUY EXPIRED
2006-03-30T23:59:59+00:00, BUY CREATE, exectype Limit, price 3835.86, valid: 2006-04-03
2006-03-30T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-04-03T23:59:59+00:00, BUY EXPIRED
2006-04-20T23:59:59+00:00, BUY CREATE, exectype Limit, price 3821.40, valid: 2006-04-24
2006-04-20T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-04-24T23:59:59+00:00, BUY EXPIRED
2006-05-04T23:59:59+00:00, BUY CREATE, exectype Limit, price 3804.65, valid: 2006-05-08
2006-05-04T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-05-08T23:59:59+00:00, BUY EXPIRED
2006-06-01T23:59:59+00:00, BUY CREATE, exectype Limit, price 3611.85, valid: 2006-06-05
2006-06-01T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-06-05T23:59:59+00:00, BUY EXPIRED
2006-06-21T23:59:59+00:00, BUY CREATE, exectype Limit, price 3491.57, valid: 2006-06-25
2006-06-21T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-06-26T23:59:59+00:00, BUY EXPIRED
2006-07-24T23:59:59+00:00, BUY CREATE, exectype Limit, price 3596.60, valid: 2006-07-28
2006-07-24T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-07-28T23:59:59+00:00, BUY EXPIRED
2006-09-12T23:59:59+00:00, BUY CREATE, exectype Limit, price 3751.07, valid: 2006-09-16
2006-09-12T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-09-18T23:59:59+00:00, BUY EXPIRED
2006-09-20T23:59:59+00:00, BUY CREATE, exectype Limit, price 3802.90, valid: 2006-09-24
2006-09-20T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-09-22T23:59:59+00:00, BUY EXECUTED, Price: 3802.90, Cost: 3802.90, Comm 0.00
2006-11-02T23:59:59+00:00, SELL CREATE, 3974.62
2006-11-02T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-03T23:59:59+00:00, SELL EXECUTED, Price: 3979.73, Cost: 3979.73, Comm 0.00
2006-11-06T23:59:59+00:00, BUY CREATE, exectype Limit, price 4004.77, valid: 2006-11-10
2006-11-06T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-10T23:59:59+00:00, BUY EXPIRED
2006-12-11T23:59:59+00:00, BUY CREATE, exectype Limit, price 4012.36, valid: 2006-12-15
2006-12-11T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-12-15T23:59:59+00:00, BUY EXPIRED

执行类型:Stop

设置了比信号价格高 1%的停止价格。这意味着策略只有在信号产生且价格继续上涨时才会购买,这可能被解释为一种强势信号。

这完全改变了执行全景。

elif self.p.exectype == 'Stop':
                price = self.data.close * (1.0 + self.p.perc1 / 100.0)
                self.buy(exectype=bt.Order.Stop, price=price, valid=valid)
                if self.p.valid:
                    txt = 'BUY CREATE, exectype Stop, price %.2f, valid: %s'
                    self.log(txt % (price, valid.strftime('%Y-%m-%d')))
                else:
                    txt = 'BUY CREATE, exectype Stop, price %.2f'
                    self.log(txt % price)

输出图表。

命令行和输出:

$ ./order-execution-samples.py --exectype Stop --perc1 1
2006-01-26T23:59:59+00:00, BUY CREATE, exectype Stop, price 3677.83
2006-01-26T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-01-27T23:59:59+00:00, BUY EXECUTED, Price: 3677.83, Cost: 3677.83, Comm 0.00
2006-03-02T23:59:59+00:00, SELL CREATE, 3763.73
2006-03-02T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-03-03T23:59:59+00:00, SELL EXECUTED, Price: 3763.95, Cost: 3763.95, Comm 0.00
2006-03-10T23:59:59+00:00, BUY CREATE, exectype Stop, price 3836.44
2006-03-10T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-03-15T23:59:59+00:00, BUY EXECUTED, Price: 3836.44, Cost: 3836.44, Comm 0.00
2006-03-28T23:59:59+00:00, SELL CREATE, 3811.45
2006-03-28T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-03-29T23:59:59+00:00, SELL EXECUTED, Price: 3811.85, Cost: 3811.85, Comm 0.00
2006-03-30T23:59:59+00:00, BUY CREATE, exectype Stop, price 3913.36
2006-03-30T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-09-29T23:59:59+00:00, BUY EXECUTED, Price: 3913.36, Cost: 3913.36, Comm 0.00
2006-11-02T23:59:59+00:00, SELL CREATE, 3974.62
2006-11-02T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-03T23:59:59+00:00, SELL EXECUTED, Price: 3979.73, Cost: 3979.73, Comm 0.00
2006-11-06T23:59:59+00:00, BUY CREATE, exectype Stop, price 4085.67
2006-11-06T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-13T23:59:59+00:00, BUY EXECUTED, Price: 4085.67, Cost: 4085.67, Comm 0.00
2006-11-24T23:59:59+00:00, SELL CREATE, 4048.16
2006-11-24T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-11-27T23:59:59+00:00, SELL EXECUTED, Price: 4045.05, Cost: 4045.05, Comm 0.00
2006-12-11T23:59:59+00:00, BUY CREATE, exectype Stop, price 4093.42
2006-12-11T23:59:59+00:00, ORDER ACCEPTED/SUBMITTED
2006-12-13T23:59:59+00:00, BUY EXECUTED, Price: 4093.42, Cost: 4093.42, Comm 0.00


BackTrader 中文文档(八)(2)https://developer.aliyun.com/article/1505279

相关文章
|
18天前
BackTrader 中文文档(七)(2)
BackTrader 中文文档(七)
21 3
|
18天前
|
索引
BackTrader 中文文档(七)(4)
BackTrader 中文文档(七)
20 0
|
18天前
BackTrader 中文文档(八)(3)
BackTrader 中文文档(八)
15 0
|
18天前
BackTrader 中文文档(十)(2)
BackTrader 中文文档(十)
15 0
|
18天前
|
Python
BackTrader 中文文档(七)(1)
BackTrader 中文文档(七)
33 0
|
18天前
|
存储 编译器 API
BackTrader 中文文档(十)(1)
BackTrader 中文文档(十)
15 0
|
18天前
|
Python
BackTrader 中文文档(十)(3)
BackTrader 中文文档(十)
17 0
|
18天前
BackTrader 中文文档(九)(4)
BackTrader 中文文档(九)
15 0
|
18天前
|
存储 索引
BackTrader 中文文档(十)(4)
BackTrader 中文文档(十)
16 0
|
18天前
BackTrader 中文文档(八)(2)
BackTrader 中文文档(八)
16 0
BackTrader 中文文档(八)(2)