Backtrader 文档学习-Order OCO orders
主要是可以使用订单组的管理策略,使用订单组策略,则一组订单中,有一个符合条件的订单成交,订单组中其他的订单就自动被取消。
1.概述
V1.9.36.116 版本交互式代理支持StopTrail、StopTrailLimit和OCO。
- OCO始终将组中的第一个order指定为参数OCO
- 代理模拟和IB代理具有相同的行为。指定:price作为初始停止触发价格(也指定trailamount),然后plimit作为初始限制价格。两者之间的差异将决定极限偏移量(极限价格与停止触发价格之间的距离)。
IB代理(Introducing Broker)是外汇行业中一个特殊的群体,主要充当销售角色,负责拓展外汇交易商市场并获取更多客户。
IB代理的职责是为外汇交易商拓展市场,并从交易商那里获得一定的返佣作为销售的佣金。在服务外汇平台的第三方工作人员中,也有被称为IB代理的,职责是为平台发展客户,以赚取交易者点差中的佣金为收入来源。
使用模式尽量保持用户友好,如果策略中的逻辑已决定发布订单的时候了,则可以这样使用OCO:
def next(self):
...
o1 = self.buy(...)
...
o2 = self.buy(..., oco=o1)
...
o3 = self.buy(..., oco=o1) # or even oco=o2, o2 is already in o1 group
第一个order o1将类似于组长。通过用oco命名参数指定o1,o2和o3成为OCO组的一部分。请注意,代码片段中的注释表明,通过指定O2(O2已经是组的一部分),o3也可以成为组的一部分。
随着order组的形成,将发生以下情况:
如果该组中的任何订单被执行、取消或过期,其他订单将被取消 。
理解:订单组中,只能有一个订单成交。
2.示例
现金额度到50000,因为资产价值达到4000,3个order,其中1给订单至少需要12000(broker的默认值为10000)
标准的SMA交叉策略,该示例执行以下操作:
- 当快速均线向上穿过慢速均线时,发出3个order
- order1是限价订单,将在限制天内到期(策略的参数),用收盘价降低1个百分点作为限价
- order2是限价订单,到期时间更长,限价更低。
- order3是更进一步降低限价的限价单
order3 is a Limit order which further reduces the limit price
因此order2和order3不会执行,因为:
- order1如首先执行,将触发其他订单的取消
或者 - order1将到期,也将触发其他订单的取消
系统保留3个订单的参考ID,只有在notify_order中显示三个ID为已完成、已取消、保证金或过期时,才会发出新的order 。
在持有某些bar的头寸后,就简单退出。
(1)程序
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import argparse
import datetime
import backtrader as bt
class St(bt.Strategy):
params = dict(
ma=bt.ind.SMA,
p1=5,
p2=15,
limit=0.005,
limdays=3,
limdays2=1000,
hold=10,
switchp1p2=False, # switch prices of order1 and order2
oco1oco2=False, # False - use order