订单代理
可通过向 TradeManager.regBroker()
向 TradeManager 注册多个订单代理实例。这些订单代理可执行额外的买入/卖出动作,如邮件订单代理,在 TradeManager 发出买入/卖出指令时,邮件订单代理可以发送邮件。
默认情况下,TradeManager会在执行买入/卖出操作时,调用订单代理执行代理的买入/卖出动作,但这样在实盘操作时会存在问题。因为系统在计算信号指示时,需要回溯历史数据才能得到最新的信号,这样TradeManager会在历史时刻就执行买入/卖出操作, 此时如果订单代理本身没有对发出买入/卖出指令的时刻进行控制,会导致代理发送错误的指令 。因此,需要指定在某一个时刻之后,才允许执行订单代理的买入/卖出操作。TradeManager的属性 TradeManager.brokeLastDatetime
即用于指定该时刻。
Python中的订单代理包装
由于通过从 OrderBrokerBase
继承实现自定义的订单代理,需要实现 _buy、_sell 两个接口方法。由于在 Python 众多的软件包中,有些软件包已经实现了实盘交易的功能,如 Hikyuu 内建的来自 “睿瞳深邃” 的 扯线木偶 (感谢“睿瞳深邃”的共享)。这些软件包中的交易类一般都已经实现了 buy、sell 方法,如果从 OrderBrokerBase 继承实现订单代理类,代码显得冗长,使用不方便。所以,在 Python 中,实现了 OrderBrokerWrap
类和 crtOB()
函数,可以快速包装具有 buy、sell 方法的类生成订单代理。代码示例如下:
#创建模拟交易账户进行回测,初始资金30万
my_tm = crtTM(init_cash = 300000)
#注册实盘交易订单代理
ob = crtOB(TestOrderBroker())
my_tm.reg_broker(ob) #TestOerderBroker是测试用订单代理对象,只打印
#my_tm.reg_broker(crtOB(MailOrderBroker("smtp.sina.com", "yourmail@sina.com", "yourpwd", "receivermail@XXX.yy)))
#根据需要修改订单代理最后的时间戳,后续只有大于该时间戳时,订单代理才会实际发出订单指令
my_tm.broke_last_datetime=Datetime(201706010000)
#创建信号指示器(以5日EMA为快线,5日EMA自身的10日EMA作为慢线,快线向上穿越慢线时买入,反之卖出)
my_sg = SG_Flex(EMA(CLOSE(), n=5), slow_n=10)
#固定每次买入1000股
my_mm = MM_FixedCount(1000)
#创建交易系统并运行
sys = SYS_Simple(tm = my_tm, sg = my_sg, mm = my_mm)
sys.run(sm['sz000001'], Query(-150))
- class hikyuu.trade_manage.OrderBrokerWrap
用于包装 python 中订单代理包装类,这样 python 中的代理类无需从 OrderBrokerBase 继承,只需包含 buy, sell, get_asset_info 方法的实现即可。此类 python 代理类需要使用 crtOB 进行包装后, 才可供 c++ 调用。
- __init__(self, broker, name)
- 参数:
broker – python broker 实例
name (str) – 名称
- _buy(self, market, code, price, num, stoploss, goal_price, part_from)
包装 Python 变量的 buy 方法
- 参数:
market (str) – 证券市场 “SH” | “SZ”
code (str) – 证券代码
price (float) – 买入价格
num (float) – 买入数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- _sell(self, market, code, price, num, stoploss, goal_price, part_from)
包装 Python 变量的 sell 方法
- 参数:
market (str) – 证券市场
code (str) – 证券代码
price (float) – 卖出价格
num (float) – 卖出数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- _get_asset_info(self)
- hikyuu.trade_manage.crtOB(broker[, name="NO_NAME"])
快速生成订单代理包装对象
内建的订单代理类
- class hikyuu.trade_manage.TestOrderBroker
用于测试,在执行买入卖出操作时,进行打印,如:“买入:000001 10.0 1000”
- class hikyuu.trade_manage.MailOrderBroker
邮件订单代理,执行买入/卖出操作时发送 Email,如:
my_tm.regBroker(crtOB(MailOrderBroker("smtp.sina.com", "yourmail@sina.com", "yourpwd", "receivermail@XXX.yy)))
- __init__(self, host, sender, pwd, receivers)
初始化构造函数
- 参数:
host (str) – smtp服务器地址
port (int) – smtp服务器端口
sender (str) – 发件邮箱(既用户名)
pwd (str) – 密码
receivers (list) – 接受者邮箱列表
- buy(self, market, code, price, num)
执行买入操作,向指定的邮箱发送邮件,格式如下:
邮件标题:【Hkyuu提醒】买入 证券代码 邮件内容:买入:证券代码,价格:买入的价格,数量:买入数量
- 参数:
market (str) – 证券市场
code (str) – 证券代码
price (float) – 买入价格
num (float) – 买入数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- sell(self, market, code, price, num)
执行卖出操作,向指定的邮箱发送邮件,格式如下:
邮件标题:【Hkyuu提醒】卖出 证券代码 邮件内容:卖出:证券代码,价格:卖出的价格,数量:卖出数量
- 参数:
market (str) – 证券市场
code (str) – 证券代码
price (float) – 卖出价格
num (float) – 卖出数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
订单代理基类
Python中非必须使用 OrderBrokerBase 来实现自定义的订单代理。只要 Python 的对象包含 buy、sell方法,其方法参数规则与 OrderBrokerWrap
中的 _buy、_sell 方法相同,即可参见前一章节快速创建订单代理实例。
自定义订单代理接口:
OrderBrokerBase._buy()
- 【必须】执行实际买入操作OrderBrokerBase._sell()
- 【必须】执行实际卖出操作OrderBrokerBase._get_asset_info()
- 【可选】返回当前资产信息,如需在 Strategy 中使用 sys/pf,需要实现该接口
- class hikyuu.trade_manage.OrderBrokerBase
订单代理基类,实现实际的订单操作及程序化的订单
- name 代理名称
- __init__(self[, name='NO_NAME'])
初始化订单代理基类
- 参数:
name (str) – 代理名称
- buy(self, market, code, price, num, stoploss, goal_price, part_from)
执行买入操作
- 参数:
market (str) – 证券市场
code (str) – 证券代码
price (float) – 买入价格
num (float) – 买入数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- 返回:
买入操作的执行时刻
- 返回类型:
- sell(self, market, code, price, num, stoploss, goal_price, part_from)
执行买入操作
- 参数:
market (str) – 证券市场
code (str) – 证券代码
price (float) – 卖出价格
num (float) – 卖出数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- 返回:
卖出操作的执行时刻
- 返回类型:
- _buy(self, market, code, price, num, stoploss, goal_price, part_from)
【重载接口】执行实际买入操作
- 参数:
code (str) – 证券代码
price (float) – 买入价格
num (float) – 买入数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- _sell(self, market, code, price, num, stoploss, goal_price, part_from)
【重载接口】执行实际买入操作
- 参数:
market (str) – 证券市场
code (str) – 证券代码
price (float) – 卖出价格
num (float) – 卖出数量
stoploss (float) – 计划止损价
goal_price (float) – 计划盈利目标价
part_from (SystemPart) – 信号来源
- _get_asset_info(self)
【子类接口】获取当前资产信息,子类需返回符合如下规范的 json 字符串:
{ "datetime": "2001-01-01 18:00:00.12345", "cash": 0.0, "positions": [ {"market": "SZ", "code": "000001", "number": 100.0, "stoploss": 0.0, "goal_price": 0.0, "cost_price": 0.0}, {"market": "SH", "code": "600001", "number": 100.0, "stoploss": 0.0, "goal_price": 0.0, "cost_price": 0.0}, ] }
- 返回:
以字符串(json格式)方式返回当前资产信息
- 返回类型:
str