Открытая платформа для разработки стратегий. Предоставляет пользователям удобные средства для создания стратегий.
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
strategies
True
[md.{instrument}]
[order.{strategy_name}.{strategy_id}]
версия: "3.7"
сервисы: hf_py: образ: haifengat/hfpy имя_контейнера: hf_py перезапуск: всегда окружение: - 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 тома: # Личная директория со стратегиями - ./strategies:/hfpy/strategies
## Сигналы стратегий
### Сигналы, созданные стратегиями, будут вставлены в таблицу public.strategy_sign базы данных PostgreSQL
```python
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())"""
js = 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 и раскомментируйте строки 5 и 252 файла atp.py.## Конфигурация стратегии
---
- # ID используется для разделения различных экземпляров стратегий
"ID": 901
# Дата начала обратного тестирования
"BeginDate": 20200101
# Можно использовать несколько контрактов и периодов, добавив Datas
"Datas":
- # Контракт/Период/Количество периодов
"Instrument": "ag2012"
"IntervalType": "Minute"
"Interval": 5
"Params":
# Длина полос трендового канала
"LENGTH1": 46
"OPENPARAM": 0.54
Имя файла стратегии должно совпадать с именем класса и именем файла конфигурации (чувствительно к регистру)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'HaiFeng'
__mtime__ = '2016/8/16'
"""
# import talib._ta_lib as talib
from hfpy.data import Data
from hfpy.bar import Bar
from hfpy.strategy import Strategy
import numpy as np
import talib as ta
class 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)
``` ```python
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, 'Buy to Cover')
self.Buy(self.O[-1], self.p_lots, 'Buy Open')
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, 'Sell Close')
self.SellShort(self.O[-1], self.p_lots, 'Sell Short')
```
```yaml
# SMACross.yml
``````yaml
---
# ID используется для разделения различных экземпляров стратегий
- ID: 119
BeginDate: 20191101
TickTest: false
# Возможность использования нескольких контрактов и периодов путём добавления данных
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
Ошибка: #include <Python.h>
Решение:
apt-get install python3-dev
yum install python3-devel
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )