PureQuant


PureQuant是一套使用Python语言开发的数字货币程序化交易开源框架,致力于为数字货币行业的投资者提供一个快速、简便地编写自己的交易系统的工具,希望使用者能够通过使用系统,建立并优化自己的交易思想,形成自己的交易策略。PureQuant旨在化繁为简,帮助大家快速部署自己的交易系统。不用担心没有编程基础,因为PureQuant有详细的使用文档以及视频教程,在使用过程中如果遇到问题,可以随时在PureQuant交易论坛发帖。

框架依赖

  • 运行环境

    python3.7或以上版本

  • MySQL数据库(可选)**,MongoDB数据库(可选)**

    数据存储

安装

  • 使用 pip 可以简单方便安装:
pip install purequant

项目结构

  • 推荐创建如下结构的文件及文件夹
ProjectName
    |----- config.json
    |----- strategy1.py
    |----- strategy2.py
    |----- ...
    |----- logger

有任何问题,欢迎联系


下单交易

实盘时会真实下单,回测模式下返回模拟下单成功的提示信息

from purequant.trade import BINANCESPOT  # 从trade模块中导入币安现货
from purequant.config import config  # 导入配置模块

config.loads(config_file)     # 载入配置文件
exchange = BINANCESPOT(config.access_key, config.secret_key, instrument_id) # 实例化交易所

买入开多

exchange.buy(price, amount)  

卖出平多

exchange.sell(price, amount)  

卖出开空

exchange.sellshort(price, amount)  

买入平空

exchange.buytocover(price, amount)  

平多开空

exchange.SELL(平多价格,平多数量,开空价格,开空数量)

平空开多

exchange.BUY(平空价格,平空数量,开多价格,开多数量)

下单后无论是否完全成交,返回下单结果。

info = exchange.buy(0.01784, 1)
print(info)

>>>【交易提醒】下单结果:{'合约ID': 'TRX-USDT-SWAP', '方向': '卖出平多', '订单状态': '完全成交', '成交均价': '0.01784', '数量': '1', '成交金额': 17.84} 

交易助手

使用交易助手可以实现自动撤单以及撤单后重发委托直至完全成交的功能。

{
"ASSISTANT": {
        "automatic_cancellation": "false",
        "reissue_order": "0.0%",
        "price_cancellation": "false",
        "amplitude": "1%",
        "time_cancellation": "false",
        "seconds": 10
    }
}

自动撤单

将配置文件中的automatic_cancellation设置为true,即可实现下单后如订单未完全成交就自动撤单。

价格撤单

将配置文件中的price_cancellation设置为 true,当最新价超过委托价一定百分比(amplitude),则自动撤单,并以最新价(可以使用超价下单,设置reissue_order即可)重发委托。

时间撤单

将配置文件中的time_cancellation设置为true,若超时未成交(seconds),则自动撤单,并以最新价(可以使用超价下单,设置reissue_order即可)重发委托直至完全成交。

交易助手使用说明

1.若未启用交易助手,则下单后自动查询订单状态然后返回订单结果。

2.若只启用了自动撤单功能,下单后如果订单未完全成交,则自动撤单,返回下单结果。

3.价格撤单功能只会在最新价超过委托价一定百分比时去自动撤单然后以最新价下单,不能实现达到完全成交的作用。

4.时间撤单功能可以一直重发委托直至完全成交。

5.建议启用交易助手的三个功能,参数可以按需自行设置。

6.订单状态为部分成交的情况下,只会返回最后一笔成交的订单状态。


智能渠道推送

实盘时会实时推送信息,回测模式下不会推送信息

from purequant.push import push
from purequant.config import config 

config.loads(filename)

配置文件是一个名为config.json的文件,只需将其中参数修改为自己的即可:

