1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/haifengat-hfpy

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Морской ветер

HFpy

Открытая платформа для разработки стратегий. Предоставляет пользователям удобные средства для создания стратегий.

Функциональность Haifeng AT

  • Разработка стратегий
    • Включает часто используемые индикаторы
    • Использует HLOC для вызова данных свечей
  • Исторические данные
    • Предоставляет ежедневные данные
    • Предоставляет минутные данные в режиме реального времени

Операционная среда

Библиотека индикаторов TA-Lib

https://www.ta-lib.org/function.html

Создание образа Docker

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

Переменные окружения

  • strategy_names
    • Список названий стратегий, разделённых запятой
    • Соответствуют файлам стратегий с тем же названием в директории strategies
  • single_order_one_bar
    • Отправляет ли одна свеча один заказ, значение по умолчанию — True
  • pg_min
    • postgresql://postgres:123456@hf_pg:5432/postgres?sslmode=disable
    • Минутная база данных
  • pg_order
    • postgresql://postgres:123456@pg_order:5432/postgres?sslmode=disable
    • База данных сигналов стратегий
  • redis_addr
    • ip:port
    • Адрес для чтения минутных данных в режиме реального времени [md.{instrument}]
    • Адрес для записи заказов в режиме реального времени [order.{strategy_name}.{strategy_id}]

Пример файла docker-compose.yml```yaml

версия: "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())"""

Реальные сигналы публикуются в redis

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.## Конфигурация стратегии

  • Файл конфигурации .yml с тем же названием, что и имя файла стратегии
  • Группа параметров конфигурации
    • Обязательно наличие уникального идентификатора ID (int)
---
- # ID используется для разделения различных экземпляров стратегий
  "ID": 901
  # Дата начала обратного тестирования
  "BeginDate": 20200101
  # Можно использовать несколько контрактов и периодов, добавив Datas
  "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 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

Примечание

Установка talib

Ошибка: #include <Python.h> Решение:

  • apt: apt-get install python3-dev
  • yum: yum install python3-devel

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (2)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/haifengat-hfpy.git
git@api.gitlife.ru:oschina-mirror/haifengat-hfpy.git
oschina-mirror
haifengat-hfpy
haifengat-hfpy
master