$ python
$ pip install wtpy --upgrade
或者直接下载whl文件到本地进行安装 阿里云镜像地址:https://mirrors.aliyun.com/pypi/simple/wtpy/ pipy地址:https://pypi.org/project/wtpy/#files
$ pip show wtpy
复制股票数据组件demohttps://github.com/wondertrader/wtpy/tree/master/demos/datakit_stk
dtcfg.json
,配置XTP仿真行情通道 "parsers":[
{
"active":true,
"module":"ParserXTP.dll",
"host":"120.27.164.138", //XTP仿真行情通道地址
"port":"6002",
"user":"********", //XTP仿真账号
"pass":"********", //XTP仿真密码
"protocol":1, //XTP通道参数,可以忽略
"clientid":1, //XTP通道参数,可以忽略
"hbinterval":15, //XTP通道参数,可以忽略
"buffsize":128, //XTP通道参数,可以忽略
"code":"SSE.000001,SSE.600009,SSE.600036,SSE.600276,SZSE.000001"
}
]
dtcfg.json
,配置数据落地目录 "writer":{
"path":"./STK_Data", //数据落地目录
"savelog":false, //是否将tick同时输出csv文件
"async":false, //异步开关,如果股票个数比较多,建议开启
"groupsize":20 //数据落地分组大小,用于控制日志显示
}
dtcfg.json
,配置广播端口 "broadcaster":{
"active":true, //是否开启广播
"bport":3997, //订阅端口
"broadcast":[
{
"host":"255.255.255.255", //广播地址
"port":9001, //广播端口
"type":2 //数据格式,固定为2
}
]
}
runDT.py
启动数据组件了复制股票实盘demohttps://github.com/wondertrader/wtpy/tree/master/demos/cta_stk
config.json
,修改环境配置 "env":{
"name":"cta",
"mode": "product",
"product":{
"session":"SD0930"
},
"filters":"filters.json", //人工干预配置文件,暂时忽略
"fees":"fees_stk.json", //佣金模板文件
}
config.json
,修改数据读取路径 "data":{
"store":{
"path":"./STK_Data/" //这里修改为之前数据组件落地的路径,注意区分相对路径和绝对路径
}
}
config.json
,修改XTP交易通道配置 "traders":[
{
"active":true,
"id":"simnow", //交易通道ID
"module":"TraderXTP.dll",
"host":"120.27.164.69", //XTP仿真交易地址
"port":"6001",
"user":"********", //XTP仿真账号
"pass":"********",
"acckey":"********", //XTP认证key
"protocol":1,
"clientid":1,
"hbinterval":15,
"buffsize":128,
"quick":true,
}
]
config.json
,修改行情通道配置 "parsers":[
{
"active":true,
"id":"parser1",
"module":"ParserUDP.dll",
"host":"127.0.0.1",
"bport":9001, //数据组件广播端口
"sport":3997, //数据组件查询端口
"filter":""
}
]
config.json
里面需要用户修改的修改项基本就修改完成了,其他的配置项保持即可。假设我们需要使用上证指数(SSE.000001)、浦发银行(SSE.600000)、深证成指(SZSE.399001)、平安银行(SZSE.000001)等4个品种的5分钟数据和日线数据。
从Multicharts导出SSE.000001和SZSE.399001两个指数的历史日线数据和历史5分钟线数据(截止到最近一个交易日)到csv文件
从Multicharts导出SSE.000001和SZSE.399001两个指数的历史日线前复权数据和历史5分钟线前复权数据(截止到最近一个交易日)到csv文件。个股要考虑数据的连续性,所以要使用前复权数据。
from wtpy import WtBtEngine
if __name__ == "__main__":
#创建一个运行环境,并加入策略
env = WtBtEngine()
env.trans_mc_bars(".\\csv_m5\\",".\\bin_m5\\", "m5")
env.trans_mc_bars(".\\csv_d\\",".\\bin_d\\", "d")
kw = input('press any key to exit\n')
*.dsb
)重命名后,复制到数据组件存储路径对应的目录下,如: SH600009Q_m5.csv
SH600009Q_m5.dsb
600009Q.dsb
600009Q.dsb
复制到./STK_Data/his/min5/SSE/
下面DualThrust
策略,在编写的时候,就考虑到了对股票的支持,所以加了一个参数isForStk
。对于一般期货策略逻辑,要改写成支持股票,主要需要注意以下几点:
Q
#读取最近50条1分钟线(dataframe对象)
theCode = code
if self.__is_stk__:
theCode = theCode + "Q" #历史数据一定要用复权数据
df_bars = context.stra_get_bars(theCode, self.__period__, self.__bar_cnt__, isMain = True)
trdUnit = 1
if self.__is_stk__:
trdUnit = 100 #交易股票的时候需要设定交易单位为100
最后发出信号的时候,品种代码一定不能带Q
#确定上轨和下轨
upper_bound = openpx + k1* max(hh-lc,hc-ll)
lower_bound = openpx - k2* max(hh-lc,hc-ll)
#读取当前仓位
curPos = context.stra_get_position(code)/trdUnit
if curPos == 0:
if highpx >= upper_bound:
context.stra_enter_long(code, 1*trdUnit, 'enterlong')
context.stra_log_text("向上突破%.2f>=%.2f,多仓进场" % (highpx, upper_bound))
#修改并保存
self.xxx = 1
context.user_save_data('xxx', self.xxx)
return
if lowpx <= lower_bound and not self.__is_stk__: #不是股票才能做空
context.stra_enter_short(code, 1*trdUnit, 'entershort')
context.stra_log_text("向下突破%.2f<=%.2f,空仓进场" % (lowpx, lower_bound))
return
elif curPos > 0:
if lowpx <= lower_bound:
context.stra_exit_long(code, 1*trdUnit, 'exitlong')
context.stra_log_text("向下突破%.2f<=%.2f,多仓出场" % (lowpx, lower_bound))
return
else:
if highpx >= upper_bound and not self.__is_stk__: #不是股票才能做空
context.stra_exit_short(code, 1*trdUnit, 'exitshort')
context.stra_log_text("向上突破%.2f>=%.2f,空仓出场" % (highpx, upper_bound))
return
from wtpy import WtEngine
from Strategies.DualThrust import StraDualThrust
if __name__ == "__main__":
#创建一个运行环境,并加入策略
engine = WtEngine()
engine.init('.\\Common\\', "config.json")
straInfo = StraDualThrust(name='pydt_SH600000', code="SSE.600000", barCnt=50, period="m5", days=30, k1=0.1, k2=0.1, isForStk=True)
engine.add_strategy(straInfo)
straInfo = StraDualThrust(name='pydt_SZ000001', code="SZSE.000001", barCnt=50, period="m5", days=30, k1=0.1, k2=0.1, isForStk=True)
engine.add_strategy(straInfo)
engine.run()
kw = input('press any key to exit\n')
开盘前启动数据组件,比如9:20