Package: hfpy
海风py一款开源的策略开发平台.为用户提供方便易用的策略开发工具.有问题反馈在使用中有任何问题，欢迎反馈给我，可以用以下联系方式跟我交流邮件(hubert28@qq.com)QQ: 24918700Q群:65164336海风AT的功能策略编写提供常用指标采用HLOC调用K线数据历史数据提供每日数据提供实时数据分钟级服务提供分笔数据(内网)运行环境talab 指标库https://www.ta-lib.org/function.htmldocker运行docker-compose.ymlversion:"3.7"services:hfpy:image:haifengat/hfpycontainer_name:hfpyrestart:alwaysenvironment:# config.yml所在目录config_path:/home/config/volumes:# 个人策略文件夹-./strategies:/home/strategies# hfpy配置文件-./config.yml:/home/config/config.yml运行docker-composeup-d配置docker-compose.yml修改config.yml修改zmq_config，配置对应的数据源修改stra_path，配置自己的策略本地部署hfpy 安装pip install hfpy使用安装python组件pip install -r requirements.txt新建目录创建main.py并复制粘贴下面示例中main的内容创建strategies子目录在strategies目录下,创建SMACross.py和SMACross.yml文件【注意大小写】,并复制粘贴示例中对应的代码.执行 python main.py测试报告因报告使用了pandas所以被注释掉了，如需要则可以自行安装pandas并注释掉atp.py的5行和252行。配置说明项目配置 config.yml当前工作目录下无此文件时, 会产生默认配置stra_path 策略路径[],可多个按此配置读取相应策略,按ID加载对应的参数策略配置与策略文件名同名的.yml文件配置参数组必须有ID标识(int)TickTest: true分笔数据回测,需处理数据源及格式执行配置 config.yml 中的登录信息，数据源python main.py策略编写策略文件名与文件内的类名要一致(区分大小写)示例strategies/SMACross.pystrategies/Test.py接口调用示例示例main.py#!/usr/bin/env python# -*- coding: utf-8 -*-__title__='主程序'__author__='HaiFeng'__mtime__='20180822'fromhfpy.atpimportATPfromtimeimportsleepif__name__=='__main__':ATP().Run()whileTrue:sleep(60*10)config.yml---ctp_config:# 为空时不登录接口ctp_front:'sim_now'investor:'008107'password:'1'product_info:''app_id:'simnow_client_test'auth_code:'0000000000000000'# 追单设置chasing:# n秒后不成交则撤单重发[0-不追单]wait_seconds:3# 超价重发n个pricetickoffset_ticks:2# 重发次数,n次重发后仍未成交则[板价发单]resend_times:3# ctp前置配置fronts:sim_now:trade:tcp://180.168.146.187:10000quote:tcp://180.168.146.187:10010broker:'9999'# 数据源 - zmq配置zmq_config:tcp://私有化部署数据服务:15555# 开关onoff:# 是否7*24running_as_server:true# 是否发送委托real_order_enable:false# 一根K线只发送一次指令single_order_one_bar:true# 是否打印行情时间show_tick_time:true# 策略路径配置stra_path:# 路径strategies:# 策略文件名SMACross:# 策略配置参数ID-119SMACross.py#!/usr/bin/env python# -*- coding: utf-8 -*-"""__title__ = ''__author__ = 'HaiFeng'__mtime__ = '2016/8/16'"""# import talib._ta_lib as talibfromhfpy.dataimportDatafromhfpy.barimportBarfromhfpy.strategyimportStrategyimportnumpyasnpimporttalibastaclassSMACross(Strategy):def__init__(self,jsonfile):super().__init__(jsonfile)self.p_ma1=self.Params['MA1']self.p_ma2=self.Params['MA2']self.p_lots=self.Params['Lots']defOnBarUpdate(self,data=Data,bar=Bar):iflen(self.C)<self.p_ma2:return# if len(data.Instrument) > 0:#     print(f'{data.Tick.Instrument},{data.Tick.Volume}')# print('{0}-{1}'.format(self.D[-1], self.C[-1]))ma1=ta.SMA(np.array(self.C,dtype=float),self.p_ma1)ma2=ta.SMA(np.array(self.C,dtype=float),self.p_ma2)self.IndexDict['ma5']=ma1self.IndexDict['ma10']=ma2iflen(ma2)<2orlen(ma1)<2:returnifself.PositionLong==0:ifma1[-1]>=ma2[-1]andma1[-2]<ma2[-2]:ifself.PositionShort>0:self.BuyToCover(self.O[-1],self.p_lots,'买平')self.Buy(self.O[-1],self.p_lots,'买开')elifself.PositionShort==0:ifma1[-1]<=ma2[-1]andma1[-2]>ma2[-2]:ifself.PositionLong>0:self.Sell(self.O[-1],self.p_lots,'卖平')self.SellShort(self.O[-1],self.p_lots,'卖开')SMACross.yml---# ID用于区分不同策略实例的委托-ID:119BeginDate:20191101TickTest:false# 可通过增加Data实现多合约多周期引用Datas:-Instrument:p2105IntervalType:MinuteInterval:5-Instrument:rb2105IntervalType:MinuteInterval:5Params:Lots:1MA1:10MA2:20-ID:120BeginDate:20180901Datas:-Instrument:rb2105IntervalType:MinuteInterval:5Params:Lots:1MA1:5MA2:60