{
    "PUSH": {
        "sendmail": "false",
        "dingtalk": "true",
        "twilio": "false"
    },
    "DINGTALK": {
        "ding_talk_api": "https://oapi.dingtalk.com/robot/send?access_token=d3a368908a7db882cd3f6afcccca302e51a1c9"
    },
    "TWILIO": {
        "accountSID" : "AC97a11fcc5ede559cd39061ad140f",
        "authToken" : "3616b6ced8e250232ca2fa4aa559",
        "myNumber" : "+8613712345678",
        "twilio_Number" : "+12058946789"
    },
    "SENDMAIL": {
        "from_addr" : "[email protected]",
        "password" : "xqkwtrsfqwcjgjjgh",
        "to_addr" : "[email protected]",
        "smtp_server" : "smtp.qq.com",
        "port":587
    }
}

集成推送信息

push("要推送的信息内容")

在配置文件中,PUSH中的对应参数若设置为true,使用push()时则会推送消息至相应智能渠道。

twilio所能推送的短信字节过短,因此只能用来发送简短信息,在交易时建议将此项设为"false"。

钉钉推送时会自动@群里的所有人,并且会在当前策略文件目录下自动创建一个名为'dingtalk.text'的文件,其中记录了钉钉消息的发送时间、状态以及具体的发送内容。


获取持仓信息

实盘时会实时从交易所获取真实的账户持仓信息,回测模式下是从数据库中读取回测过程中保存的持仓信息

from purequant.position import POSITION        # 导入持仓模块

position = POSITION(exchange, instrument_id, time_frame)    # 实例化POSITION

当前持仓方向

direction = position.direction()
# 若当前无持仓,返回"none"
# 若当前持多头,返回"long"
# 若当前持空头,返回"short"

当前持仓数量

amount = position.amount()

当前持仓均价

price = position.price()

获取行情信息

实盘时实时获取交易所的行情数据,回测时是获取PureQuant服务器上数据库中的历史数据

from purequant.market import MARKET

market = MARKET(exchange, instrument_id, time_frame)

最新成交价

last = market.last()

开盘价

open = market.open()

market.open(-1)  # 获取当根bar上的开盘价
market.open(-2)  # 获取上根bar上的开盘价
market.open(0)  # 获取最远一根bar上的开盘价

最高价

high = market.high()

market.high(-1)  # 获取当根bar上的最高价
market.high(-2)  # 获取上根bar上的最高价
market.high(0)  # 获取最远一根bar上的最高价

最低价

low = market.low()

market.low(-1)  # 获取当根bar上的最低价
market.low(-2)  # 获取上根bar上的最低价
market.low(0)  # 获取最远一根bar上的最低价

收盘价

close = market.close()

market.close(-1)  # 获取当根bar上的收盘价
market.close(-2)  # 获取上根bar上的收盘价
market.close(0)  # 获取最远一根bar上的收盘价

合约面值

# 获取合约面值,返回结果为计价货币数量,数据类型为整型数字。
# 如一张币本位BTC合约面值为100美元,一张USDT本位BTC合约面值为0.01个BTC
contract_value = market.contract_value()

持仓同步

调用时需先导入SYNCHRONIZE模块并初始化:

from purequant.synchronize import SYNCHRONIZE

synchronize = SYNCHRONIZE("mongodb", "trade", "position", exchange, instrument_id, time_frame)
# 数据库可选MySQL或MongoDB,都不用手动创建数据库与集合(数据表)

在策略中,在下单代码之后加上如下代码以保存策略应持仓位信息至数据库:

synchronize.save_strategy_position(strategy_direction, strategy_amount)

循环运行持仓自动匹配函数:

while True:
    synchronize.match()

测试时也可输出其运行信息至控制台以观察:

info = synchronize.match()
print(info)

在配置文件中可以设置是否超价下单:

{
"SYNCHRONIZE": {
        "overprice": {
            "range": "0.1%"
        }
    }
}

注意:"0.1 %"是一个由双引号包裹的字符串。


持仓监控

调用时需先导入monitor模块:

from purequant.monitor import position_update

使用此功能还需载入配置文件:

from purequant.config import config

config.loads(config_file)  # 载入配置文件
position_update()    # 运行持仓更新自动提醒服务

