策略基础
这一章节我们继续深入了解 PythonGo 最主要的回调函数作用以及用法,顺带了解一下 PythonGo 里各种数据的数据结构,还有自带的一些发单方法,还有一些 K 线数据相关的内容,让我们开始吧。
数据结构
策略开发当中我们会经常使用到一下的数据结构
例如:涨跌停价,对手价,合约乘数,账户可用资金等等。
这些数据字段都是一个对象 object,而不是字典,所以如果直接想用 output
输出并看到数据,可以用 Python 类自带的魔法函数 __dict__
,比如:tick.__dict__
,这样就可以看到 tick
这个对象转成字典后的数据了
策略回调函数
策略开发中将会使用到下面的回调函数,您可以在 ctaTemplate.py
文件中看到具体函数的定义。关于什么是回调函数,网上有相关的各种解释,这里简单举例说明一下:
你开发一个策略,操作 IC2306 合约,那么我们 PythonGo 首先会去订阅这个合约的行情,订阅好了之后,等无限易收到了行情,就会立即调用 onTick 回调函数,把 tick 数据(数据类型:TickData)传进来,之后你利用多个 tick 数据计算得到一个下单机会,立刻下单,如果成交,无限易首先会调用 onOrder 委托变化回调函数,传入报单信息 order 对象(数据类型:OrderData),然后再调用 onTrade 成交回调函数,传入成交信息 trade 对象(数据类型:TradeData)。
这一套流程下来,你会发现你只需要发个单就行了,至于有没有成交,成交价格什么的,无限易会主动告诉你。这就是回调函数的魅力,你不用等到成交结果(阻塞),就可以继续去干别的事,等上一个报单成交了,会有人告诉你,你只要专心处理接下来的事情即可。
目前在 PythonGO 中开发策略使用到回调函数都要由用户继承来实现。
onInit 策略初始化
-
解释:客户端使用 JSON 文件初始化策略,自动填写保存好的策略参数,如果之前保存的参数里有合约,那么会自动初始化该合约的持仓
-
用法:大部分时候我们用不上
-
备注:本函数会调用
onUpdate
来设置策略的参数
onStart 策略启动
-
解释:客户端点击运行按钮回调
-
用法:可以在本函数中获取 K 线数据、初始化持仓等操作
-
备注:父类
onStart
会自动订阅我们在 PythonGo 面板中填写的合约,还会自动查询持仓并设置对应合约的持仓
onTick 行情切片
-
解释:客户端推送 tick 行情回调
-
用法:使用
subSymbol
方法订阅合约后,客户端会通过本函数将行情 tick 传进来,可以计算指标等操作 -
参数:
tick
-
参数类型:见
VtObject
文件中TickData
类 -
备注:tick 行情根据订阅的合约推送,如果是多合约订阅,行情会分开推送,每次收到的 tick 数据是单合约的。
onOrder 委托回报
-
解释:客户端推送委托回报回调
-
用法:可以使用本函数处理报单后的事务,不管成交与否
-
参数:
order
-
参数类型:见
VtObject
文件中OrderData
类 -
备注:对于无需做细粒度委托控制的策略,可以忽略
onOrder
。由于使用一些特殊的报单指令,例如 FAK,FOK 等 在订阅onOrder
时第一次推送的委托回报状态是【未成交】,具体情况需要根据策略要求进行处理。
onTrade 成交回报
-
解释:客户端推送成交回报回调
-
用法:可以使用本函数处理成交后的事务
-
参数:
trade
-
参数类型:见
VtObject
文件中TradeData
类 -
备注:父类的
onTrade
在成交后会自动处理持仓,我们不需要重复处理了
onStop 策略停止
-
解释:客户端点击暂停按钮回调
-
用法:处理策略暂停后的事务,比如可以自己在本函数中做一些统计等
-
备注:父类
onStop
会自动取消已经订阅过的合约,并且保存当前策略的参数到 JSON 文件,方便下次加载
onBar 行情 K 线
-
解释:处理单根 K 线回调
-
用法:本函数是跟
BarManager
类一起使用的,用来处理BarManager
合成后的 K 线 -
参数:
bar
-
参数类型:见
VtObject
文件中KLineData
类 -
备注:父类的
onBar
还会把传入的 K 线更新在 PythonGo 的 K 线图上
报撤单函数
报单函数比较多,以下列举几个常用的报单函数,如果要使用 FAK 或者 FOK 指令执行相应的报单 PythonGO 也是支持的。
buy 买入开仓
- 含义:买入开仓,返回用于撤单的订单号
short 卖出开仓
- 含义:卖出开仓,返回用于撤单的订单号
cancelOrder 撤单
- 含义:撤单,传入要撤单的撤单订单号,订单号指以上发单函数返回的订单号
sendOrder 报单
-
含义:发送委托,其他函数都是调用本函数来发单,多了
orderType
(交易类型)参数,PythonGO 中定义的交易类型包括:CTAORDER_BUY
(买开)CTAORDER_SHORT
(卖开)CTAORDER_COVER
(买平)CTAORDER_SELL
(卖平)CTAORDER_COVER_TODAY
(买平今)CTAORDER_SELL_TODAY
(卖平今)
utils(工具库)
我们编程所需的一些工具,会放在工具库中,策略文件中使用 import utils
导入,需要特别注意不要安装任何与 utils同名的库
Scheduler(定时器)
简易定时器,具体关于 APScheduler 的详细文档请查看官方文档,或者自行百度
add_job
添加定时任务
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
func | function | 是 | 任务函数 |
trigger | str | 是 | 触发器:date, interval, cron |
run_date | (datetime, str) | 否 | 运行时间,如果为空,则默认取当前时间 |
args | list | 否 | 任务函数的入参 |
APScheduler 有三个内置的 trigger 类型:
- date 在某个确定的时间点运行你的 job (只运行一次)
- interval 在固定的时间间隔周期性地运行你的 job
- cron 在一天的某些固定时间点周期性地运行你的 job
get_jobs
获取所有定时任务
start
启动所有定时任务
stop
停止所有定时任务
KLineGenerator(秒级 K 线)
秒级 K 线生成器,具体示例请看 Demo_SecondLV_KLine
策略
初始化参数 | 类型 | 必填 | 说明 |
---|---|---|---|
callback | Callable[[KLineData], None] | 是 | 推送 K 线回调,也可以是任何接受一根 K 线然后返回 None 的函数 |
seconds | int | 否 | 合成秒数,默认为 1 |
tick_to_kline
tick 合成 K 线方法
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
tick | TickData | 是 | tick 数据 |
MinKLineGenerator (分钟级 K 线)
分钟级 K 线合成器,具体示例请看 Demo_MinLV_KLine
策略
初始化参数 | 类型 | 必填 | 说明 |
---|---|---|---|
callback | Callable[[KLineData], None] | 是 | 推送 K 线回调,也可以是任何接受一根 K 线然后返回 None 的函数 |
exchange | str | 是 | 交易所代码 |
instrument | str | 是 | 合约代码 |
style | KLineStyleType | 否 | 合成 K 线分钟, 默认 M1 即 1 分钟 K 线, 必须使用 KLineStyle 的枚举值 |
stop_push_scheduler
停止推送每个交易时段最后一根 K 线的定时任务
tick_to_kline
tick 合成 K 线方法
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
tick | TickData | 是 | tick 数据 |
isdigit
判断字符串是否小数或整数
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
value | str | 是 | 任意字符串 |
K线指标和获取数据相关
PythonGO 的K线绘制及技术指标的计算都是通过 CtaTemplate
策略模板库中定义的类来处理,其中重要两个类如下:
BarManager
K线合成模块(即将弃用),请使用新版 MinKLineGenerator
-
含义:K线合成器,支持 2, 3, 5, 10, 15, 30, 60 分钟;通过
ctaTemplate
文件中的loadBar
方法获取到的是 1 分钟的 K 线数据,在通过该 K 线合成模块合成多分钟的 K 线,如果您有其他的 K 线分钟需求,可以参考该类的写法,自己处理合成想要的 K 线数据。updateBar
- 用来合成多分钟的 K 线的,传入的
bar
是一个 1 分钟 K 线对象
updateTick
- 用 tick 行情来合成 1 分钟 K 线,传入的
tick
是一个 tick 行情对象。
- 用来合成多分钟的 K 线的,传入的
ArrayManager 数据缓存和指标计算模块
-
含义:K 线序列管理工具,负责 K 线时间序列的维护和常见技术指标的计算,其中计算指标大部分采用
talib
库中的相关方法进行计算,详情可以参考对应技术指标的方法,如果您想自定义一些技术指标,建议您在自己的策略文件中定义实现。updateBar
- 更新 K 线数组最后一根 K 线数据
open
- 获取开盘价序列,类型为
numpy
数组
high
- 获取最高价序列,类型为
numpy
数组
low
- 获取最低价序列,类型为
numpy
数组
close
- 获取收盘价序列,类型为
numpy
数组
volume
- 获取成交量序列,类型为
numpy
数组
datetime
- 获取时间序列,类型为
numpy
数组
loadBar 获取 1 分钟 K 线数据
-
含义:获取不大于 30 天的 1 分钟历史 K 线数据。
-
参数:
-
days: 天数,获取多少天的 K 线数据就填多少,不能大于 30
-
symbol: 合约代码,默认使用 PythonGo 界面填写的合约
-
exchange: 交易所代码,默认使用 PythonGo 界面填写的合约
-
func: K 线处理方法,默认使用
onBar
-
qt_gui: 当从加载实例中启动策略时, K 线图为空, 则需要把该值设为 True
-
-
注意事项:要想通过该方法获取到 1 分钟历史数据,一定要使用
ArrayManager
来缓存 K 线的相关数据,如果要合成其他分钟,那么还需要使用BarManager
来合成 K 线。
loadDay 获取日K线数据
-
含义:获取不大于 2 年的日历史 K 线数据
-
注意事项:如果一个策略里面有多合约,以及要获取多合约不同周期的历史数据,那么在使用
loadBar
和loadDay
方法时要指定 func,在策略中定义不同的onBar
方法在对应的方法中记录对应的 bar 数据。
KLWidget K 线界面展示模块
- 含义:绘制简单的交易组件页面类,您可以通过调用该类来实现 K 线和技术指标绘制,也可以在自己的策略代码里面通过编写页面类的形式绘制想要的页面。