订单
订单。
Cerebro
是 backtrader
中的关键控制系统,而 Strategy
(一个子类)是最终用户的关键控制点。后者需要一种方法将系统的其他部分链接起来,这就是订单发挥关键作用的地方。
订单将 Strategy
中的逻辑决策转化为适合 Broker
执行操作的消息。这是通过以下方式完成的:
- 创建。
通过 Strategy 的方法:buy\``,
sell和
close(Strategy),它们返回一个
order`实例作为参考。 - 取消。
通过 Strategy 的方法:cancel
(Strategy),它接受一个订单实例进行操作。
订单也作为一种向用户传达信息的方法,通知经纪人运行情况。
- 通知。
对 Strategy 方法:notify_order
(Strategy),报告一个order
实例。
订单创建。
在调用 buy
、sell
和 close
时,以下参数适用于创建:
data
(默认值:None
)。
要创建订单的数据。如果为None
,则系统中的第一个数据,self.datas[0] 或 self.data0
(又名self.data
),将被使用。size
(默认值:None
)。
要使用的单位数据的大小(正数)用于订单。
如果为None
,则将使用通过getsizer
检索到的sizer
实例来确定大小。price
(默认值:None
)。
要使用的价格(实时经纪人可能对实际格式施加限制,如果不符合最小跳动要求)。None
对于Market
和Close
订单是有效的(市场确定价格)。
对于Limit
、Stop
和StopLimit
订单,此值确定触发点(在Limit
的情况下,触发显然是订单应该匹配的价格)。plimit
(默认值:None
)。
仅适用于StopLimit
订单。这是在Stop触发后设置隐式限价订单的价格(其中使用了price
)。exectype
(默认值:None
)。可能的值:
Order.Market
或None
。市价订单将以下一个可用价格执行。在回测中,它将是下一个柱的开盘价。Order.Limit
。只能以给定的price
或更好的价格执行的订单。Order.Stop
。在price
触发并像Order.Market
订单一样执行的订单。Order.StopLimit
。在price
触发并作为隐式限价订单执行的订单,其价格由pricelimit
给出。
valid
(默认值:None
)。可能的值:
None
:这将生成一个不会过期的订单(也称为有效直至取消),并保持在市场上直到匹配或取消。实际上,经纪人往往会强加时间限制,但通常时间跨度很长,可以视为不会过期。datetime.datetime
或datetime.date
实例:日期将用于生成一个在给定日期时间之前有效的订单(也称为有效截止日期)。Order.DAY
或0
或timedelta()
: 将生成一个直到Session 结束(又称day订单)有效的订单numeric value
: 假定这是与matplotlib
编码中的日期时间相对应的值(backtrader
使用的编码),并将用于生成直到那个时间点有效的订单(good till date)。
tradeid
(默认:0
)
这是backtrader
用来跟踪同一资产上重叠交易的内部值。当订单状态发生变化时,该tradeid
会发送回策略。**kwargs
:其他经纪人实现可能支持额外的参数。backtrader
将kwargs传递给创建的订单对象
例如:如果backtrader
直接支持的 4 种订单执行类型不够用,例如Interactive Brokers的情况下,可以将以下内容作为kwargs传递:
orderType='LIT', lmtPrice=10.0, auxPrice=9.8`
- 这将覆盖由
backtrader
创建的设置,并生成具有touched价格为 9.8 和limit价格为 10.0 的LIMIT IF TOUCHED
订单。
注意
close
方法将检查当前仓位,并相应地使用buy
或sell
来有效地close该仓位。 size
也将自动计算,除非参数是来自用户的输入,在这种情况下可以实现部分close或reversal。
订单通知
要接收通知,用户子类的Strategy
必须重写notify_order
方法(默认行为是什么也不做)。以下内容适用于这些通知:
- 在调用策略的
next
方法之前发出 - 可能(并且将)在相同的next周期内多次发生对于相同或不同状态的相同order。订单可能在
next
再次被调用之前提交给经纪人并接受并且其执行完成。在这种情况下,至少会有 3 个通知,其status
值如下:
Order.Submitted
因为订单已发送给经纪人Order.Accepted
因为订单已被经纪人接受并等待可能的执行。Order.Completed
因为在示例中它被迅速匹配和完全填充(这在Market
订单通常情况下可能是发生的)。
即使在相同的状态下,通知也可能多次发生在Order.Partial
的情况下。这个状态不会在backtesting经纪人(不考虑匹配时的成交量)中看到,但是肯定会被真实的经纪人设置。
真实的经纪人可能在更新仓位之前发出一个或多个执行,这组执行将组成Order.Partial
通知。
实际执行数据在属性中:order.executed
,它是OrderData
类型的对象(参见下文的引用),具有常见的字段如size
和price
创建时的值存储在order.created
中,在order
的整个生命周期内保持不变。
订单状态值
以下内容已定义:
Order.Created
:在创建Order
实例时设置。 除非订单
实例是手动创建而不是通过买入
,卖出
和关闭
,否则永远不会被最终用户看到。Order.Submitted
:在订单
实例已传输到经纪人
时设置。 这只意味着它已经发送。 在回测模式下,这将是一个立即的动作,但是在实际的时间中,这可能需要一段时间才能与真正的经纪人完成,这可能会接收订单,只有在转发到交易所时才会首次通知。Order.Accepted
:broker
已接受订单并且已经在系统中(或已经在交易所中)等待根据设置的参数(如执行类型,大小,价格和有效性)执行Order.Partial
:订单已部分执行。order.executed
包含当前填充的size
和平均价格。order.executed.exbits
包含一个详细的ExecutionBits
列表,详细说明了部分填充情况Order.Complete
:订单已完全填充的平均价格。Order.Rejected
:经纪人已拒绝订单。 一个参数(例如确定其生存期的valid
)可能不被经纪人接受,订单将无法被接受。
原因将通过strategy
的notify_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
本身有buy
和sell
的基本原则,但对于默认参数要求更严格。
订单执行逻辑
经纪人对订单执行有两个主要准则(假设?)
- 当前数据已经发生,不能用于执行订单。
如果策略中的逻辑是这样的:
if self.data.close > self.sma: # where sma is a Simple Moving Average self.buy()`
- 期望不能是订单将以正在逻辑中检查的
close
价格执行,因为它已经发生。
订单可以在下一个一组开/高/低/收价格点的范围内(以及订单中规定的条件)第一次执行 - 交易量不起作用
如果交易者选择非流动资产或者精确地击中价格柱的极端点(高/低),它在实际交易中确实会发生。
但是击中高/低点是很少发生的(如果你这样做…你就不需要backtrader
),并且所选择的资产将有足够的流动性来吸收任何常规交易的订单
市场
执行:
- 下一个一组开/高/低/收价格的开盘价(通常称为柱)
原因:
- 如果逻辑在时间点 X 执行并发出
Market
订单,那么接下来会发生的价格是即将到来的open
价格
注意
这个订单总是执行,并且忽略了用于创建它的price
和valid
参数
Close
执行:
- 当下一个柱子实际关闭时,使用下一个柱子的
close
价格
原因:
- 大多数回测数据源已经包含了关闭的柱子,订单将立即以下一个柱子的
close
价格执行。日线数据源是最常见的例子。
但是系统可以提供“tick”价格,并且实际柱(时间/日期方面)会不断更新新的 tick,而不会实际移动到下一个柱(因为时间和/或日期尚未更改)
只有当时间或日期发生变化时,柱子才会真正关闭并执行订单
Limit
执行:
- 订单创建时设置的
price
,如果data
触及它,从下一个价格柱开始。
如果设置了valid
且时间点已到达,则订单将被取消
价格匹配:
backtrader
尝试为Limit
订单提供最逼真的执行价格。使用 4 个价格点(开盘价/最高价/最低价/收盘价),可以部分推断请求的价格
是否可以改善。对于Buy
订单
- 情况 1:
如果柱的开盘
价低于限价,则订单立即以开盘
价执行。订单已在会话开启阶段清算 - 情况 2:
如果开盘
价没有穿过限价但最低
价低于限价,则在会话期间已见到限价,订单可以执行
- 对于
Sell
订单,逻辑显然是相反的。
停止
执行:
- 如果
数据
触及触发价格
,则设置在订单创建时,从下一个价格柱开始。
如果设置了valid
且时间点已到达,则订单将被取消
价格匹配:
backtrader
尝试为Stop
订单提供最逼真的触发价格。使用 4 个价格点(开盘价/最高价/最低价/收盘价),可以部分推断请求的价格
是否可以改善。对于Buy
的\
Stoporders
- 情况 1:
如果柱的开盘
价高于止损价,则订单立即以开盘
价执行。
旨在在价格向上移动反对现有空头头寸时停止损失 - 情况 2:
如果开盘
价没有穿过止损价但最高
价高于止损价,则在会话期间已见到止损价,订单可以执行
- 对于
Sell
的Stop
订单,逻辑显然是相反的。
停止限价
执行:
- 触发
价格
设置订单,从下一个价格柱开始。
价格匹配:
- 触发:使用
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