在配置文件中可以设置要订阅的持仓频道:

  • OKEX
{    
    "POSITION_SERVER": {
        "futures_usd": "false",      # 币本位交割合约
        "futures_usdt": "false",    # U本位交割合约
        "delivery_date": "201225",    # 交割合约需要设置交割日期
        "swap_usd": "false",    # 币本位永续合约
        "swap_usdt": "false",    # U本位永续合约
        "spot": "false",    # 现货账户
        "margin": "false"    # 杠杆账户
    }
}
  • HUOBI
{
    "POSITION_SERVER": {
            "platform": {
                "huobi": {
                        "futures": "true",
                        "swap": "false"
                }
            }
        }
}

如将对应频道设置为"true",则会订阅此频道的持仓更新自动推送,推送渠道可在配置文件的"PUSH"中设置。

OKEX交割合约的币本位与U本位皆可订阅全部九大品种。OKEX现货、杠杆、永续合约都只支持 BTC BCH BSV ETH ETC EOS LTC TRX XRP 九个主流币种。暂不支持期权合约。

支持火币交割合约与永续合约,同时只能订阅一个频道,火币默认是订阅所有品种的持仓更新数据。

因交易所对多个频道有总字节限制,所以此处我们设限为只能订阅一个频道。

推送的信息内容如下:

# USDT交割合约
【交易提醒】交割合约持仓更新!合约ID:ETC-USDT-201225 多头仓位:0 持多均价:0 空头仓位:0 持空均价:6.457 最新成交价:6.176 杠杆倍数:20  # 变动前
【交易提醒】交割合约持仓更新!合约ID:ETC-USDT-201225 多头仓位:1 持多均价:6.177 空头仓位:0 持空均价:6.457 最新成交价:6.176 杠杆倍数:20    # 变动后
# USD交割合约
【交易提醒】交割合约持仓更新!合约ID:ETC-USD-201225 多头仓位:1 持多均价:6.172 空头仓位:0 持空均价:6.168 最新成交价:6.171 杠杆倍数:10    # 变动前
【交易提醒】交割合约持仓更新!合约ID:ETC-USD-201225 多头仓位:0 持多均价:6.172 空头仓位:0 持空均价:6.168 最新成交价:6.171 杠杆倍数:10    # 变动后
# 现货账户
【交易提醒】币币账户更新!币种:USDT 余额:6.8401564534263976 冻结:0 可用:6.8401564534263976 # 转入USDT
【交易提醒】币币账户更新!币种:USDT 余额:6.8401564534263976 冻结:0.30575 可用:6.5344064534263976 # 下单未成交冻结中的USDT
【交易提醒】币币账户更新!币种:ETC 余额:0.049023605 冻结:0 可用:0.049023605  # 买入ETC
【交易提醒】币币账户更新!币种:ETC 余额:0.000003605 冻结:0 可用:0.000003605  # 卖出ETC
# 杠杆账户
【交易提醒】币币杠杆账户更新!交易对:EOS-USDT 强平价:-0.996 计价币:【currency:USDT 余额:3.0000208 可用:3.0000208 冻结:0 已借未还:0】 交易币:【currency:EOS 余额:3.0146712 可用:0.0000712 冻结:3.0146 已借未还:0】 # 卖出前
【交易提醒】币币杠杆账户更新!交易对:EOS-USDT 强平价:-151842.325 计价币:【currency:USDT 余额:10.8111734695 可用:10.8111734695 冻结:0 已借未还:0】 交易币:【currency:EOS 余额:0.0000712 可用:0.0000712 冻结:0 已借未还:0】 # 卖出后
# USD永续合约
【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:0.000 持多数量:0 空头方向:short 持空均价:0.000 持空数量:0 最新成交价:2.590 杠杆倍数:10.00    # 开多前
【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:2.590 持多数量:1 空头方向:short 持空均价:0.000 持空数量:0 最新成交价:2.590 杠杆倍数:10.00    # 开多后

【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:2.590 持多数量:1 空头方向:short 持空均价:0.000 持空数量:0 最新成交价:2.588 杠杆倍数:10.00    # 平多前
【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:0.000 持多数量:0 空头方向:short 持空均价:0.000 持空数量:0 最新成交价:2.588 杠杆倍数:10.00    # 平多后

【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:0.000 持多数量:0 空头方向:short 持空均价:0.000 持空数量:0 最新成交价:2.588 杠杆倍数:10.00    # 开空前
【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:0.000 持多数量:0 空头方向:short 持空均价:2.587 持空数量:1 最新成交价:2.588 杠杆倍数:10.00    # 开空后

