在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:hfpy开源软件地址:https://gitee.com/haifengat/hfpy开源软件介绍:HFpy一款开源的策略开发平台.为用户提供方便易用的策略开发工具. 海风 AT 的功能
运行环境talab 指标库https://www.ta-lib.org/function.html 生成镜像docker build -t haifengat/hfpy:`date +%Y%m%d` . && docker push haifengat/hfpy:`date +%Y%m%d`docker tag haifengat/hfpy:`date +%Y%m%d` haifengat/hfpy && docker push haifengat/hfpy 配置 docker-compose.yml环境变量
示例 docker-compose.ymlversion: "3.7"services: hf_py: image: haifengat/hfpy container_name: hf_py restart: always environment: - TZ=Asia/Shanghai - strategy_names="SMACross" # 当日分钟与实时分钟 - redis_addr="172.19.129.98:16379" # 分钟数据,没配置zmq时使用 - pg_min=postgresql://postgres:12345@hf_py_pg:5432/postgres # 策略信号入库使用 - pg_order=postgresql://postgres:12345@hf_py_pg:5432/postgres volumes: # 个人策略文件夹 - ./strategies:/hfpy/strategies 策略信号策略生成的信号会插件到 postgres 的 public.strategy_sign 中js = json.dumps({ 'Direction': str(order.Direction).split('.')[1], 'Offset': str(order.Offset).split('.')[1], 'Price': round(order.Price, 4), 'Volume': order.Volume })sql = f"""INSERT INTO public.strategy_sign(tradingday, order_time, instrument, "period", strategy_id, strategy_group, sign, remark, insert_time)VALUES('{data.Bars[-1].Tradingday}', '{stra.D[-1]}', '{data.Instrument}', {data.Interval}, '{stra.ID}', '{type(stra).__name__}', '{js}', '', now())""" 实时信号会发布到 redisjs = json.dumps({ 'Instrument': order.Instrument, 'Direction': str(order.Direction).split('.')[1], 'Offset': str(order.Offset).split('.')[1], 'Price': round(order.Price, 4), 'Volume': order.Volume, "ID": stra.ID * 1000 + len(stra.Orders) + 1 })self.cfg.rds.publish(f'order.{type(stra).__name__}', js) 测试报告因报告使用了 pandas 所以被注释掉了,如需要则可以自行安装 pandas 并注释掉 atp.py 的 5 行和 252 行。 策略配置
---- # ID用于区分不同策略实例的委托不可重复 "ID": 901 # 回测开始日期 "BeginDate": 20200101 # 可通过增加Data实现多合约多周期引用 "Datas": - # 合约/周期/周期数 "Instrument": "ag2012" "IntervalType": "Minute" "Interval": 5 "Params": # 突破轨道的长度 "LENGTH1": 46 "OPENPARAM": 0.54 策略编写策略文件名与类名、配置文件名要一致(区分大小写) SMACross.py#!/usr/bin/env python# -*- coding: utf-8 -*-"""__title__ = ''__author__ = 'HaiFeng'__mtime__ = '2016/8/16'"""# import talib._ta_lib as talibfrom hfpy.data import Datafrom hfpy.bar import Barfrom hfpy.strategy import Strategyimport numpy as npimport talib as taclass SMACross(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'] def OnBarUpdate(self, data=Data, bar=Bar): if len(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'] = ma1 self.IndexDict['ma10'] = ma2 if len(ma2) < 2 or len(ma1) < 2: return if self.PositionLong == 0: if ma1[-1] >= ma2[-1] and ma1[-2] < ma2[-2]: if self.PositionShort > 0: self.BuyToCover(self.O[-1], self.p_lots, '买平') self.Buy(self.O[-1], self.p_lots, '买开') elif self.PositionShort == 0: if ma1[-1] <= ma2[-1] and ma1[-2] > ma2[-2]: if self.PositionLong > 0: self.Sell(self.O[-1], self.p_lots, '卖平') self.SellShort(self.O[-1], self.p_lots, '卖开') SMACross.yml---# ID用于区分不同策略实例的委托- ID: 119 BeginDate: 20191101 TickTest: false # 可通过增加Data实现多合约多周期引用 Datas: - Instrument: p2105 IntervalType: Minute Interval: 5 - Instrument: rb2105 IntervalType: Minute Interval: 5 Params: Lots: 1 MA1: 10 MA2: 20- ID: 120 BeginDate: 20180901 Datas: - Instrument: rb2105 IntervalType: Minute Interval: 5 Params: Lots: 1 MA1: 5 MA2: 60 附talib 安装报错:#include "Python.h解决:apt: apt-get install python3-devyum: yum install python3-devel |
请发表评论