【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:0.000 持多数量:0 空头方向:short 持空均价:2.587 持空数量:1 最新成交价:2.586 杠杆倍数:10.00    # 平空前
【交易提醒】永续合约持仓更新!合约ID:EOS-USD-SWAP 多头方向:long 持多均价:0.000 持多数量:0 空头方向:short 持空均价:0.000 持空数量:0 最新成交价:2.586 杠杆倍数:10.00    # 平空后

行情服务

subscribe行情服务是专用于获取通过交易所websocket接口订阅的公共行情数据,并将返回的数据内容保存至MongoDB数据库中,保存的数据需要自行进行清洗。

存储数据

from purequant.subscribe import markets_update    # 导入行情服务器模块
from purequant.config import config    # 导入配置模块

config.loads("config.json")    # 载入配置文件
markets_update()    # 运行行情服务器

运行结果示例:

行情服务器已启动,数据已保存至MongoDB数据库!
2020-07-21T07:28:35.107Z{"event":"subscribe","channel":"futures/depth5:BTC-USD-201225"}
2020-07-21T07:28:35.123Z{"table":"futures/depth5","data":[{"asks":[["9362.1","23","0","3"],["9362.93","1","0","1"],["9363.03","4","0","1"],["9363.18","93","0","1"],["9363.57","109","0","1"]],"bids":[["9362.09","1615","0","9"],["9361.99","20","0","1"],["9361.91","106","0","1"],["9361.61","1","0","1"],["9361.5","111","0","1"]],"instrument_id":"BTC-USD-201225","timestamp":"2020-07-20T23:28:35.433Z"}]}
2020-07-21T07:28:35.183Z{"table":"futures/depth5","data":[{"asks":[["9362.1","23","0","3"],["9362.93","1","0","1"],["9363.03","4","0","1"],["9363.18","93","0","1"],["9363.57","109","0","1"]],"bids":[["9362.09","1615","0","9"],["9361.99","20","0","1"],["9361.91","106","0","1"],["9361.61","1","0","1"],["9361.5","111","0","1"]],"instrument_id":"BTC-USD-201225","timestamp":"2020-07-20T23:28:35.535Z"}]}

MongoDB数据库中保存的数据:

> db.depth5.find()
{ "_id" : ObjectId("5f1628974f26375cad944749"), "data" : "{\"event\":\"subscribe
\",\"channel\":\"futures/depth5:BTC-USD-201225\"}" }
{ "_id" : ObjectId("5f1628984f26375cad94474b"), "data" : "{\"table\":\"futures/d
epth5\",\"data\":[{\"asks\":[[\"9362.1\",\"23\",\"0\",\"3\"],[\"9362.93\",\"1\",
\"0\",\"1\"],[\"9363.18\",\"93\",\"0\",\"1\"],[\"9363.57\",\"109\",\"0\",\"1\"],
[\"9363.58\",\"197\",\"0\",\"1\"]],\"bids\":[[\"9362.09\",\"1655\",\"0\",\"10\"]
,[\"9361.99\",\"20\",\"0\",\"1\"],[\"9361.91\",\"106\",\"0\",\"1\"],[\"9361.61\"
,\"1\",\"0\",\"1\"],[\"9361.5\",\"111\",\"0\",\"1\"]],\"instrument_id\":\"BTC-US
D-201225\",\"timestamp\":\"2020-07-20T23:28:24.263Z\"}]}" }
{ "_id" : ObjectId("5f1628984f26375cad94474d"), "data" : "{\"table\":\"futures/d
epth5\",\"data\":[{\"asks\":[[\"9362.1\",\"23\",\"0\",\"3\"],[\"9362.93\",\"1\",
\"0\",\"1\"],[\"9363.18\",\"93\",\"0\",\"1\"],[\"9363.57\",\"109\",\"0\",\"1\"],
[\"9363.58\",\"197\",\"0\",\"1\"]],\"bids\":[[\"9362.09\",\"1655\",\"0\",\"10\"]
,[\"9361.99\",\"20\",\"0\",\"1\"],[\"9361.91\",\"106\",\"0\",\"1\"],[\"9361.61\"
,\"1\",\"0\",\"1\"],[\"9361.5\",\"111\",\"0\",\"1\"]],\"instrument_id\":\"BTC-US
D-201225\",\"timestamp\":\"2020-07-20T23:28:24.366Z\"}]}" }

可以通过修改配置文件来进行设置:

  • 行情服务器okex平台配置示例
{
    "MARKETS_SERVER": {
        "platform": {
            "okex": {
            "console": "true",    # 是否输出订阅的数据至控制台
            "database": "trade",    # 将数据保存至MongoDB的"trade"数据库
            "collection": "depth5",        # 将数据保存至"trade"数据库的"depth5"集合中
            "channels": [
                ["futures/depth5:BTC-USD-201225"], ["futures/candle60s:BTC-USD-201225"]    # 订阅的频道,可订阅多个频道,但数据会存储至同一个数据库的集合中,需自行处理数据
        ]
    }
}
  • 行情服务器火币平台配置示例
{
    "MARKETS_SERVER": {
        "platform": {
            "huobi_futures": {            # huobi_futures 或 huobi_swap
                "console": "false",
                "database": "trade",
                "collection": "hbdata",
                "channels": [
                ["market.BTC_NW.depth.step6"], ["market.BTC_CQ.kline.1min"]
                ]
            }
        }
    }
}

支持OKEX现货、交割合约、永续合约,支持火币交割合约与永续合约。

导出数据

from purequant.storage import storage    # 导入数据存储与读取模块

storage.export_mongodb_to_csv("trade", "depth5", "depth5.csv") # 将MongoDB "trade"数据库中"depth5"集合的数据导出至当前目录下的"depth5.csv"文件
# 运行结果
MongoDB【trade】数据库中【depth5】集合的数据已导出至【depth5.csv】文件!

Process finished with exit code 0

交易指标

实盘时实时获取交易所的行情数据,回测时是获取根据PureQuant服务器上数据库中的历史数据进行计算,具体方法可参阅示例的双均线策略

调用时需先导入indicators模块:

from purequant.indicators import INDICATORS

要传入的参数中都有platform、instrument_id、time_frame,所以需要声明这几个变量,并且初始化indicators

from purequant.trade import OKEXFUTURES
# k线是公共数据,api传入空的字符串即可
instrument_id = "BTC-USDT-201225"
time_frame = "1d"
exchange = OKEXFUTURES("", "", "", instrument_id)


indicators = INDICATORS(exchange, instrument_id, time_frame)

ATR,平均真实波幅

返回一个一维数组

indicators.ATR(14)
# 获取最新一根bar上的atr
atr = indicators.ATR(14)[-1]

ATR已检验,计算出的值与huobi交易所k线图上所显示的一致。

BarUpdate,判断k线是否更新

如果更新,返回值为True,否则为False

indicators.BarUpdate()
# 调用方式
if indicators.BarUpdate():
    print("k线更新")

BarUpdate已检验,k线更新时,其值会变成True。

BOLL,布林线指标

返回一个字典 {"upperband": 上轨数组, "middleband": 中轨数组, "lowerband": 下轨数组}

indicators.BOLL(20)
# 获取最新一根bar上的上、中、下轨值
upperband = indicators.BOLL(20)['upperband'][-1]
middleband = indicators.BOLL(20)['middleband'][-1]
lowerband = indicators.BOLL(20)['lowerband'][-1]

BOLL已检验,与okex及huobi上k线图上所显示一致。

CurrentBar,获取bar的长度

返回一个整型数字

indicators.CurrentBar()
# 获取交易所返回k线数据的长度
kline_length = indicators.CurrentBar()

CurrentBar已检验,与FMZ量化所计算出的值一致。

HIGHEST,周期最高价

返回一个一维数组

indicators.HIGHEST(30)
# 获取最新一根bar上的最高价
highest = indicators.HIGHEST(30)[-1]

HIGHEST已检验,与FMZ量化所计算出的值一致。

MA,移动平均线

返回一个一维数组

indicators.MA(15)
# 获取最新一根bar上的ma
ma15 = indicators.MA(15)[-1]

MA已检验,与okex交易所k线图上所显示一致。

MACD,指数平滑异同平均线

返回一个字典 {'DIF': DIF数组, 'DEA': DEA数组, 'MACD': MACD数组}

indicators.MACD(12, 26, 9)
# 获取最新一根bar上的DIF、DEA、MACD
DIF = indicators.MACD(12, 26, 9)['DIF'][-1]
DEA = indicators.MACD(12, 26, 9)['DEA'][-1]
MACD = indicators.MACD(12, 26, 9)['MACD'][-1]

MACD已检验,与okex交易所k线图上所显示一致。

EMA,指数平均数

返回一个一维数组

indicators.EMA(9)
# 获取最新一根bar上的ema
ema = indicators.EMA(9)[-1]

EMA已检验,与okex交易所k线图上所显示一致。

KAMA ,考夫曼自适应移动平均线

返回一个一维数组

indicators.EMA(30)
# 获取最新一根bar上的kama
kama = indicators.KAMA(30)[-1]

KAMA已检验,与turtle quant程序化交易软件所计算出的值一致。

KDJ,随机指标

返回一个字典,{'k': k值数组, 'd': d值数组}

indicators.KDJ(9 ,3, 3)
# 获取最新一根bar上的k和d
k = indicators.KDJ(9 ,3, 3)['k'][-1]
d = indicators.KDJ(9 ,3, 3)['d'][-1]

KDJ值与交易所及FMZ量化均不一致,与turtle quant软件所显示的值 略有差异,有待以后再次验证。

LOWEST,周期最低价

返回一个一维数组

indicators.LOWEST(30)
# 获取最新一根bar上的最低价
indicators.LOWEST(30)[-1]

LOWEST已检验,与FMZ量化所计算出的值一致。

OBV,能量潮

返回一个一维数组

indicators.OBV()
# 获取最新一根bar上的obv
obv = indicators.OBV()[-1]

计算出的obv值与交易所k线图上显示的数据不一致,但与发明者量化上计算出的obv值一致:

# PureQuant计算obv:
okex = OkexFutures("", "", "", "BTC-USD-201225")
time_frame = "1d"
indicators = Indicators(okex, "BTC-USD-201225", time_frame)
print(indicators.OBV()[-2])

# 输出结果
38773276.0


# FMZ量化计算obv,标的为Okex交割合约币本位BTC:
exchange.SetContractType("next_quarter") //设置合约类型为次季合约
function main(){
    var records = exchange.GetRecords(PERIOD_D1)
    var obv = TA.OBV(records)
    Log(obv[obv.length - 2])
}
# 输出结果
信息    38773276

因此可以放心使用。

RSI,强弱指标

返回一个一维数组

indicators.RSI(14)
# 获取最新一根bar上的rsi
rsi = indicators.RSI(14)[-1]

RSI已检验,计算出的值与okex交易所k线图上所显示的一致。

ROC,变动率指标

返回一个一维数组

indicators.ROC(12)
# 获取最新一根bar上的roc
roc = indicators.ROC(12)[-1]

ROC已检验,计算出的值与okex交易所k线图上所显示的一致。

STOCHRSI,随机相对强弱指数

返回一个字典 {'stochrsi': stochrsi数组, 'fastk': fastk数组}

indicators.STOCHRSI(14, 14, 3)
# 获取最新一根bar上的stochrsi、fastk
stochrsi = indicators.STOCHRSI(14, 14, 3)['stochrsi'][-1]
fastk = indicators.STOCHRSI(14, 14, 3)['fastk'][-1]

STOCHRSI已验证,与okex、huobi交易所k线图上所显示的一致。

SAR,抛物线指标

返回一个一维数组

indicators.SAR()
# 获取最新一根bar上的sar
sar = indicators.SAR()[-1]

SAR与okex、huobi交易所k线图上所显示均不一致,但与turtlequant一致,应是算法略有不同的缘故。

STDDEV, 标准方差

返回一个一维数组

indicators.STDDEV()
# 获取最新一根bar上的stddev
stddev = indicators.STDDEV(20)-1

STDDEV(StandardDev)已验证,与turtlequant所计算的值一致。

TRIX,三重指数平滑平均线

返回一个一维数组

indicators.TRIX(12)
# 获取最新一根bar上的trix
trix = indicators.TRIX(12)[-1]

TRIX已验证,与okex交易所k线图上所显示的一致。

VOLUME,成交量

返回一个一维数组

indicators.VOLUME()

# 获取最新一根bar上的volume
volume = indicators.VOLUME()[-1]

VOLUME已验证,与okex交易所k线图上所显示的一致。

indicators模块中的MA、EMA、KAMA函数,可以传入多个参数进行计算,求多个参数计算出的指标数值。

当传入多个参数时,返回的结果是一个列表。

用法示例:

from purequant.indicators import INDICATORS
from purequant.trade import OKEXFUTURES

instrument_id = "ETC-USDT-201225"
time_frame = "1d"
exchange = OKEXFUTURES("", "", "", instrument_id)   # 实例化一个交易所对象
indicators = INDICATORS(exchange, instrument_id, time_frame)    # 实例化指标对象
ma = indicators.MA(60, 90)  # 传入两个参数
ma60 = ma[0]   # MA60, 一个一维数组
ma90 = ma[1]   # MA90, 一个一维数组
print(ma60[-1])     # 打印出当前k线上的ma60的值
print(ma90[-1])     # 打印出当前k线上的ma90的值

日志输出

调用时需先导入LOGGER模块,并在当前目录下创建名为logger的文件夹用以存放日志输出文件

默认文件路径是当前路径下的logs文件夹,如不存在则自动创建。

from purequant.logger import logger
from purequant.config import config

config.loads("config.json")

在配置文件中,可以直接修改日志输出的等级来控制日志输出级别:

  • 将"level"设置成"critical",则只输出"CRITICAL"级别的日志
  • "handler"中可以指明日志的输出方式
  • "file"是以文件输出的方式存储日志到当前目录下的"logger"文件夹,按照文件大小1M进行分割,保留最近10个文件
  • "time"也是文件输出,但是以按照一天的时间间隔来分割文件,保留最近10个文件
  • "stream"或者不填或者填入其他字符,都是输出到控制台,不会存储到文件
  • 输出到控制台时,不同级别的日志具有不同的颜色,建议将命令行窗口设置成黑色,以免蓝色日志看不见。
{
    "LOG": {
        "level": "critical",
        "handler": "file"
    }
}

debug

一般用来打印一些调试信息,级别最低

logger.debug("要输出的调试信息")

info

一般用来打印一些正常的操作信息

logger.info("要输出的操作信息")

warning

一般用来打印警告信息

logger.info("要输出的警告信息")

error

一般用来打印一些错误信息

logger.info("要输出的错误信息")

critical

一般用来打印一些致命的错误信息,等级最高

logger.critical("要输出的致命的错误信息")

注:如果使用logger来记录异常信息,使用如下方法:

from purequant.logger import logger
from purequant.config import config

config.loads('config.json')

try:
    print(a)
except:
    logger.error()    # 可以是任何级别,不用传入参数。

>>>
[2020-09-07  10:06:33] -> [ERROR] : Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/pythonProject/11.py", line 7, in <module>
    print(a)
NameError: name 'a' is not defined

获取时间信息

调用前需先导入time_tools模块中的函数

from purequant.time import *

获取本地时间

localtime = get_localtime()

获取当前utc时间

utc_time = get_utc_time()

获取当前时间戳(秒)

cur_timestamp = get_cur_timestamp()

获取当前时间戳(毫秒)

cur_timestamp_ms = get_cur_timestamp_ms()

示例策略

  • 双均线多空策略

  • 布林强盗突破策略

  • 更多示例策略敬请期待!

Purequant

专业的数字货币程序化交易开源框架,助力中小投资者快速搭建程序化交易系统。

Purequant Info

⭐ Stars 24
🔗 Homepage purequant.cloud
🔗 Source Code github.com
🕒 Last Update 8 months ago
🕒 Created 10 months ago
🐞 Open Issues 0
➗ Star-Issue Ratio Infinity
😎 Author Gary-Hertel