Uploaded by kevin zuo

1. 入门1.1 基础入门1.1.1 什么是量化交易? 1.1.2 BitQuant量化工具支持使用哪些语言进行策略编写1 ( PDFDrive )

advertisement
1. 入门
1.1 基础入门
1.1.1 什么是量化交易?
1.1.2 BitQuant量化工具支持使用哪些语言进行策略编写?
1.1.3 BitQuant量化工具如何执行策略
1.2 支持的交易所和交易区
1.2.1 支持的交易所
1.2.2 支持的交易区
1.3 回测系统
1.3.1 什么是回测系统
1.3.2 如何使用回测系统
1.4 几个策略代码示例
1.4.1 网格交易策略
1.4.2 双均线策略
1.4.3 Dual Thrust交易策略
1.4.4 海龟交易策略
1.4.5 BitMEX期现套利
2. 程序基础框架
2.1 基本概念
2.1.1 symbol - 交易币对代码
2.1.2 mode - 实盘/回测的运行模式
2.1.3 context - 上下文对象
2.2 经典程序框架
2.3 枚举常量
2.3.1 SecurityType- 交易品种
2.3.2 OrderSide - 委托方向
2.3.3 OrderType - 委托类型
2.3.4 OrderStatus - 委托状态
2.3.5 ExecType - 执行回报状态
2.3.6 PositionSide - 持仓方向
2.3.7 OrderStyle - 订单创建类型
2.3.8 ExecInst - 执行方式(仅合约)
2.4 数据结构
2.4.1 Tick - 分时数据对象
2.4.2 Bar - K线数据对象
2.4.3 Depth - 深度对象
2.4.4 Trade - 交易对象
2.4.5 Instrument - 交易标的对象
2.4.6 Order - 委托对象
2.4.7 ExecRpt - 回报对象
2.4.8 Position - 持仓对象
2.4.9 Asset - 保证金资产对象(仅合约)
2.4.10 ExchangeRate - 公允汇率对象
2.4.11 Indicator - 绩效指标对象
2.4.12 Stat- API调用结果对象
3.API函数
3.1 基本函数
3.1.1 init - 初始化策略
3.1.2 schedule - 每日执行定时任务
3.1.3 run - 运行策略总入口
3.1.4 stop - 停止策略
3.2 市场数据订阅
3.2.1 subscribe - 行情订阅
3.2.2 unsubscribe - 取消订阅
3.3 市场数据查询
3.3.1 current - 查询实时行情
3.3.2 history - 查询历史行情
3.3.3 history_n - 查询历史行情最新n条
3.3.4 context.data - 已订阅的bar/tick前n条数据-指标计算常用
3.3.5 get_depth - 查询市场深度数据
3.3.6 get_trades - 查询市场交易数据
3.3.7 get_symbol - 查询指定交易币对(仅现货)
3.3.8 get_symbols_by_front -根据目标币查询交易对(仅现货)
3.3.9 get_symbol_of_coins - 某2个币种能否组成有效交易对(仅现货)
3.3.10 get_all_symbols_of_coin - 获取包含该币种的交易对(仅现货)
3.3.11 get_symbol_for_future - 查指定期货合约symbol(仅合约)
3.3.12 get_future_instruments -查询指定合约的基础信息(仅合约)
3.3.13 get_future_instruments_by_period -查询指定周期的合约信息(仅合约)
3.3.14 get_future_instruments_by_base -查询指定base币的合约信息(仅合约)
3.3.15 get_funding_rate -获取永续合约资金费率(仅合约)
3.3.16 get_mark_price -查询指定symbol的标记价格(仅合约)
3.4 市场数据事件
3.4.1 on_tick - tick数据推送事件
3.4.2 on_bar - bar数据推送事件
3.5 交易函数
3.5.1 order_volume - 按指定量委托(仅现货)
3.5.2 order_value - 按指定价值委托(仅现货)
3.5.3 order_future - 期货合约交易委托(仅合约)
3.5.4 order_batch - 批量委托接口
3.5.5 order_cancel - 撤销委托
3.5.6 order_cancel_all - 撤销所有委托
3.5.7 set_leverage - 设置杠杆(仅合约)
3.5.8 set_mode - 全仓和逐仓模式切换(仅合约)
3.5.9 add_margin - 增减保证金(仅合约)
3.6 交易&资产数据查询
3.6.1 get_unfinished_orders - 查询当前策略全部未结委托订单
3.6.2 get_orders - 查询当前策略历史全部委托
3.6.3 get_execution_reports - 查询当前策略的订单的执行回报
3.6.4 get_unfinished_orders_intraday - 查询当前策略24h内全部未结委托
3.6.5 get_orders_intraday - 查询当前策略24h内全部委托
3.6.6 get_execution_reports_intraday - 查询当前策略24h内的执行回报
3.6.7 get_positions - 查询当前策略绑定的交易所账户的持仓
3.6.8 get_exchange_rate - 查询币种的公允usd法币汇率
3.6.9 get_margin_assets - 查询账户保证金资产和权益(仅合约)
3.7 交易事件
3.7.1 on_execution_report - 委托执行回报事件
3.8 指标函数
3.8.1 MACD - 指数平滑异同平均线
3.8.2 RSI - 强弱指标
3.8.3 ATR - 平均真实波幅
3.8.4 MA - 移动平均线
3.9 其他函数
3.9.1 log - 日志函数
3.9.2 get_version - 查询api版本
3.9.3 now() - 查询当前时间
3.10 错误处理等其他事件
3.10.1 on_backtest_finished - 回测结束事件
3.10.2 on_error - 错误处理事件
3.10.3 on_market_data_connected - 实时行情网络连接成功事件
3.10.4 on_market_data_disconnected - 实时行情网络连接断开事件
4. 错误码
5. API封禁规则
6. talib 库指标函数
1. 入门
1.1 基础入门
1.1.1 什么是量化交易?
量化交易是指在证券(股票、期货、外汇、数字货币等)市场,通过接入交易平台的自动化交易接口,进行程序化
交易的方式;不同于常规的有人主动进行的交易,量化交易通过编写代码进行;只要交易的程序的策略可靠,不
需要人工盯盘即可持续的赚取收益,极其适合7*24小时交易的数字货币市场
1.1.2 BitQuant量化工具支持使用哪些语言进行策略编写?
BitQuant量化工具目前支持使用Python 3.6.x进行代码编写( 或 Anaconda 集成版),但不支持低于3.6版本的
Python3;
Python3.7版本理论上是支持的,但是这个Python版本本身不稳定且需要安装最新版的Visual Studio,不建议使
用
未来计划支持Python2.7版本/C++/JavaScript/matlab/R 编写策略。如果您没有任何Python程序编写经验,可
以通过Python程序入门快速开始,您会发现Python是如此简单
1.1.3 BitQuant量化工具如何执行策略
1) 创建策略:下载量化工具后,通过 “研究策略” 创建自己的策略代码, 在客户端内编辑完成,也可以通过自己习
惯的编辑器编辑完成后拷贝到客户单IDE中;
2) 加入实盘:要执行策略,首先需要将策略“加入实盘”,实际上是需要你绑定自己在各个交易所的真实交易账
户;
3) 绑定交易账户:需要提供真实交易账户的API key 和 Secret key(这两个是什么?,这两个key是您在交易所进
行自动化交易的身份标识,可以从交易所API管理页面获取,必须提供给NFT量化工具;
绑定真实账户后,您的策略就会出现在“实盘交易” 中了,开启交易后策略就会连接到交易所账户运行;
注意:这里API key、Secret key以及策略本身都是存储在用户本地的,不会上传,因此不必担心关键数据和策
略泄露
1.2 支持的交易所和交易区
1.2.1 支持的交易所
数字货币交易所众多,NFT已经覆盖现货(5个)及期货(bitMex)交易所,并包含头部交易量90%,并且在不断添加
中;支持交易所见下面表格
交易所名称
交易所代码(不区分大小写)
支持的交易品种(现货/期货)
OKEx
OKEX
现货
币安
BINANCE
现货
火币Pro
HUOBI
现货
bitfinex(大B站)
BITFINEX
现货/现货杠杆
Fcoin
FCOIN
现货
BitMEX
BITMEX
期货
ZB
ZB
现货(即将支持)
OKEx期货
OKEXFU
期货(即将支持)
以上交易所的交易代码,不区分大小写,可以用于组成交易币对symbol(见交易代码),所有交易都会通过symbol
完成 ; 但不建议手工拼装symbol(手工拼装必须大小写正确); 如果是现货交易,请使用get_symbol()方法产
生合法symbol,该方法参数忽略大小写; 如果是期货交易,请使用get_symbol_for_future()方法产生合法
symbol
1.2.2 支持的交易区
目前NFT支持以下交易区
交易区代码
说明
btc
比特币交易区
eth
以太坊交易区
usdt
泰达币(usd tether)交易区
bnb
币安币(binance平台币)交易区
usd
法币美元交易区(在支持美元法币交易的交易所)
期货交易区
包括bitmex的期货合约交易(不包括期权交易),以及即将支持okex期货合约交易
1.3 回测系统
1.3.1 什么是回测系统
当完成一个策略的程序编写后,怎么才能知道策略的逻辑、策略收益方向等基本情况,赚钱不赚钱?当然直接拿
真金白银去交易市场上跑还是很有风险的,我们可以用历史数据来测试您的策略,看看您的策略在历史数据中盈
利如何,是亏钱还是赚钱
1.3.2 如何使用回测系统
策略创建后,即可通过IDE或策略列表的回测入口进行回测配置,配置包括:
配置项
说明
开始时间
回测采用历史K线开始日期
结束时间
回测采用历史K线结束日期
滑点比率
限价单不一定能100%按照要成交,真实成交价格和目标价之差和目标价之比率,默认0
成交比率
流动性影响,价格达到目标时不是100%成交,一般设置75%-100%,默认100%
初始资产
支持根据交易所配置对应btc、eth、usdt、usd、bnb的资产分布
配置完成后即可开始回测,回测将得出在结束时间点时的资产总金额;通过和初始资产的法币总价值做比较可
以得出策略的收益率、夏普率、最大回撤、alpha、beta、卡玛比率、风险比率、胜率等Indicator指标; 注
意:目前回测尚不支持期货交易
1.4 几个策略代码示例
便于您的学习,我们直接从几个策略代码开始,您会发现用BitQuant框架写代码只需短短几行,第2)节中详细展开具体
数据结构和函数功能,您可以对照这些代码学习
1.4.1 网格交易策略
策略说明:
网格交易策略(grid trading method),也称鱼网交易法,指以某点为基点,每上涨或下跌一定点数挂一定数量空单
或多单,设定盈利目标,但不设止损,当价格朝期望方向进展时获利平仓,并在原点位挂同样的买单或卖单
交易标的:BINANCE的btc/usdt币对,数据频率60s
计算过去300条价格数据的均值和方差
根据均值+/-2个和3个标准差作为网格区间分界线
根据价格所在区间配置仓位(价格+/-40为上下界)
(0,2],(2,3],(3,40位持仓量对应为[0,0.5,1]
# coding=utf-8
from __future__ import print_function, absolute_import
from nf.api import *
import talib as ta
import pandas as pd
import numpy as np
def init():
global exchange
#交易所
global front
#交易币
global base
#基础币
global symbol
#交易币对
global freq
#数据频率
global count
#滑窗数
exchange='BINANCE'
front='btc'
base='usdt'
symbol=get_symbol(exchange,front,base)
freq='300s'
count=300
print('init')
subscribe(symbols=symbol,frequency=freq,count=count)
def on_bar(bars):
global exchange
#交易所
global front
#交易币
global base
#基础币
global symbol
#交易币对
global freq
#数据频率
global count
#滑窗数
#获取数据
records=context.data(symbol,freq,count)
#数据获取自交易所,但交易所本身也很难保证提供的数据100%的完整性
#因此需要判断获取数据的数量量是否满足要求或者判断数据是否有效
#您可以根据实际需要在策略逻辑中进行相应处理
if len(records)==count:
#获取网格区间分界线
band=np.mean(records['close'].iloc[:-1])+np.array([0,2,3,40])*np.std(records['close'].iloc[:-1]
)
#网格区间的持仓量
vol=[0,0.5,1]
grid=pd.cut([records['close'].iloc[-1]],band,labels=[0,1,2])[0]
#如果btc有持仓
if len(get_positions(exchange,front))!=0:
#大于等于1,将多仓调整至指定交易量
if grid>=1:
add_vol=vol[grid]-get_positions(exchange,front)[0]['available']
if add_vol>0:
if get_positions(exchange,base)[0]['available'] >
records['close'].iloc[-1]*add_vol:
order_volume(symbol,volume=add_vol,order_type=2,side=1,position_effect=1)
else:
print(base,'余额不足,不能买入',front)
if add_vol<0:
if len(get_positions(exchange,front))!=0:
order_volume(symbol,volume=add_vol,order_type=2,side=2,position_effect=1)
else:
print(front,'余额不足,不能卖出')
#grid=0将btc清仓
elif grid==0:
if len(get_positions(exchange,front))!=0:
order_volume(symbol,volume=get_positions(exchange,front)[0]
['available'],order_type=2,side=1,position_effect=1)
else:
print(front,'余额不足,不能卖出')
#如果没有btc持仓,则网格突破时买入指定的交易量
else:
if grid>=1:
if get_positions(exchange,base)[0]['available'] >
records['close'].iloc[-1]*vol[grid]:
order_volume(symbol,volume=vol[grid],order_type=2,side=1,position_effect=1)
else:
print(base,'余额不足,不能买入',front)
def on_execution_report(execrpt):
print('打印交易回执:',execrpt)
def on_error(code,info):
print('错误代码:',code,'错误代码说明:',info)
def on_backtest_finished(indicator):
print('绩效对象打印:',indicator)
if __name__ == '__main__':
run(strategy_id='{{strategy_id}}',
filename='main.py',
mode=MODE_LIVE,
token='{{token}}')
1.4.2 双均线策略
策略说明:
2条均线, 一条为短周期快线MA(30), 一条长周期慢线MA(66),这里使用小时线
快线上穿慢线,出现买点;快线下穿慢线,出现卖点
from __future__ import print_function, absolute_import
from nf.api import *
import pandas as pd
import talib as tb
def init():
global trade
#交易标志
global exchange
#交易所
global front
#币对前项
global base
#币对后项
global symbol
#交易币对
global freq
#频率
global fast
#快速均线
global slow
#慢速均线
fast=30
slow=66
trade=False
exchange='BINANCE'
front='btc'
base='usdt'
symbol=get_symbol(exchange,front,base)
freq='3600s'
print('init')
subscribe(symbol,freq,count=slow+1)
def on_bar(bars):
global trade
#交易标志
global exchange
#交易所
global front
#币对前项
global base
#币对后项
global symbol
#交易币对
global freq
#频率
global fast
#快速均线
global slow
#慢速均线
#获取数据
records=context.data(symbol,freq,slow+1)
#数据获取自交易所,但交易所本身也很难保证提供的数据100%的完整性
#因此需要判断获取数据的数量量是否满足要求或者判断数据是否有效
#您可以根据实际需要在策略逻辑中进行相应处理
if len(records)==slow+1:
#计算MA指标
ma_fast=tb.MA(records['close'],fast)
ma_slow=tb.MA(records['close'],slow)
if trade==False and ma_fast.values.reshape(slow+1)[-2] < ma_slow.values.reshape(slow+1)
[-2] and ma_fast.values.reshape(slow+1)[-1] > ma_slow.values.reshape(slow+1)[-1]:
if get_positions(exchange,base)[0]['available'] > records['close'].iloc[-1]:
print('均线金叉,买入!!')
order_buy=order_volume(symbol,1,side=1,order_type=1,position_effect=1,price=records['close'].il
oc[-1])
trade=True
else:
print(base,'余额不足,无法买入',front)
if trade==True and ma_fast.values.reshape(slow+1)[-2]>ma_slow.values.reshape(slow+1)[-2]
and ma_fast.values.reshape(slow+1)[-1]<ma_slow.values.reshape(slow+1)[-1]:
print('均线死叉,卖出!!')
#获取当前BTC持仓信息
if len(get_positions(exchange,front))!=0:
vol=get_positions(exchange,front)[0]['available']
order_sell=order_volume(symbol,vol,side=2,order_type=1,position_effect=1,price=records['close']
.iloc[-1])
trade=False
else:
print(front,'没有持仓,无法卖出')
def on_execution_report(execrpt):
print('成交回报:',execrpt)
def on_error(code,info):
print('错误代码:',code,'错误代码说明',info)
def on_backtest_finished(indicator):
print('绩效对象打印:',indicator)
if __name__ == '__main__':
run(strategy_id='{{strategy_id}}',
filename='main.py',
mode=MODE_LIVE,
token='{{token}}')
1.4.3 Dual Thrust交易策略
策略说明: Dual Thrust策略是一种趋势跟踪系统,曾被Future Thruth杂志评为最赚钱的策略之一。Dual
Thrust系统具有简单易用和适用度广的特点, 其思路简单且参数少,配合不同的参数、止盈止损和仓位管理可以
为投资者带来长期稳定的收益。而且该策略适用品种较多,被投资者广泛应用 于股票、货币、贵金属、债券、
能源及股指期货市场等。在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心。
Dual Thrust在Range的设置上,引入前N期的四个价位,Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。
其中HH是N期High的最高价,LC是N期Close的最低价,HC是N期Close的最高价,LL是N期Low的最低价。这种方
法使得一定时期内的Range相对稳定, 可以适用于日间的趋势跟踪。Dual Thrust对于多头和空头的触发条件,
考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期数, 也可以通过参数K1和K2来确定。具体
分为两步来实现:
第一步:计算相关参数,得到上轨Buyline 和下轨Sellline:
BuyLine = Open + K1*Range
SellLine =
Open - K2*Range
第二步:交易逻辑: 当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开
多仓; 当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;
from __future__ import print_function, absolute_import
from nf.api import *
import pandas as pd
from datetime import datetime
import numpy as np
def init():
global trade
#交易标志
global symbol
#交易币对
global freq
#频率
global exchange
#交易所
global front
#币对前项
global base
#币对后项
global num
trade = False
exchange='BINANCE'
front='btc'
base='usdt'
symbol= get_symbol(exchange,front,base)
freq='3600s'
num=5
print('init')
subscribe(symbol,freq,num,wait_group=True)
def on_bar( bars):
global trade
#交易标志
global symbol
#交易币对
global freq
#频率
global exchange
#交易所
global front
#币对前项
global base
#币对后项
global num
#参数k1、k2可调整
k1=0.5
k2=1
print('--------------------------------------------------')
records=context.data(symbol,freq,num)
#数据获取自交易所,但交易所本身也很难保证提供的数据100%的完整性
#因此需要判断获取数据的数量量是否满足要求或者判断数据是否有效
#您可以根据实际需要在策略逻辑中进行相应处理
if len(records)==num:
HH=records['high'].iloc[0:-1].max()
LC=records['close'].iloc[0:-1].min()
HC=records['close'].iloc[0:-1].max()
LL=records['low'].iloc[0:-1].min()
Range = np.max((HH-LC,HC-LL))
BuyLine = records['open'].iloc[-1] + k1*Range
SellLine = records['open'].iloc[-1] - k2*Range
if trade==False and records['close'].iloc[-1] > BuyLine:
if get_positions(exchange,base)[0]['available'] > records['close'].iloc[-1]:
print(bars[0]['eob'],'买入!!')
order_buy=order_volume(symbol,1,side=1,order_type=2,position_effect=1)
print(get_positions(exchange))
trade=True
else:
print(base,'余额不足,停止策略')
unsubscribe(symbol,freq)
if trade==True and records['close'].iloc[-1] < SellLine:
if len(get_positions(exchange,front))!=0:
print(bars[0]['eob'],'卖出!!')
order_sell=order_volume(symbol,get_positions(exchange,front)[0]
['available'],side=2,order_type=2,position_effect=1)
print(get_positions(exchange))
trade=False
else:
print(front,'没有持仓')
def on_execution_report(execrpt):
print('成交回报:',execrpt)
def on_backtest_finished(indicator):
print('绩效对象打印:',indicator)
if __name__ == '__main__':
run(strategy_id='{{strategy_id}}',
filename='main.py',
mode=MODE_LIVE,
token='{{token}}')
1.4.4 海龟交易策略
策略说明:
交易标的:BINANCE.btc_usd, 数据频率1d
价格突破20日唐安琪通道,买入。买入单元N按照ATR规则,保持价格每单位交易仓位的价格变动导致总资
产波动率为1%,止损价为开仓价下移2*N
价格继续0.5N时,加仓0.5N个btc,同时止损价提高0.5N
价格跌破止损价或者20日唐安琪下通道,清仓btc。
from __future__ import print_function, absolute_import
from nf.api import *
import talib as tb
import numpy as np
import pandas as pd
def init():
global paramas
#唐安琪通道参数
global exchange
#交易所
global front
#交易币
global base
#基础币
global symbol
#交易币对
global freq
#数据频率
global periods
#数据滑窗
global initia
#空仓标志位
global unit
#交易单元N
global stop_loss
#止损价
global time
paramas=[20]
exchange='BINANCE'
front='eth'
base='usdt'
symbol=get_symbol(exchange,front,base)
freq='3600s'
periods=20+1
initia=0
unit=0
stop_loss=0.0
time=[0,0]
print('init')
subscribe(symbol,frequency=freq,count=periods)
def on_bar(bars):
global paramas
#唐安琪通道参数
global exchange
#交易所
global front
#交易币
global base
#基础币
global symbol
#交易币对
global freq
#数据频率
global periods
#数据滑窗
global initia
#空仓标志位
global unit
#交易单元N
global stop_loss
#止损价
global time
records=context.data(symbol,freq,periods)
#数据获取自交易所,但交易所本身也很难保证提供的数据100%的完整性
#因此需要判断获取数据的数量量是否满足要求或者判断数据是否有效
#您可以根据实际需要在策略逻辑中进行相应处理
if len(records)==periods:
print('------------------------------------------------------')
time[0]=bars[0]['eob']
#计算唐安琪通道
tanganqi_up=np.max(records['high'].values[:-1])
tanganqi_down=np.min(records['low'].values[:-1])
#print(records)
#btc空仓且突破20日最高价,按照ATR仓位规则开仓
if initia==0 and records['close'].values[-1]>tanganqi_up and time[0]!=time[1]:
atr=tb.ATR(records['high'].values,records['low'].values,records['close'].values,timeperiod=para
mas[0])
unit=get_positions(exchange,base)[0]
['available']*0.01/((atr[-1])*records['close'].iloc[-1])
if unit*records['close'].values[-1] < get_positions(exchange,base)[0]['available']:
print('突破唐安琪通道,买入')
order_volume(symbol,volume=unit,side=1,order_type=2,position_effect=1)
initia=1
stop_loss=records['close'].values[-1]-2*unit
time[1]=bars[0]['eob']
else:
print(base,'余额不足')
#有持仓,如果价格继续上升0.5*N时,加仓0.5*N,同时止损价提高0.5*N,如果价格跌破止损价或者跌破唐安琪
通道,清仓
if initia==1 and time[0]!=time[1]:
if (records['close'].values[-1]-records['close'].values[-2]) > 0.5*unit:
if unit*records['close'].values[-1] < get_positions(exchange,base)[0]
['available']:
print('继续加仓')
order_volume(symbol,volume=0.5*unit,side=1,order_type=2,position_effect=1)
stop_loss+=0.5*unit
time[1]=bars[0]['eob']
else:
print('加仓时',base,'余额不足')
#跌破止损价,清仓
if records['close'].values[-1]<stop_loss or records['close'].values[-1]
<tanganqi_down:
if len(get_positions(exchange,front))!=0:
print('清仓')
order_volume(symbol,volume=get_positions(exchange,front)[0]
['available'],side=2,order_type=2,position_effect=1)
initia=0
time[1]=bars[0]['eob']
else:
print(front,'余额不足')
def on_execution_report(execrpt):
print('打印交易回执:')
print(execrpt)
def on_error(code,info):
print('错误代码:',code,'错误代码说明:',info)
def on_backtest_finished(indicator):
print('绩效对象打印:',indicator)
if __name__ == '__main__':
run(strategy_id='{{strategy_id}}',
filename='main.py',
mode=MODE_LIVE,
token='{{token}}')
1.4.5 BitMEX期现套利
策略说明:
这里以bitmex平台btc季度合约和BITFINEX平台btc现货为例,现货交易所和套利品种可换 该版本暂只考虑做
多现货做空期货一种套利方向
from __future__ import print_function, absolute_import
from nf.api import *
import pandas as pd
import numpy as np
def init():
global exchange#现货交易所
global symbol#合约/币对
global cost#合约手续费
global bid#最新买一价
global ask#最新卖一价
global front#币对前项
global base#币对后项
global lever#杠杆倍数
global asset#最大单方向持仓数量,单位usd
exchange='BITFINEX'
symbol=['a','a']
cost=[-0.00025,0.0015]
bid=[0,0]
ask=[0,0]
front='btc'
base='usd'
per='q'
lever=1
asset=10000#最大资产量,单位usd
symbol[0]=get_symbol_for_future('bitmex',front,base,per)
print(symbol[0])
subscribe(symbol[0],'tick',1)
symbol[1]=get_symbol(exchange,front,base)
print(symbol[1])
subscribe(symbol[1],'tick',1)
def on_tick(tick):
global exchange#现货交易所
global symbol#合约/币对
global cost#合约手续费
global bid#最新买一价
global ask#最新卖一价
global front#币对前项
global base#币对后项
global lever#杠杆倍数
global asset#最大持仓数,单位usd
h=[0,0]
#print(tick)
for i in range(0,len(symbol)):
if
tick['symbol']==symbol[i]:
bid[i]=tick['quotes'][0]['bid_p']
ask[i]=tick['quotes'][0]['ask_p']
if len(get_positions('bitmex',symbol[0]))>0:
h[0]=get_positions('bitmex',symbol[0])[0]['amount']
else:
h[0]=0
if len(get_positions(exchange,front))>0:
h[1]=get_positions(exchange,front)[0]['available']
else:
h[1]=0
if
min(bid)>0 and min(ask)>0:
if
ask[0]/bid[1]-2*cost[0]-2*cost[1]>1.0025:
print(symbol[0],'空',symbol[1],'多')
set_leverage('bitmex',symbol[0],lever)#设置期货杠杆为1
if asset+h[0]>0:#当前合约空仓量不足,触发期货卖空交易
order_sell=order_future(symbol=symbol[0],volume=asset+h[0],side=5,order_type=1,exec_inst=
[ExecInstType_PostOnly],price=ask[0])
if h[1]*get_mark_price(symbol[0])<asset:#当前现货多仓量不足,触发现货买入交易,现货持仓
数量为btc,可通过bitmex的mark_price折算为usd
order_buy=order_volume(symbol=symbol[1],volume=(asseth[1]*get_mark_price(symbol[0]))/(1cost[1]),side=1,order_type=1,position_effect=1,price=bid[1]+0.001)
if
ask[0]/bid[1]<1.0005:
print(symbol[0],'平',symbol[1],'平')
if h[0]<0:
order_buy=order_future(symbol=symbol[0],volume=-
h[0],side=6,order_type=1,exec_inst=[ExecInstType_PostOnly],price=bid[0])
if h[1]>0:
order_sell=order_volume(symbol=symbol[1],volume=h[1],side=2,order_type=1,position_effect=1,pric
e=ask[1]-0.001)
def on_execution_report(execrpt):
print('交易回执:',execrpt)
def on_error(code,info):
print('错误代码:',code,'错误代码说明:',info)
if __name__ == '__main__':
run(strategy_id='557caa3e-e653-11e8-908f-00ff8a8bfd32',
filename='main.py',
mode=MODE_LIVE,
token='d8799c0dedccbed3762866a3c7c187a4')
2. 程序基础框架
2.1 基本概念
2.1.1 symbol - 交易币对代码
交易代码(symbol)是NFT数字货币量化平台用于唯一标识交易标的代码,格式在不同的交易所不一样,但都包括
3个部分:
Exchange(交易所代码)
base(目标币),交易的目标币,目前除usdt和法币外,全部币种都可以充当目标币
quote(报价币),又叫做交易区,是用于报价的主流币种,例如usdt、btc等,各交易所提供不同quote
在使用时,需要通过get_symbol (exchange,base,quote) 方法获取symbol而不是手工拼装
目前支持交易所如下:
交易所名称
交易所代码(不区分大小写)
支持的交易品种(现货/期货)
OKEx
OKEX
现货
币安
BINANCE
现货
火币Pro
HUOBI
现货
bitfinex(大B站)
BITFINEX
现货
BitMEX
BITMEX
期货
ZB
ZB
现货(即将接入)
Fcoin
FCOIN
现货
OKEx期货
OKEXFU
期货(即将接入)
symbol中的目标币为交易币,报价币为交易区,目前支持的报价币为
报价币(交易区)代码
说明
btc
比特币交易区
eth
以太坊交易区
usdt
泰达币(usd tether)交易区
bnb
币安币(binance平台币)交易区
usd
法币美元交易区(在支持美元法币交易的交易所如bitfinex)
2.1.2 mode - 实盘/回测的运行模式
策略支持两种运行模式, 实时模式和回测模式,用户需要在运行策略时选择模式.
实时模式 订阅行情服务器推送的实时行情,也就是交易所的实时行情,只在交易时段提供。
回测模式 订阅指定时段、指定交易代码、指定数据类型的行情,行情服务器将按指定条件全速回放对应的行情
数据。适用的场景是策略回测阶段,快速验证策略的绩效是否符合预期。
2.1.3 context - 上下文对象
context是策略运行上下文环境对象, 该对象将会在你的算法策略的任何方法之间做传递,该对象为全局对象可 在代
码内直接引用
除了系统提供的, 用户也可以根据需求自己定义无限多种自己随后需要的属性
context.symbols - 订阅代码集合
context.symbols
返回值:
类型
说明
set(str)
订阅symbol交易币对集合
context.data - 数据滑窗
获取订阅的bar或tick滑窗范围内的数据,数据为包含当前时刻推送bar( or tick)的前count条bar(or tick)数据,
count不超过subscribe()方法中count参数指定值;
若需要获取最近的已订阅的tick和bar数据,请使用context.data获取,该方法从缓存中获取数据能极大加快运算
速度
但是对于没有订阅过得缓存中没有的数据则应当使用history或history_n方法
本方法只返回dataframe结果
原型:
context.data(symbol,frequency,count,fields)
参数:
参数名
类型
说明
symbol
str
标的代码
frequency
str
频率,所填频率应包含在subscribe订阅过的频率
count
int
滑窗大小,正整数,此处count值应小于等于subscribe中指定的count值
fields
str
所需bar或tick的字段,如有多属性, 中间用 , 隔开,默认返回数据全部字段
返回值:
类型
说明
dataframe
tick的dataframe 或者 bar的dataframe
示例:获取okex的eth_usdt的缓存的分钟线
data = context.data(symbol=get_symbol('okex','eth','usdt'), frequency='60s', count=2,
fields='symbol,open,close,volume,eob')
输出:
包含symbol,open,close,volume,eob字段的分钟线bar数据,symbol必须经过订阅,否则返回空
注意:
1. 所得数据按eob时间正序排列 2. 不支持传入多个symbol或frequency,若输入多个,则返回空dataframe 3. 本参数
count不应超过subscribe()方法中count参数指定的值,超过只会返回subscribe()方法中count数 4. 若fields查询字
段包含无效字段,返回KeyError错误 5. 若某些时刻没有发生交易或交易所原因导致没有bar数据,数据滑窗会用之前
的数据填充,因此使用滑窗数据有必要检查一下每个bar或tick的create_at时间戳并处理可能的空数据情况
2.2 经典程序框架
NFT目前支持使用Python语言编写策略,支持Python2.7 和 Python 3.6;计划支持C++、matlab、R语言编写
策略。所有的策略程序遵循以下架构编写:
init() 为策略程序初始化函数,策略启动自动执行,函数主要功能:
定义任务调度:通过schedule()函数配置定时任务,指定时间运行策略
市场数据查询:通过市场数据查询函数获取历史数据
订阅实时行情:通过subscribe()函数订阅实时市场行情,触发行情事件处理函数
on_tick() 、on_bar() 行情事件处理函数
on_tick() : 通过on_tick()响应tick事件,在该函数中添加策略逻辑,如进行数据计算,进行委托交易
on_bar() : 通过on_bar() 响应bar事件,在该函数中添加策略逻辑,如进行数据计算,进行委托交易
on_execution_report() 、 on_order_status() 交易事件处理函数
on_execution_report() :委托被执行后,会接收回报execrpt数据,本函数将处理回报数据
on_order_status() :订单状态变化(成交、撤销等)本事件触发,用于委托状态变化后处理业务逻辑
on_error() 错误处理事件用于获取并处理交易过程中产生的错误信息
run() 函数---策略的入口,run用于启动策略,所有交易类策略都需要run()函数,其有2个必备参数:
token:用户身份标识,策略创建自动产生
strategy_id : 策略唯一标识,策略创建时自动产生
run函数其他参数见基本函数-run
示例:一个基本的策略结构-定时交易
以下代码是一个简单的定时交易任务,在每天14:50在交易所OKEX,使用usdt购买btc
# coding=utf-8
# 引入nf.api,nf.api为sdk包
from __future__ import print_function, absolute_import, unicode_literals
from nf.api import *
#策略初始化,context为上下文对象,可以传递全局变量
def init():
#配置定时任务,每天14点50分执行策略
schedule(schedule_func=algo, date_rule='1d', time_rule='14:50:00')
# 策略执行函数
def algo():
# 使用指定量委托函数order_volume下单
# OKEX用usdt购买btc,数量0.2btc,市价单,用get_symbol(market,base,quote)获取交易symbol
# order_type=OrderType_Market代表市价单,此时price指定为0
order_volume(symbol=get_symbol('okex','btc','usdt'),
volume=0.2,side=OrderSide_Buy,order_type=OrderType_Market)
if __name__ == '__main__':
#run策略入口, 运行模式MODE_BACKTEST,回测模式下运行,strategy_id和token在创建代码时终端自动添
加
run(strategy_id='strategy_1',filename='main.py',mode=MODE_BACKTEST,token='token_id')
示例:一个基本的策略结构-事件驱动
以下代码是一个事件驱动策略 , 订阅okex的btc分钟bar, 当bar的close超过8000usdt时市价买入
# coding=utf-8
# 引入nf.api,nf.api为sdk包
from __future__ import print_function,absolute_import, unicode_literals
from nf.api import *
#策略初始化,init中订阅okex的btc_usdt分钟线
def init():
#订阅okex的btc_usdt分钟bar
subscribe(symbols=get_symbol('okex','btc','usdt'),frequency='1m')
# 订阅bar数据会产生bar数据事件,在下面on_bar事件处理函数中执行策略
def on_bar(bars):
# bars为订阅的全部bar列表,bar.close为当前bar的结束价格,bar的参数见2.3.9 bar对象说明
# 使用order_volume下市价单
for bar in bars :
if bar['close'] == 8000 :
order_volume(get_symbol('okex','btc','usdt'),0.2,
OrderSide_Buy,OrderType_Market)
# 打印执行回报
def on_execution_repor(execrpt):
print('成交回报:',execrpt)
#打印错误码和错误信息,也可做其他逻辑处理
def on_error(code, info):
print(code,info)
if __name__ == '__main__':
run(strategy_id='strategy_1',filename='main.py',mode=MODE_BACKTEST,token='token_id')
2.3 枚举常量
2.3.1 SecurityType- 交易品种
交易品种类型
SecurityType_Physical
= 0; // 现货
SecurityType_Future
= 1; // 期货合约
2.3.2 OrderSide - 委托方向
委托方向
OrderSide_Buy = 1
# 买入,仅现货
OrderSide_Sell = 2
# 卖出,仅现货
OrderSide_Buy_Open = 3
# 买入开多,仅合约
OrderSide_Buy_Close = 4
# 买入平空,仅合约
OrderSide_Sell_Open = 5
# 卖出开空,仅合约
OrderSide_Sell_Close = 6
# 卖出平多,仅合约
OrderSide_Sell_Liquadation = 7
# 卖出强制平仓,交易所触发
OrderSide_Sell_Reduce = 8
# 卖出强制减仓,交易所触发
OrderSide_Buy_Liquadation = 9
# 买入强制平仓,交易所触发
OrderSide_Buy_Reduce = 10
# 买入强制减仓,交易所触发
2.3.3 OrderType - 委托类型
委托类型:NFT目前支持市价和限价委托和止损止盈委托
OrderType_Limit = 1
# 限价委托
OrderType_Market = 2
# 市价委托
OrderType_StopMarket = 3
# 市价止损委托,仅合约,卖出止损时,止损价必须低于当前标记价,买入止损
时,止损价必须高于当前标记价
OrderType_StopLimit = 4
# 限价止损委托,仅合约,卖出止损时,止损价必须低于当前标记价,买入止损
时,止损价必须高于当前标记价
OrderType_ProfitMarket = 5
# 市价止盈委托,仅合约,卖出止盈时,止盈价必须高于当前标记价,买入止
盈时,止盈价必须低于当前标记价
OrderType_ProfitLimit = 6
# 市价止盈委托,仅合约,卖出止盈时,止盈价必须高于当前标记价,买入止
盈时,止盈价必须低于当前标记价
2.3.4 OrderStatus - 委托状态
委托状态: 订单委托的状态更新 ,通过on_order_status()接收并处理订单状态变更
OrderStatus_Failed = 1;
# 报送失败
OrderStatus_New = 2;
# 已报送
OrderStatus_PartiallyFilled = 3;
# 部分成交
OrderStatus_PartiallyCanceled = 4; # 部分成交撤销
OrderStatus_Filled = 5;
# 已完成
OrderStatus_Canceled = 6;
# 已撤销
OrderStatus_Expired = 7;
# 过期
OrderStatus_Rejected = 8;
# 已拒绝
OrderStatus_PendingNew = 10;
# 待报
2.3.5 ExecType - 执行回报状态
执行回报状态:交易执行的状态更新(1个订单可能有多次执行), on_execution_report()接收并处理交易执行情况
# 报送失败
ExecType_Failed = 1
ExecType_New = 2
# 已报送
ExecType_PartiallyFilled = 3
# 部分成交
ExecType_PartiallyCanceled = 4
# 部分成交撤销
ExecType_Filled = 5
# 已完成
ExecType_Canceled = 6
# 已撤销
ExecType_Expired = 7
# 过期
ExecType_Rejected = 8
# 已拒绝
ExecType_PendingNew = 10
# 待报
ExecType_CancelRejected = 19
# 撤单被拒绝
2.3.6 PositionSide - 持仓方向
持仓方向
PositionSide_Long = 1
# 多方向
PositionSide_Short = 2
# 空方向
2.3.7 OrderStyle - 订单创建类型
订单创建类型:通过NFT创建委托的方式,包括
OrderStyle_Volume = 1
# 按指定量委托
OrderStyle_Value = 2
# 按指定价值委托
2.3.8 ExecInst - 执行方式(仅合约)
订单创建类型:委托执行方式,仅bitmex合约有效 在Order_future()下单时指定,可以同时使用多个
ExecInstType_PostOnly = 0
#被动委托,出现在每档价格最后成交
ExecInstType_MarkPrice = 1
#止损止盈单使用的结算价格触发
ExecInstType_IndexPrice = 2
#止损止盈单使用的标记价格触发
ExecInstType_LastPrice = 3
#止损止盈单使用的当前成交价格触发
ExecInstType_ReduceOnly = 4
#只减仓,若下单仓位与当前仓位反向且多于当前仓位,那么只减少当前的净仓位而
不会在减少为0后再反向开仓
2.4 数据结构
2.4.1 Tick - 分时数据对象
Tick为逐笔行情数据,一般对应分时图刷新频率,不同交易所6s-10s不等,该对象包括以下参数:
参数名
类型
说明
symbol
str
交易代码
price
double
最新价格
quotes
dict
包含买1价和卖1价的深度字典列表,列表目前只返回1个包含
买一卖一档位数据的深度字典,见quotes,只支持实盘和信
号模式,不支持回测
price_change
double
24h价格变动值(按照报价币)
price_change_perc
double
24h价格变动率
volume
double
24h 总成交量(按照目标币)
day_high
double
24h 最高价
day_low
double
24h 最低价
created_at
datetime.datetime
创建时间
quotes---支持实盘和信号模式,不支持回测
为一个字典列表,列表里包括1个字典对象 ,对应买一卖一档位数据 ;通过quotes[0]获取当前标的一档买卖数据
quotes[0]包含以下4个key
key
类型
说明
bid_p
double
买一价
bid_v
double
买一量
ask_p
double
卖一价
ask_v
double
卖一量
2.4.2 Bar - K线数据对象
Bar为K线行情数据 , 该对象包括以下参数:
参数名
类型
说明
symbol
str
交易代码
frequency
str
open
double
当前bar开盘价
close
double
当前bar收盘价
high
double
当前bar最高价
low
double
当前bar最低价
volume
double
当前bar成交量
bob
datetime.datetime
bar开始时间
eob
datetime.datetime
bar结束时间
频率 , 支持按秒计算,60s代表1min,3600s代表1hour,86400s代
表1day
2.4.3 Depth - 深度对象
Depth为市场的交易深度对象, 仅支持实盘使用,不支持回测,该对象包括以下参数:
参数名
类型
说明
price
double
报价
volume
double
该档报价对应的目标币深度量
accumulate
double
该档以及之前的所有低档位对应的目标币深度之和
2.4.4 Trade - 交易对象
Trade为交易对象,该对象包括以下参数:
参数名
类型
说明
symbol
str
交易币对代码
amount
double
base币成交量
price
double
成交价
side
int
买卖方向
time
datetime.datetime
交易发生时间
2.4.5 Instrument - 交易标的对象
包含交易币对的各种信息(symbol、报价币、目标币、交易所代码),如果是期货标的对象还会包含合约周期、结算日
期、最大杠杆率和合约面值等信息
属性
类型
说明
更多
symbol
str
交易代码
quote
str
报价币(交易区币种)
base
str
目标币
market
str
交易所代码
settle_currency
str
期货结算币种 ,例如,bitmex永续合约为btc
仅合约有效
period
str
结算周期,见period
仅合约有效
listing_date
Datetime.datetime
合约上线时间
仅合约有效
settle_date
Datetime.datetime
合约结算时间
仅合约有效
max_leverage
double
最大杠杆倍数
仅合约有效
min_pos
double
最小合约张数
仅合约有效
period结算周期含义:
取值
说明
d
当日结算合约
w
当周结算合约
bw
下周结算合约
m
当月结算合约
bm
下月结算合约
q
当季结算合约
bq
双季结算合约
y
当年结算合约
p
永续合约
2.4.6 Order - 委托对象
委托对象包含委托订单的各种参数,策略可以在on_order_status()中获取Order对象状态,执行业务逻辑
Order对象同时支持现货和期货合约, 部分字段仅合约有效
属性
类型
说明
strategy_id
str
策略ID
account_id
str
NFT账号ID
account_name
str
NFT账户登录名
cl_ord_id
str
ex_ord_id
str
委托在交易所的ID(系统字段)
symbol
str
标的代码
side
int
买卖方向 取值参考 OrderSide
order_type
int
委托类型 取值参考OrderType
status
int
ord_rej_reason_detail
str
委托拒绝原因描述
price
double
委托价格,市价单此参数无效
volume
double
委托量
value
double
filled_volume
double
已成量
filled_amount
double
已成金额
subject
int
exec_inst
string
执行方式,见ExecInst
仅合约
leverage
double
订单初始杠杆
仅合约
model_type
int
1:全仓 2 :逐仓
仅合约
stop_price
double
委托止损/止盈触发价格
仅合约
created_at
datetime.datetime
委托创建时间
委托客户端ID,下单生成,固定不
可通过此字段获取
变
订单信息
委托状态 取值参考
OrderStatus
按照quote报价币计算的委托价
值
交易品种:1 合约 ,0 现货 ; 见
SecurityType
2.4.7 ExecRpt - 回报对象
回报对象用于管理订单的执行情况,可以在on_execution_report()中通过查询ExecRpt对象获取订单状态的变化和
执行的情况,并做相应处理
回报对象也同时支持现货和合约的交易,部分数据为合约独有
属性
类型
说明
strategy_id
str
策略ID
account_id
str
NFT客户端登录ID
account_name
str
NFT 客户端登录用户名
cl_ord_id
str
委托客户端ID,下单生成,固定不变
ex_ord_id
str
委托交易所ID
exec_id
str
本次执行回报ID
symbol
str
交易对标识
base
string
现货或合约的目标币
quote
string
现货或合约的报价币
side
int
买卖方向 参考OrderSide
order_type
int
委托类型 参考OrderType
ord_rej_reason_detail
str
委托拒绝原因描述
exec_type
int
执行回报类型 取值参考 ExecType
volume
double
本订单累计已成交数量:
现货: 按照目标币base数量计算
合约: 按照合约数量计算
amount
double
price
double
总成交价值:
按照报价币quote计价,合约和现货一致
订单的平均成交价格
仅
stop_price
double
止盈止损的触发价格,为>0值
合
约
created_at
datetime.datetime
回报创建时间
original_price
double
委托创建时的原始委托价格(按报价币)
original_volume
double
委托创建时的原始委托数量(按目标币)
execinst
int
执行方式,参考ExecInst
仅
合
约
仅
liquidation
bool
True代表这是一个强制平仓的交易
合
约
2.4.8 Position - 持仓对象
Position代表用户持有的某种代币的仓位情况 ,包括资产价格、仓位大小,结合ExchangRate可以计算资产的账面法
币价值
Postion对象同时支持现货和期货合约,部分字段为现货专有,部分为合约专有
参数名
类型
说明
account_id
str
账号ID
exchange
str
交易所代码
currency
str
现货持仓的币种
仅
现
货
side
int
持仓方向 取值参考 PositionSide
仅
frozen
double
冻结数量
现
货
仅
available
double
可用数量
现
货
仅
cash
double
价值(公允汇率计算)
现
货
仅
symbol
string
期货标的交易对
合
约
仅
base
string
标的base
合
约
仅
quote
string
标的quote
合
约
交易品种,标记期货合约or现货
subject
int
0: 现货
1: 期货合约
参考 SecurityType
amount
double
持仓数量,空仓为负,多仓为正
仅
value
double
持仓价值, 现货按照quote计算
合
约
仅
mark_price
double
标记价格(用于结算和强制平仓),按照quote计价
合
约
参数名
类型
说明
仅
liquidation_price
double
强平价格
合
约
仅
bankrupt_price
double
穿仓价格
合
约
仅
init_margin_rate
double
开仓初始保证金比例
合
约
仅
margin
double
当前仓位占用的保证金
合
约
仅
maintain_margin
double
保持不被平仓的最低保证金
合
约
仅
margin_rate
double
当前持仓的保证金比率
合
约
model_type
int
1 :全仓
2 : 逐仓
仅
合
约
仅
current_commission
double
当前仓位产生的佣金
合
约
仅
margin_currency
string
保证金结算货币种类
合
约
仅
confirmed_profit
double
确认盈利,已经实现盈亏, 只对永续合约有效
合
约
仅
unconfirmed_profit_markprice
double
未确认盈利,以markprice计价
合
约
仅
unconfirmed_profit
double
未确认盈利(浮盈/亏),以最新合约市价计价
合
约
参数名
类型
说明
仅
leverage
double
杠杆率
合
约
仅
avgEntryPrice
double
开仓价
合
约
仓位状态 ,包括:
pos_state
str
"normal" : 正常, “liquadation”:“强制清算
仅
中“,“liquadated”:“清算完成”,“deleverage”:“自动
合
减仓”; 除了“normal” 其他均为异常状态,由交易所
约
风控触发,一旦触发则仓位被冻结不能交易
2.4.9 Asset - 保证金资产对象(仅合约)
Asset为用户期货合约账户的保证金资产,包括持仓扣除杠杆的真实权益和冻结、可用的保证金余额:
属性
类型
说明
currency
string
账户清算货币,Asset对象的所有余额数据都以currency为计算单位
margin_balance
double
保证金余额,账户的真实权益(归属用户的资金)
available_balance
double
可用余额(保证金余额-持仓保证金-冻结保证金),可用于开仓的保证金
realised_pnl
double
已实现盈亏
unrealised_pnl
double
未实现盈亏
margin
double
持仓保证金,目前持有的仓位中抵押的保证金
order_margin
double
冻结保证金(委托保证金),目前提交的委托中按照杠杆抵押的保证金
2.4.10 ExchangeRate - 公允汇率对象
参数名
类型
说明
currency
str
币代码
from_currency
str
法币代码,目前支持USD
price
double
汇率
rate_time
str
汇率时间,格式:yyyy-mm-dd hh:ii:ss
2.4.11 Indicator - 绩效指标对象
Indicator对象汇集了策略回测的绩效指标:
参数名
类型
说明
account_id
str
账号ID
cash
double
总资产(换算到usd)
commission
double
累计的交易手续费
banch_mark
double
banch_mark_ratio
double
基准收益率
pnl
double
策略产生的累计收益(换算到法币usd)
pnl_ratio
double
累计收益率
pnl_ratio_annual
double
年化收益率
sharp_ratio
double
夏普比率
max_drawdown
double
最大回撤
volatility
double
收益波动率
risk_ratio
double
风险比率
alpha
double
阿尔法值
beta
double
贝塔值
up_p
double
上涨率
max_up_days
int
最大资产连续上涨天数
max_down_days
int
最大资产连续下跌天数
win_count
int
lose_count
int
win_ratio
double
胜率 (win_count / (win_count + lose_count))
calmar_ratio
double
卡玛比率
created_at
datetime.datetime
updated_at
datetime.datetime
2.4.12 Stat- API调用结果对象
基准收益(象征着数字货币市场的基准收益,可用于策略产生
的收益进行对比)
盈利次数,本次交易后总资产法币价值超过上次交易后则本
次交易为盈利
亏损次数,本次交易后总资产法币价值低于上次交易后则本
次交易为亏损
Stat对象主要用于处理例如更改保证金、修改杠杆率、修改全仓逐仓模式等方法返回的错误数据
Stat对象和on_error事件不同,运用Stat对象可以在调用方法后同步立即处理错误
参数名
类型
说明
ret
int
状态码: 0代表操作成功, 1代表操作失败
reason
str
错误原因
3.API函数
3.1 基本函数
3.1.1 init - 初始化策略
初始化策略, 策略启动时自动执行。可以在这里初始化策略配置参数。
函数原型:
init()
示例:
def init():
# 订阅bar
subscribe(symbols=get_symbol('okex','btc','usdt'), frequency='1m', count=5,
wait_group=True, wait_group_timeout='5s')
注意: 回测模式下init函数里不支持交易 (例如order_volume) 操作 , 实盘模式支持
3.1.2 schedule - 每日执行定时任务
每天定时自动执行策略算法, 通常用于选股类型策略
函数原型:
schedule(schedule_func, date_rule, time_rule)
参数:
参数名
类型
说明
schedule_func
function
策略定时执行算法
date_rule
str
目前只支持 '1d', 也就是每天执行
time_rule
str
执行算法的具体时间 (%H:%M:%S 格式)
返回值:
None
示例:
def init():
#每天的19:06:20执行策略algo
schedule(schedule_func=algo, date_rule='1d', time_rule='19:06:20')
def algo():
#从okex交易所使用usdt买入2btc,市价下单
order_volume(symbol=get_symbol('okex','btc','usdt'), volume=2, side=OrderSide_Buy,
order_type=OrderType_Market)
注意:
1. time_rule的时,分,秒均可以只输入个位数,例: '9:40:0' 或 '14:5:0' , 但若对应位置为零,则0不可被省略,比
如不能输入 '14:5: '
2. data_rule目前只支持 1d
3.1.3 run - 运行策略总入口
策略程序运行入口 函数原型:
run(strategy_id, filename, mode, token=, backtest_params='', backtest_adjust=ADJUST_NONE,
backtest_check_cache=1,serv_addr='')
参数:
是否
参数名
类型
strategy_id
str
是
filename
str
是
mode
int
是
token
str
是
backtest_adjust
enum
否
backtest_params
obj
否
backtest_check_cache
int
否
serv_addr
str
否
必须
说明
策略id , 通过NFT客户端创建策略时自动填写
策略文件的名称, NFT客户端会创建策略时自动填写
为‘main.py’,可手工修改
策略模式MODE_LIVE(实时)=1
MODE_BACKTEST(回测) =2
用户标识,通过NFT客户端创建策略时自动产生
mode=2回测模式有效,固定为ADJUST_NONE(不做复
权调整)
mode=2回测模式时有效,本参数通过客户端配置产生,
无需在代码中直接赋值
mode=2回测模式有效,回测是否使用缓存:1 - 使用, 0
- 不使用;默认使用
终端服务地址, 默认本地地址, 可不填,若需指定应输入
ip+端口号,如”127.0.0.1:8080”
返回值:
None
示例:
run(strategy_id='strategy_1', filename='main.py', mode=MODE_LIVE, token='token_id')
注意:
1. run函数中, mode=MODE_LIVE 也可改为 mode=1 , backtest_adjust 同理
2. backtest_start_time和backtest_end_time中月,日,时,分,秒均可以只输入个位数,例: '2016-6-7
9:55:0' 或 '2017-8-1 14:6:0' ,但若对应位置为零,则0不可被省略,比如不能输入 "2017-8-1 14:6: "
3. filename指运行的py文件名字,如该策略文件名为Strategy.py,则此处应填”Strategy.py”
3.1.4 stop - 停止策略
停止策略运行
函数原型:
stop()
返回值:
None
示例:
#若不存在对应的symbol则停止策略
if not get_symbol('okex','fcf','btc'):
stop()
3.2 市场数据订阅
3.2.1 subscribe - 行情订阅
订阅行情, 可以指定symbol, 数据滑窗大小, 以及是否需要等待全部代码的数据到齐再触发事件。
函数原型:
subscribe(symbols, frequency='1d', count=1, wait_group=False, wait_group_timeout='10s',
unsubscribe_previous=False)
参数:
是
参数名
类型
否
必
说明
须
str
symbols
or
订阅交易代码, 支持字串格式,如有多个代码, 中间用 , (英
是
list
文逗号) 隔开, 也支持 ['symbol1', 'symbol2'] 这种列表
格式
频率, 支持 ‘tick’, ‘60s’, ‘600s’, 1800s’, '600s' , ‘86400s'等,
frequency
str
否
分别对应分时线、分钟线、10分钟线、30分钟线、小时
线、日线;
具体依
赖于交易所提供的bar的频率,务必使用 's' 作为输入;
订阅数据滑窗大小, 默认 1 ,影响本地缓存数据的大小,
count
int
否
若希望缓存较多数据可以将count设置大一些,然后通过
context.data()获取
是否需要等待全部代码的数据到齐再触发事件, 默认
wait_group
bool
否
False 不到齐。设置为 True 则等待订阅标的 eob(bar结
束时间) 相同且frequency相同的 bar 全部到齐再被调用。
该参数只在订阅Bar数据时有效。
wait_group_timeout
str
否
unsubscribe_previous
bool
否
超时时间设定, 支持 s 结尾表示单位 秒 , 默认 10s
是否取消过去订阅的symbols, 默认 False 不取消, 输入
True 则取消所有原来的订阅。
返回值:
None
示例:此处本地会缓存连续count=5根bar,可以通过context.data 获取
subscribe(symbols=get_symbol('okex','eos','usdt'), frequency='60s', count=5,
wait_group=True)
注意:
subscribe支持多次调用,并可以重复订阅同一交易币对。
3.2.2 unsubscribe - 取消订阅
取消行情订阅, 默认取消所有已订阅行情
函数原型:
unsubscribe(symbols='*', frequency='86400s')
参数:
是
参数名
类
否
型
必
说明
须
str
symbols
or
交易币对, 支持字串格式,如果有多个币对代码, 中间用 , (英文逗号) 隔
是
list
开; * 表示所有, 默认退订所有代码 也支持 ['symbol1', 'symbol2']
这种列表格式的参数
频率, 支持 ‘tick’, ‘60s’, ‘600s’, 1800s’, '600s' , ‘86400s'等, 分别对应分时
frequency
str
是
线、分钟线、10分钟线、30分钟线、小时线、日线;
具体依赖于交易所提供的bar的频率,务必使用 's' 作为输入;
返回值:
None
示例:取消okex的eos_usdt日线
unsubscribe(symbols=get_symbol('okex','eos','usdt'), frequency='86400s')
注意: 如示例所示代码,取消 okex的eos-usdt交易对 的 tick 行情的订阅,该代码不会取消相同交易币对其他频
度的订阅
3.3 市场数据查询
3.3.1 current - 查询实时行情
查询当前行情快照,返回tick数据。回测时,返回回测时间点的tick数据
函数原型:
current(symbols, fields='')
参数:
参数名
类型
是否
必须
str
symbols
or
是
list
fields
str
否
说明
查询代码,如有多个代码, 中间用 , (英文逗号) 隔开, 也支持
['symbol1', 'symbol2'] 这种列表格式
指定查询的字段, 默认所有字段,具体字段见:Tick
返回值: list[tick]
示例:
current_data = current(symbols=get_symbol('okex','ada','usdt'))
输出:
返回tick的列表,示例中只有一个symbol,因此只返回该symbol的当前tick数据
注意:
1. 若输入包含无效标的代码,则返回的列表只包含有效标的代码对应的 dict
2. 若输入代码正确,但查询字段中包括错误字段,返回的列表仍包含对应数量的 dict ,但每个 dict 中除有效字
段外,其他字段的值均为 空字符串/0
3.3.2 history - 查询历史行情
查询给定时间段给定交易币对的历史行情,一般用于非订阅的大量历史数据获取,尽量避免大量循环使用
如果是查询最近已经订阅的bar或tick数据,尽量使用context.data(),该方法将取缓存数据速度远快于history
函数原型:
history(symbol, frequency, start_time, end_time, fields=None, df=False)
参数:
是
参数名
类型
否
说明
必
须
symbol
str
是
frequency
str
是
标的代码(只允许传入唯一代码)
频率, 支持 ‘tick’, ‘60s’, ‘600s’, 1800s’, '600s' , ‘86400s'等, 分别对应分
时线、分钟线、10分钟线、30分钟线、小时线、日线;
具体依赖于交易所提供的bar的频率,务必使用 's' 作为输入;
start_time
str
是
end_time
str
是
fields
str
否
df
bool
否
开始时间 (YYYY-MM-DD hh:mm:ss 格式)
可
用now()获取当前时间;
结束时间 (YYYY-MM-DD hh:mm:ss 格式)
可
用now()获取当前时间;
指定返回对象字段, 如有多个字段, 中间用, 隔开, 默认所有
是否返回 dataframe格式,默认 False , 返回list[dict],dict对象为tick或
者bar对象
返回值:
df = True
类型
说明
dataframe
tick的dataframe 或者 bar的dataframe
df = False
类型
说明
list
tick 列表 或者 bar 列表
示例:
history_data = history(symbol=get_symbol('okex','eth','usdt'), frequency='86400s',
start_time='2018-01-02 00:00:00', end_time='2018-11-03 00:00:00', df=False)
注意:
1. 返回的 list/DataFrame 是以参数 eob/bob 的升序来排序的,若要获取多标的的数据,通常需进一步的数据处
理来分别提取出每只标的的历史数据
2. start_time和end_time中月,日,时,分,秒均需要输入正确的时间格式,例: '2018-07-08 09:40:00' 或 '2017-0730 12:03:00' ,若对应位置为零,则 0 不可被省略,如不可输入 '2017-7-30 12:3: ' 或 '2017-7-30 12:3:00'
3. 若输入无效标的代码,返回 空列表/空DataFrame
4. 若输入代码正确,但查询字段包含无效字段,返回的列表、DataFrame只包含 eob、symbol 和输入的其他有
效字段
3.3.3 history_n - 查询历史行情最新n条
查询指定币对最新的n条历史行情,一般用于非订阅的有限量历史数据获取,需网络通信尽量避免大量循环使用
如果是查询最近已经订阅的bar或tick数据,尽量使用context.data()
函数原型:
history_n(symbol, frequency, count, end_time=None, fields=None, df=False)
参数:
是
参数名
类型
否
说明
必
须
symbol
str
是
标的代码(只允许单个标的的代码字符串)
频率, 支持 ‘tick’, ‘60s’, ‘600s’, 1800s’, '600s' , ‘86400s'等, 分别对应分
frequency
str
是
时线、分钟线、10分钟线、30分钟线、小时线、日线;
具体依赖于交易所提供的bar的频率,务必使用 's' 作为输入;
count
int
是
end_time
str
是
返回数据的条数
结束时间 (YYYY-MM-DD hh:mm:ss 格式);
使用当前bar的时间戳请用bar.eob ;
也可用now()获取当前时间;
fields
str
否
指定返回对象字段, 如有多个字段, 中间用 , 隔开, 默认所有
df
bool
否
是否返回dataframe 格式, 默认False, 返回list[dict]
返回值:
df = True
类型
说明
dataframe
tick的dataframe 或者 bar的dataframe
df = False
类型
说明
list
tick 列表 或者 bar 列表
示例:
history_n_data = history_n(symbol=get_symbol('okex','eth','usdt'),frequency='tick',
count=100, end_time=now(), fields='open,symbol,price', df=False)
返回:
因为指定了frequency=‘tick’ ,则返回tick 列表 , 因为指定了fields , 每个tick对象只包含对应的字段
注意:
1. 返回的 list/DataFrame 是以参数 eob/bob 的升序来排序的
2. 若输入无效标的代码,返回 空列表/空DataFrame
3. 若输入代码正确,但查询字段包含无效字段,返回的列表、DataFrame只包含 eob、symbol 和输入的其他有
效字段
4. end_time中月,日,时,分,秒均需要输入正确的时间格式 例如 '2017-08-30 12:03:00' 若对应位置为零,则 0
不可被省略,如不可输入 '2017-7-30 12:3: ' 或 '2017-7-30 12:3:00'
3.3.4 context.data - 已订阅的bar/tick前n条数据-指标计算常用
获取订阅的bar或tick滑窗范围内的数据,数据为包含当前时刻推送bar( or tick)的前count条bar(or tick)数据,
count不超过subscribe()方法中count参数指定值;
若需要获取最近的已订阅的tick和bar数据,请使用context.data获取,该方法从缓存中获取数据能极大加快运算
速度
但是对于没有订阅过得缓存中没有的数据则应当使用history或history_n方法
本方法只返回dataframe结果
原型:
context.data(symbol,frequency,count,fields)
参数:
参数名
类型
说明
symbol
str
标的代码
frequency
str
频率,所填频率应包含在subscribe订阅过频率中
count
int
滑窗大小,正整数,此处count值应小于等于subscribe中指定的count值
fields
str
所需bar或tick的字段,如有多属性, 中间用 , 隔开,默认返回数据全部字段
返回值:
类型
说明
dataframe
tick的dataframe 或者 bar的dataframe
示例:获取okex的eth_usdt缓存数据
data = context.data(symbol=get_symbol('okex','eth','usdt'), frequency='60s', count=2,
fields='symbol,open,close,volume,eob')
输出:
包含symbol,open,close,volume,eob字段的分钟线bar数据,symbol必须经过订阅,否则返回空
注意:
1. 所得数据按eob时间正序排列 2. 不支持传入多个symbol或frequency,若输入多个,则返回空dataframe 3. 本参数
count不应超过subscribe()方法中count参数指定的值,超过只会返回subscribe()方法中count数 4. 若fields查询字
段包含无效字段,返回KeyError错误 5. 若某些时刻没有发生交易或交易所原因导致没有bar数据,数据滑窗会用之前
的数据填充,因此使用滑窗数据有必要检查一下每个bar或tick的create_at时间戳并处理可能的空数据情况
3.3.5 get_depth - 查询市场深度数据
查询市场深度数据,根据指定的symbol和档位数获取深度,仅支持实盘交易和信号,不支持回测
函数原型:
get_depth(symbol,points)
参数:
类
是否必
型
须
symbol
str
是
points
int
否
参数名
说明
标的代码(只允许单个标的的代码字符串)
默认10档, 支持的档位参数最多50档,若该币对不支持50档,则返回其支
持的最大档位
返回值:
返回一个字典类型对象
类型
说明
dict
{'points':int ,'bids':[Depth], 'asks':[Depth]}
points为该币对深度的档位数目; bids为买入深度对象列表,价格由高到低排序;
asks为卖出深度对象列表,价格由低到高排序;
示例:
depth_data = get_depth(symbol=get_symbol('okex','eth','usdt'),points=20)
返回:
返回okex的eth/usdt币对20档深度,最高20档买价和最低20档卖价,若交易所币对不支持20档数据,则返回支持的最
高档位数据,并在字典的‘points’ 中指明档位数
注意:
1. 返回的bids是价格由高到低排序的,asks是由低到高排序的
2. 若输入无效标的代码,返回 空字典
3. 不支持回测模式,回测模式下无深度数据
3.3.6 get_trades - 查询市场交易数据
给定某个截止时间点,查询时间点前的n条市场交易数据
函数原型:
get_trades(symbol,end_time=datetime.datetime.now(),count=1,df=false)
参数:
参数名
类型
symbol
str
end_time
是否
必须
str or
datetime.datetime
说明
是
标的代码(只允许单个标的的代码字符串)
否
默认当前时间
默认1返回当前最新,最多返回1000条
count
int
否
df
bool
否
是否返回dataframe 格式, 默认False, 返回
list[dict],dict对象为trade对象
返回值:
df = True
类型
说明
dataframe
trade对象的dataframe,时间倒叙排列
df = False
类型
说明
list
trade对象列表,时间倒叙排列
示例:
trade = get_trades(symbol=get_symbol('okex','eth','usdt'),end_time=now(),count=20)
返回:
返回okex的eth/usdt最新的20笔交易,时间倒序
注意:
1. 若输入无效标的代码,返回 空列表
3.3.7 get_symbol - 查询指定交易币对(仅现货)
查询指定交易所内,使用指定的报价币和目标币是否能组成交易币对symbol,有则返回币对,仅现货可用
函数原型:
get_symbol(market,front, rear)
参数:
参数名
类型
是否必须
说明
market
str
是
见交易所代码, 必填
front
str
是
指定的目标币,必填
rear
str
是
指定的报价币(交易区),必填
返回值:
格式:str
key
类型
说明
symbol
str
标的代码
示例:
get_symbol(market='OKEX',front='eos',rear='usdt',false)
注意:
1. 区分报价币和目标币,只有符合market.base_quote组合的币对才会返回,如果没有则返回空列表
3.3.8 get_symbols_by_front -根据目标币查询交易对(仅现货)
根据指定的 交易所/目标币查询所有包含目标币的交易币对信息,仅现货可用
函数原型:
get_symbols_by_front(market, currency, df=false)
参数:
参数名
类型
是否必须
说明
market
str
是
见交易所代码, 必填
currency
str
是
指定目标币,必填
df
bool
否
是否返回dataframe格式, 默认False, 返回list[str]
返回值:
类型:str对象的list/dataframe
df = True
类型
说明
dataframe
symbol(str类型)的dataframe
df = False
类型
说明
list
symbol(str类型)的list
示例: 返回list
get_symbols_by_front(market='OKEX',currency='eos')
注意:
1. market和currency都是必须的,不能缺省
2. 若查询字段包含无效字段,返回的 列表/DataFrame 只包含有效字段数据
3.3.9 get_symbol_of_coins - 某2个币种能否组成有效交易对(仅现货)
查询指定交易所内,使用指定的2个币种是否能组成交易币对symbol,有则返回币对,仅现货可用
函数原型:
get_symbol_of_coins(market, currency_a, currency_b, df=false)
参数:
参数名
类型
是否必须
说明
market
str
是
见交易所代码, 必填
currency_a
str
是
指定的币种a,必填
currency_b
str
是
指定的币种b,必填
返回值:
格式:str
key
类型
说明
symbol
str
标的代码
示例:
get_symbol_of_coins(market='OKEX',currency_a='usdt',currency_b='btc')
注意:
1. currency_a,currency_b都是必须的,不能缺省
2. currency_a和currency_b , 不区分报价币和目标币,查询结果会返回由这两种币组成的交易币对,如果没有则
返回空列表
3.3.10 get_all_symbols_of_coin - 获取包含该币种的交易对(仅现货)
查询指定交易所,包含该币种的所有交易对,包括以该币为目标币或报价币,仅现货可用
函数原型:
get_all_symbols_of_coin(market, from_currency, df=false)
参数:
参数名
类型
是否必须
说明
market
str
是
见交易所代码, 必填
from_currency
str
是
指定币,必填
df
bool
否
是否返回dataframe格式, 默认False, 返回list[str]
返回值:
类型:str对象的list/dataframe
df = True
类型
说明
dataframe
symbol(str对象)的dataframe
df = False
类型
说明
list
symbol(str对象)的list
示例: 返回list
get_all_symbols_of_coin(market='OKEX',from_currency='eth')
注意:
1. 返回全部包含该币种的交易对,不管该币种为报价币还是目标币
3.3.11 get_symbol_for_future - 查指定期货合约symbol(仅合约)
通过指定交易所、目标币、报价币、合约结算周期来获取交易的symbol合约,仅期货可用
函数原型:
get_symbol_for_future(exchange, base, quote, period, date)
参数:
是
参数名
类
否
型
必
说明
须
exchange
str
是
见交易所代码, 必填
base
str
是
指定的目标币(永续合约xbtusd中的btc为目标币),必填
quote
str
是
指定的报价币(永续合约xbtusd中的usd为报价币) ,必填
period
str
否
date
str
否
指定的期货合约结算周期,包括d,w,bw,m,bm,q,bq,y,p, 和date两者必填
其一,优先date
指定的期货合约结算日期,按照“yyyy-mm-dd”的格式,例如2019年3月9
日写作 “2019-03-09”,和period两者必填其一,优先date
period结算周期含义:
取值
说明
d
当日结算合约
w
当周结算合约
bw
下周结算合约
m
当月结算合约
bm
下月结算合约
q
当季结算合约(3个月内)
bq
双季结算合约(3个月外)
y
当年结算合约
p
永续合约
返回值:
格式:str
key
类型
说明
symbol
str
标的代码
示例1: 返回bitmex的btc永续合约xbtusd
get_symbol_for_future('bitmex','btc','usd','p')
示例2: 返回bitmex的btc 2019年3月29日的双季度合约
进入2019年后该合约会变成period=='q'合约,所以尽量使用具体时间方式
get_symbol_for_future('bitmex','btc','usd','bq')
示例3: 返回bitmex的btc 2019年3月29日的双季度合约,建议对于有交割日的合约使用具体时间获取
symbol
get_symbol_for_future('bitmex','btc','usd','2018-03-29')
注意:
1. 所有字段不能缺省
3.3.12 get_future_instruments -查询指定合约的基础信息(仅合约)
通过指定合约symbol查询期货合约交割、强平、清算时间等基础信息
函数原型:
get_future_instruments(symbol,df)
参数:
参数名
类型
是否必须
说明
symbol
str
是
通过get_symbol_for_future()获取,多个symbol可以用','分割
df
bool
否
是否返回dataframe格式, 默认False, 返回list[Instrument]
返回值:
类型:Instrument对象的list/dataframe
df = True
类型
说明
dataframe
Instrument对象的dataframe
df = False
类型
说明
list
Instrument对象的list
示例: 返回bitmex BTC永续合约的instrument数据,返回值为只有1个对象的list
get_future_instruments(symbol=get_symbol_for_future('bitmex','btc','usd','p'),df=False)
注意:
1. 本接口的symbol请使用get_symbol_for_future()获取,也可以直接输入交易所的交易symbol(例如bitmex
BTC 永续合约为"XBTUSD")
3.3.13 get_future_instruments_by_period -查询指定周期的合约信息(仅合约)
通过指定周期标识获取对应合约的基本信息
函数原型:
get_future_instruments_by_period(period,exchange,df)
参数:
参数名
类型
是否必须
说明
period
str
是
交易周期,详见period
exchange
str
是
目标交易所
df
bool
否
是否返回dataframe格式, 默认False, 返回list[Instrument]
返回值:
类型:Instrument对象的list/dataframe
df = True
类型
说明
dataframe
Instrument对象的dataframe
df = False
类型
说明
list
Instrument对象的list
示例: 返回bitmex 月度合约数据,返回值为只有全部月度合约的list
get_future_instruments_by_period('m','bitmex')
3.3.14 get_future_instruments_by_base -查询指定base币的合约信息(仅合约)
通过指定目标币base获取对应合约的基本信息,包括不同交易所的合约
函数原型:
get_future_instruments_by_base(base,period,df)
参数:
参数名
类型
是否必须
说明
base
str
是
目标币,例如btc
period
str
是
交易周期,详见period
df
bool
否
是否返回dataframe格式, 默认False, 返回list[Instrument]
返回值:
类型:Instrument对象的list/dataframe
df = True
类型
说明
dataframe
Instrument对象的dataframe
df = False
类型
说明
list
Instrument对象的list
示例: 返回base为btc的全部月度合约数据,返回值为list
get_future_instruments_by_base('btc','m')
3.3.15 get_funding_rate -获取永续合约资金费率(仅合约)
通过指定symbol获取该合约的资金费率,因为期货现货持续价差的原因,永续合约在结算收益时间点需要对市场
弱势方进行补偿,该费率为合约补偿费率;
仅永续期货合约有效
函数原型:
get_funding_rate(symbol)
参数:
参数名
类型
是否必须
说明
symbol
str
是
请使用get_symbol_for_future()获取
返回值:
类型:double
类型
说明
double
资金费率
示例: 返回bitmex的btc永续合约的资金费率
get_funding_rate(get_symbol_for_future('bitmex','btc','usd','p'))
3.3.16 get_mark_price -查询指定symbol的标记价格(仅合约)
通过指定合约symbol获取合约的标记价格,该价格为现货和合约的一种加权价格,用于合约结算或强平触发
mark_price是以quote报价币计价的
函数原型:
get_mark_price(symbol)
参数:
参数名
类型
是否必须
说明
symbol
str
是
请使用get_symbol_for_future()获取
返回值:
类型:double
类型
说明
double
标记价格
示例: 返回bitmex的btc永续合约的标记价格
get_mark_price(get_symbol_for_future('bitmex','btc','usd','p'))
3.4 市场数据事件
3.4.1 on_tick - tick数据推送事件
接受到tick数据后, 系统会自动触发on_tick时间,因此tick执行相应的策略
函数原型:
on_tick(tick)
参数:
参数名
类型
是否必须
说明
tick
tick对象
是
当前被推送的tick
示例:
def on_tick(tick):
#打印tick对象
print(tick)
3.4.2 on_bar - bar数据推送事件
接受到bar数据后, 系统触发on_bar事件,并执行相应的策略 函数原型:
on_bar(bars)
参数:
参数名
类型
是否必须
说明
bars
list(bar)
是
当前被推送的bar列表
示例:
def on_bar(bars):
#打印获取的bar列表
for bar in bars:
print(bar)
注意:
1. 若在subscribe函数中订阅了多个标的的bar,但wait_group参数值为False , 则多次触发on_bar,每次返回只
包含单个标的list长度为1的bars; 若wait_group参数值为True, 则只会触发一次on_bar,返回包含多个标的的
bars。
2. bar在本周期结束时间后才会推送,标的在这个周期内无交易则不推送bar。
3.5 交易函数
3.5.1 order_volume - 按指定量委托(仅现货)
按照目标交易币的定量进行委托, 委托前请通过get_positions方法获取币种的持仓情况已确定是否能够交易 函
数原型:
order_volume(symbol,volume,side,order_type,position_effect,order_duration=OrderDuration_Unk
nown,order_qualifier=OrderQualifier_Unknown,account='',price=0)
参数:
是否
参数名
类型
symbol
str
是
标的代码
volume
double
是
数量
side
int
是
order_type
int
是
position_effect
int
否
预留字段,可以不填
order_duration
int
否
委托时间属性,预留字段
order_qualifier
int
否
委托成交属性,预留字段
否
BitQuant帐户
必须
说明
OrderSide_Buy = 1 # 买入
OrderSide_Sell = 2 # 卖出
OrderType_Limit=1 #限价单
OrderType_Market=2 #市价单
account id or
account
account name or
None
限价
price
double
单必
价格,市价单可以不填写,限价单必须
须
示例:
在okex交易所通过usdt交易区买入10000个btc
data = order_volume(symbol=get_symbol('okex','btc','usdt'), volume=10000,
side=OrderSide_Buy, order_type=OrderType_Limit, price=6789)
返回:
类型
说明
list[Order]
Order委托对象列表
list[Order] , 返回委托对象列表,本函数只能单次下一单,因此Order对象只有一个。如果委托被拒绝,则可以通
过检测Order对象的Order.status=OrderStatus.OrderStatus_Rejected和Order.ord_rej_reason_detail(拒绝
原因文案)来分析
注意:
1. 仅支持一个标的代码,若代码输入有误,终端会拒绝此单,并显示 委托代码不正确 ,建议使用get_symbol()方法
获取代码。
2. 若下单数量输入有误,终端会拒绝此单,并显示 委托量不正确 ,请先通过get_positions() 查询持仓保证交易完
成
3. Order_type优先级高于price,若指定OrderTpye_Market下市价单,使用价格为最新一个tick中的最新价,price
参数失效。
4. 输入无效参数报 NameError 错误,缺少参数报 TypeError 错误。
5. OKex或者Huobi的市价买单只支持使用quote报价,不支持使用base数量报价,因此order_volume方法会将
base的数量按照当前的市价转化成quote进行报价,这样一来也会造成最终的成交量和用户目标成交量有轻微
不一致的情况,对Okex和Huobi的市价买单请尽量使用order_value进行 。
3.5.2 order_value - 按指定价值委托(仅现货)
按照币对报价币的数量进行委托, 委托前请通过get_positions方法获取币种的持仓情况已确定是否能够交易
函数原型:
order_value(symbol, value, side,order_type, position_effect,
order_duration=OrderDuration_Unknown, order_qualifier=OrderQualifier_Unknown, account='',
price=0)
参数:
是
参数名
类型
否
必
说明
须
symbol
str
是
标的代码
value
double
是
买入时花费/卖出时获取的报价币(交易区币)的数量
side
int
是
order_type
int
是
position_effect
int
否
预留字段,可以不填
order_duration
int
否
委托时间属性,预留字段,可以不填
order_qualifier
int
否
委托时间属性,预留字段,可以不填
否
NFT帐户
OrderSide_Buy = 1 # 买入
OrderSide_Sell = 2 # 卖出
OrderType_Limit=1 #限价单
OrderType_Market=2 #市价单
account id or
account
account name or
None
限
价
price
double
单
必
须
价格,市价单可以不填写,限价单必须;
限价单时,为base目标币的价格;
示例:
下限价单,在bitfinex以11 usd的价格买入价值为100000 usdt的eos ,根据volume = value / price,计算并取整
得到volume = 9090
order_value(symbol=get_symbol('bitfinex','eos','usd'), value=100000, side=OrderSide_Buy,
order_type=OrderType_Limit, price=11)
返回:
类型
说明
list[Order]
Order委托对象列表
list[Order] , 返回委托对象列表,本函数只能单次下一单,因此Order对象只有一个。如果委托被拒绝,则可以通
过检测Order对象的Order.status==OrderStatus_Rejected和Order.ord_rej_reason_detail(拒绝原因文案)来
分析原因
注意:
1. 仅支持一个标的代码,若交易代码输入有误,终端会拒绝此单,并显示 委托代码不正确 ,建议使用get_symbol()
方法获取代码。
2. 根据指定价值计算购买标的数量,即 value/price ,向下取整,请先通过get_positions() 查询持仓保证交易完
成
3. Order_type优先级高于price,若指定OrderTpye_Market下市价单,计算使用价格为最新一个tick中的最新
价,price参数失效。
4. 输入无效参数报NameError错误,缺少参数报TypeError错误。
5. OKex或者Huobi的市价买单只支持使用quote报价,不支持使用base数量报价,请尽量使用order_value对
OKex和Huobi下市价买单而不是使用order_volume
3.5.3 order_future - 期货合约交易委托(仅合约)
按照目标交易币的定量进行委托, 委托前请通过get_positions方法获取币种的持仓情况已确定是否能够交易 函
数原型:
order_future(symbol, volume, side, order_type, leverage = 0, exec_inst,price, stop_price)
参数:
是
参数名称
参数类
否
型
必
备注
须
symbol
str
是
volume
double
是
标的代码
合约数量,需要>0
如果希望表示反向开仓或反向交易,请使用side字段标识
订单方向 ,见OrderSide
side
int
是
OrderSide_Buy_Open = 3
# 买入开多,仅合约
OrderSide_Buy_Close = 4
# 买入平空,仅合约
OrderSide_Sell_Open = 5
# 卖出开空,仅合约
OrderSide_Sell_Close = 6
# 卖出平多,仅合约
订单类型
order_type
leverage
int
double
是
否
OrderType_Limit = 1
# 限价委托
OrderType_Market = 2
# 市价委托
OrderType_StopMarket = 3
# 市价止损
OrderType_StopLimit = 4
# 限价止损
OrderType_ProfitMarket = 5
# 市价止盈
OrderType_ProfitLimit = 6
# 限价止盈
杠杆率,保留字段,bitmex交易无效
执行方式,包括被动订单/只减单等下单方式,还可以指定止盈止损单
exec_inst
list[int]
否
的触发价格类别,对应ExecInst , 需要传入一个int类型的list,多种执
行方式同时使用以[int , int , ...] 的形式传入;回测模式下本参数无
效
price
double
否
stop_price
double
否
stop_price 规则:
限价时,该symbol的汇率(对手币/本币)
触发价,必须>0 , 只对止损止盈单有效,且在order_type==‘3’ or ‘4’ or
‘5’ or ‘6’ 时,必填,必须基于stop_price规则填写:
OrderType
类型
说明
OrderType_StopMarket
市价
卖出止损时,止损价必须低于当前标记价,买入止损时,止损价必
=3
止损
须高于当前标记价
OrderType_StopLimit =
限价
4
止损
OrderType_ProfitMarket
市价
卖出止盈时,止盈价必须高于当前标记价,买入止盈时,止盈价必
=5
止盈
须低于当前标记价
OrderType_ProfitLimit =
限价
6
止盈
同上
同上
示例1:
在bitmex买入开多10000张btc永续合约,限定价格7268usd , 10倍杠杆
set_leverage('bitmex',get_symbol_for_future('bitmex','btc','usd','p'),10)
l = order_future(symbol=get_symbol_for_future('bitmex','btc','usd','p'), volume=10000,
side=OrderSide_Buy_Open, order_type=OrderType_Limit, price=7268)
示例2:
在bitmex,市价卖出平多btc永续合约
先判断持仓为多头,再进行市价平仓
pos=get_positions('bitmex',get_symbol_for_future('bitmex','btc','usd','p'))
if pos[0]['amount'] > 0:
l = order_future(symbol=pos[0]['symbol'], volume=pos[0]['amount'],
side=OrderSide_Sell_Close, order_type=OrderType_Market)
示例3:
在bitmex,当markprice的价格跌破6500时,以市价卖出btc永续合约进行平仓,全仓模式
这里通过exec_inst=[ExecInstType_MarkPrice] 指定止损触发加使用标记价格而不是正常的成交价格
l = order_future(symbol=get_symbol_for_future('bitmex','btc','usd','p'),
volume=100,side=OrderSide_Sell_Close, order_type=OrderType_StopMarket, leverage=0,
exec_inst=[ExecInstType_MarkPrice], stop_price=6500)
示例4:
在bitmex,当markprice的价格跌破6500时,以6498usd限价卖出开空btc 2019年3月合约,逐仓模式,10x杠杆,
被动下单模式;这里通过exec_inst=[ExecInstType_PostOnly,ExecInstType_MarkPrice] 指定止损触发加
使用标记价格 且使用被动模式方式下单
set_leverage('bitmex',get_symbol_for_future('bitmex','btc','usd','2019-03-29'),10)
l = order_future(symbol=get_symbol_for_future('bitmex','btc','usd','2019-03-29'),
volume=10000, side=OrderSide_Sell_Open, order_type=OrderType_StopMarket, exec_inst=
[ExecInstType_PostOnly,ExecInstType_MarkPrice], stop_price=6500)
返回:为以后的扩展,本接口返回Order的list对象 , 目前一次只能发一单,一次list只有一个对象
类型
说明
list[Order]
Order委托对象
本函数返回对象为只有一个Order对象的list,通过list[0]获取Order对象,如果委托被拒绝,则可以通过检测Order
对象的Order.status=OrderStatus.OrderStatus_Rejected和Order.ord_rej_reason_detail(拒绝原因文案)来分
析
注意:
1.仅支持一个标的代码,若代码输入有误,终端会拒绝此单,并显示 委托代码不正确 ,建议使用get_symbol()方法
获取代码。
2.Order_type优先级高于price,若指定OrderTpye_Market下市价单,使用价格为最新一个tick中的最新
价,price参数失效。
3.输入无效参数报 NameError 错误,缺少参数报 TypeError 错误
4.exec_inst参数在回测模式下无效
3.5.4 order_batch - 批量委托接口
已创建的order对象,可以进行一次性批量下单
函数原型:
order_batch(orders, combine=False, account='')
参数:
是否
参数名
类型
orders
list[order]
是
combine
bool
否
是否是组合单, 默认不是
否
NFT帐户
account
必须
account id or account
name or None
说明
Order对象列表,其中Order至少包含交易接口的
必选参数,参见Order
示例:
order_1 = {'symbol': get_symbol('okex','btc','usdt'), 'volume': 100, 'price': 11, 'side':
1,'order_type': 2, 'position_effect':1}
order_2 = {'symbol': get_symbol('bitfinex','btc','usd'), 'volume': 100, 'price':
11,'side':1, 'order_type': 2, 'position_effect':1}
orders = [order_1, order_2]
order_batch(orders, combine=True)
返回:
类型
说明
list[Order]
Order委托对象列表
返回包含所有下单成功的Order对象的列表list[Order] , 如果没有下单成功则Order不会包括在内,如果所有都
下单失败则返回[]空列表
注意:
1. 每个order的symbol仅支持一个标的代码,若交易代码输入有误,终端会拒绝此单,并显示 委托代码不正确 。
2. 如果有订单下单失败,则不会返回对应的Order对象
3. Order_type优先级高于price,若指定OrderTpye_Market下市价单,则price参数失效
4. 输入无效参数报NameError错误,缺少参数不报错,可能会出现下单被拒。
3.5.5 order_cancel - 撤销委托
该函数用于撤销未完成的订单 函数原型:
order_cancel(wait_cancel_orders)
参数:
参数名
类型
是否必须
说明
wait_cancel_orders
list[order]
是
已经创建的委托对象列表
示例:
order_1 = {'symbol':get_symbol('okex','btc','usdt'), 'cl_ord_id': 'cl_ord_id_1',
'price':11, 'side': 1, 'order_type':1 }
order_2 = {'symbol': get_symbol('bitfinex','btc','usd'), 'cl_ord_id':
'cl_ord_id_2','price': 11, 'side': 1, 'order_type':1 }
orders = [order_1, order_2]
order_cancel(wait_cancel_orders=orders)
3.5.6 order_cancel_all - 撤销所有委托
撤销当前所有未完成的委托订单
函数原型:
order_cancel_all(exchange)
参数:
参数名
类型
是否必须
说明
exchange
str
是
订单所在交易所
示例:
order_cancel_all('bitfinex')
3.5.7 set_leverage - 设置杠杆(仅合约)
设置合约的杠杆率
设置leverage=0,可以转为全仓模式,全部可用余额都可作为仓位资产的抵押
回测模式下,在有持仓的情况下无法使用set_leverage调整杠杆大小,只可在空仓下调整;实盘模式不受约
束
函数原型:
set_leverage(exchange,symbol,leverage)
参数:
是
参数名称
参数类
否
型
必
备注
须
exchange
str
是
交易所代码
symbol
str
是
合约标的代码,使用get_symbol_for_future()获取
leverage
double
是
0.01到100之间 ; bitmex修改则导致全部仓位的杠杆率都会调整;
设置为0代表将symbol仓位切换到全仓模式;
示例: 修改bitmex的btc永续合约的杠杆率为20倍
stat=set_leverage('bitmex',get_symbol_for_future('bitmex','btc','usd','p'),20)
返回:
类型
说明
Stat
Stat状态对象
返回Stat对象,其中字典参数 ['ret']==0代表操作成功;
可以在Stat对象的['ret']=='1'时 ,获取Stat对象的['reason']来分析其返回结果;
3.5.8 set_mode - 全仓和逐仓模式切换(仅合约)
设置合约的全仓保证金或逐仓保证金模式,全仓是使用全部保证金资产作为仓位的抵押物,逐仓使用开仓是指定
的保证金作为抵押物
回测模式下,在有持仓的情况下无法使用set_mode调整持仓模式,只可在空仓下调整;实盘模式不受约束
函数原型:
set_mode(exchange,symbol,model)
参数:
参数名称
参数类型
是否必须
备注
exchange
str
是
交易所代码
symbol
str
是
合约标的代码,使用get_symbol_for_future()获取
model
int
是
1:全仓
2:逐仓, 注意参数是model
示例: 修改bitmex的btc永续合约设置为全仓模式
status=set_mode(exchange='bitmex',symbol=get_symbol_for_future('bitmex','btc','usd','p'),mo
del=1)
返回:
类型
说明
Stat
Stat状态对象
返回Stat对象,其中字典参数 ['ret']==0代表操作成功;
可以在Stat对象的['ret']=='1'时 ,获取Stat对象的['reason']来分析其返回结果;
3.5.9 add_margin - 增减保证金(仅合约)
增减合约仓位的保证金,正为增加,负为减少
保证金变更后,仓位的杠杆也会相应变化
保证金的单位为Instrument中的settlecurrency字段对应的币种,BITMEX都是BTC
回测模式下,无法使用add_margin调整保证金,实盘模式不受限制
函数原型:
add_margin(exchange,symbol,amount)
参数:
参数名
类型
是否必须
说明
exchange
str
是
订单所在交易所
symbol
str
是
通过get_symbol_for_future()获取
amount
double
是
为Instrument中的settlecurrency字段对应的币种
示例: 在bitmex的btc永续合约持仓增加10个BTC的保证金
add_margin('bitmex',get_symbol_for_future('bitmex','btc','usd','p'), 10)
返回:
类型
说明
Stat
Stat状态对象
返回Stat对象,其中字典参数 ['ret']==0代表操作成功;
可以在Stat对象的['ret']=='1'时 ,获取Stat对象的['reason']来分析其返回结果;
3.6 交易&资产数据查询
3.6.1 get_unfinished_orders - 查询当前策略全部未结委托订单
查看当前策略所有未完结的委托订单,最多返回500条,按照创建时间倒叙(由近及远)排列
函数原型:
get_unfinished_orders(exchange)
返回值:
类型
说明
list[Order]
Order委托对象列表
参数:
参数名
类型
是否必须
说明
exchange
str
否
指定委托所在的交易所代码,默认是全部交易所
示例:获取当前策略在okex交易所的全部订单
get_unfinished_orders('okex')
注意:
1. 只返回当前策略下单的历史数据,不返回其他渠道下单(包括其他策略)下单的历史数据
3.6.2 get_orders - 查询当前策略历史全部委托
查询当前策略历史全部的委托,最多会返回最近的500条,按照创建时间倒叙(由近及远)排列
函数原型:
get_orders(exchange,symbols,cl_ord_ids)
参数:
是否
参数名
类型
exchange
str
否
指定委托所在的交易所代码,默认是全部交易所
symbols
list[str]
否
指定交易币对,列表形式,返回列表里币对对应的委托
cl_ord_ids
list[str]
否
必须
说明
指定委托ID,对应Order['cl_ord_id'],订单在用户本地的ID,唯一不
变;返回列表ID对应的订单
返回值:
类型
说明
list[Order]
Order对象列表
示例:
返回当前策略在okex交易所btc_usdt的历史订单, 最多限500条
li=[]
get_orders('okex',li.append(get_symbol('okex','btc','usdt')))
注意:
1. 只返回当前策略下单的历史数据,不返回其他渠道下单(包括其他策略)下单的历史数据
3.6.3 get_execution_reports - 查询当前策略的订单的执行回报
获取当前策略的全部订单的执行回报,包括历史订单,最多返回500条, 按时间倒叙(由近及远)排列
函数原型:
get_execution_reports(exchange)
参数:
参数名
类型
是否必须
说明
exchange
str
否
指定委托所在的交易所代码,默认是全部交易所
返回值:
类型
说明
list[ExecRpt]
ExecRpt回报对象列表
示例:
返回当前策略在所有交易所的历史成交回报,限制500条, 按时间倒叙(由近及远)排列
get_execution_reports()
注意:
1. 只返回当前策略下单的历史数据,不返回其他渠道下单(包括其他策略)下单的历史数据
3.6.4 get_unfinished_orders_intraday - 查询当前策略24h内全部未结委托
查看当前策略24h内未完结的委托订单,最多返回500条, 按时间倒叙(由近及远)排列
函数原型:
get_unfinished_orders_intraday(exchange)
返回值:
类型
说明
list[Order]
Order委托对象列表
参数:
参数名
类型
是否必须
说明
exchange
str
否
指定委托所在的交易所代码,默认是全部交易所
示例:
获取本策略在okex 24h内的未结委托订单, 按时间倒叙(由近及远)排列
get_unfinished_orders_intraday('okex')
注意:
1. 只返回当前策略下单的历史数据,不返回其他渠道下单(包括其他策略)下单的历史数据
3.6.5 get_orders_intraday - 查询当前策略24h内全部委托
查询当前策略24h内的全部的委托,最多会返回最近的500条, 按时间倒叙(由近及远)排列
函数原型:
get_orders_intraday(exchange)
参数:
参数名
类型
是否必须
说明
exchange
str
否
指定委托所在的交易所代码,默认是全部交易所
返回值:
类型
说明
list[Order]
Order委托对象列表
示例:
获取24h内的本策略所有交易所的所有委托订单, 按时间倒叙(由近及远)排列
get_orders_intraday()
注意:
1. 只返回当前策略下单的历史数据,不返回其他渠道下单(包括其他策略)下单的历史数据
3.6.6 get_execution_reports_intraday - 查询当前策略24h内的执行回报
获取当前策略的全部订单在24h内的执行回报,最多返回500条, 按时间倒叙(由近及远)排列
函数原型:
get_execution_reports_intraday(exchange)
参数:
参数名
类型
是否必须
说明
exchange
str
否
指定委托所在的交易所代码,默认是全部交易所
返回值:
类型
说明
list[ExecRpt]
ExecRpt回报对象列表
示例:
获取当前策略在24h内在huobi站的成交回报, 按时间倒叙(由近及远)排列
get_execution_reports_intraday('huobi')
注意:
1. 只返回当前策略下单执行回报的历史数据,不返回其他渠道下单(包括其他策略)下单的历史数据
3.6.7 get_positions - 查询当前策略绑定的交易所账户的持仓
获取当前策略绑定指定交易所、指定币种的持仓
对于现货币币交易,通常可在下单前使用,用于检查是否有足够货币完成交易
函数原型:
get_positions(exchange=None,currency=None)
参数:
是
参数名
类
否
型
必
说明
须
exchange
str
否
指定委托所在的交易所代码, 默认是全部交易所
查看指定币种的持仓
currency
str
否
现货使用币种名称;
期货合约交需要传入合约symbol,以get_symbol_for_future()获取
返回值:
类型
说明
list[Position]
Position持仓对象列表, 参见持仓对象
示例1:
现货 : 获取当前策略在okex交易所的btc持仓
get_positions('okex','btc')
示例2:
合约:获取bitmex合约账户的btc永续合约持仓
get_positions('bitmex',get_symbol_for_future('bitmex','btc','usd','p'))
3.6.8 get_exchange_rate - 查询币种的公允usd法币汇率
获取指定币种的法币公允汇率, 目前支持usd
函数原型:
get_exchange_rate(currencies,from_currency)
参数:
是
参数名
类型
否
必
说明
须
currencies
str/list[str]
否
from_currency
str
否
需要查询的币种列表,支持传入str或多个币种的str列表 ,币
种大小写均可
指定的公允汇率法币种类,目前仅支持usd(计划支持
CNY/JPY/KRW/EUR/GBP/AUD),默认usd,大小写均可
返回值:
类型
说明
list[ExchangeRate]
返回每个币种的ExchangeRate公允汇率对象列表
示例:
获取btc、eth的美元公允汇率
get_exchange_rate(['btc','eth'],'usd')
返回一个有2个ExchangeRate对象的列表
3.6.9 get_margin_assets - 查询账户保证金资产和权益(仅合约)
查询指定合约账户的保证金资产和权益
函数原型:
get_margin_assets(exchange,currency)
参数:
参数名
类型
是否必须
说明
exchange
str
是
交易所代码
currency
str
否
查看指定结算币种的保证金资产,默认全部
返回值:
类型
说明
list[Asset]
Asset对象列表,每一种结算货币1个资产项目,bimex只有1中结算货币btc,因此bitmex交
易所返回的列表只有一个Asset对象
示例:
获取用户在bitmex合约账户的保证金资产
get_margin_assets('bitmex')
3.7 交易事件
3.7.1 on_execution_report - 委托执行回报事件
委托执行事件, 委托的各种状态变更(新建/执行/撤销等) , 系统都会立即自动触发该函数,可以在该函数中处理一
些重要的业务逻辑,或处理回报异常;
通过获取其传入的execrpt的cl_ord_id获取对应的订单ID,exec_type字段判断订单执行状态,根据执行状态来处
理业务逻辑
函数原型:
on_execution_report(execrpt)
参数:
参数名
类型
是否必须
说明
execrpt
ExecRpt对象
是
回报对象
示例1: 打印执行回报
def on_execution_report(execrpt):
print(execrpt)
输出:
打印触发本事件的回报对象
示例2: 通过execrpt对象,如果委托成交或部分成交,打印出委托的累计成交额和平均成交价格
def on_execution_report(execrpt):
if execrpt['exec_type'] == 3 or execrpt['exec_type'] == 5:
print("成交额:",execrpt['volume'])
print("平均成交价格:",execrpt['price'])
输出:
打印当前委托单的累计成交额和平均成交价格
示例3: 通过execrpt对象的cl_ord_id字段,获取对应的订单信息
def on_execution_report(execrpt):
ol=[]
ol.append(execrpt['cl_ord_id'])
print("订单数据:",get_orders(cl_ord_ids=ol)[0])
输出:
打印当前委托单的累计成交额和平均成交价格
3.8 指标函数
NFT使用talib库完成指标函数,如何安装talib请查看如何安装talib
文档末尾包含talib函数库,更多talib内容请访问ta-lib.org 使用talib绘制指标函数,经常需要引入num.py和
pandas.py,这两者同样已经包含在NFT的SDK中;下面示例介绍如何使用talib绘制常用指标函数
3.8.1 MACD - 指数平滑异同平均线
TA.MACD(收盘价序列, 快周期, 慢周期, 信号周期)
from __future__ import print_function, absolute_import
from nf.api import *
import pandas
import numpy as np
import talib as ta
import datetime
def init():
#macd数据计算量较大,订阅至少200根1min的bar,count=200
subscribe(get_symbol('okex','eth','usdt'), frequency='60s', count=200,
wait_group=False, wait_group_timeout='10s', unsubscribe_previous=False)
#基分钟线,计算macd
def on_bar(bars):
#每次接收到bar后通过context.data获取OKEX_eth.usdt的1min数据,计算macd数据量较大,要获取最近
200个1m的收盘价
data = context.data(symbol=get_symbol('okex','eth','usdt'), frequency='60s', count=200)
#MACD函数返回三数组,dif为12分钟EMA-26分钟EMA, dea为9分钟dif均线, hist为dif-dea,
context.data数据输出为dataframe,macd需要转为array,macd返回为3个list
dif, dea, hist = ta.MACD(np.array(data['close'].values.tolist()), 12, 26, 9)
#最后一个值为当前的最新的dif/dea/hist数据,每次on_bar时间后都会产生新的macd数据
print(dif[-1],dea[-1],hist[-1])
3.8.2 RSI - 强弱指标
talib.RSI(收盘价序列, 周期)
from __future__ import print_function, absolute_import
from nf.api import *
import pandas
import numpy as np
import talib as ta
import datetime
def init():
#订阅连续30根1min的bar,count=30
subscribe(get_symbol('okex','eth','usdt'), frequency='60s', count=30, wait_group=False,
wait_group_timeout='10s', unsubscribe_previous=False)
#基于分钟线,计算rsi
def on_bar(bars):
#每次接收到bar后通过context.data获取OKEX_eth.usdt的 1min数据,至少14个bar计算rsi,这里取30
data = context.data(symbol=get_symbol('okex','eth','usdt'), frequency='60s', count=30)
#rsi函数返回rsi数组
rsi = ta.RSI(data['close'], 14)
#最后一个值为当前的最新的rsi数据,每次接受bar后进行更新
print(rsi.iloc[-1])
3.8.3 ATR - 平均真实波幅
talib.ATR(数据, 周期)
from __future__ import print_function, absolute_import
from nf.api import *
import pandas
import numpy as np
import talib as ta
import datetime
def init():
#订阅连续30根1min的bar,count=30
subscribe(get_symbol('okex','eth','usdt'), frequency='60s', count=30, wait_group=False,
wait_group_timeout='10s', unsubscribe_previous=False)
#基于分钟线,计算atr
def on_bar(bars):
#每次接收到bar后通过context.data获取OKEX_eth.usdt的 1min数据,至少14个bar计算atr,这里取30
data = context.data(symbol=get_symbol('okex','eth','usdt'), frequency='60s', count=30)
#atr函数返回atr数组
atr = ta.ATR(data['high'],data['low'],data['close'], 14)
#最后一个值为当前的最新的atr数据,每次接受bar后进行更新
print(atr.iloc[-1])
3.8.4 MA - 移动平均线
talib.MA(数据, 周期) 默认参数为(Array(close),9),Array(close)为收盘价数组 返回一个float一维数组
from __future__ import print_function, absolute_import
from nf.api import *
import pandas
import numpy as np
import talib as ta
import datetime
def init():
#订阅连续9根1min的bar,count=9
subscribe(get_symbol('okex','eth','usdt'), frequency='60s', count=9, wait_group=False,
wait_group_timeout='10s', unsubscribe_previous=False)
#基于分钟线,计算9 K线移动平均MA
def on_bar(bars):
#通过context.data获取OKEX_eth.usdt的 1min数据,1次9个bar计算移动平均值,取最近9个1m收盘价
data = context.data(symbol=get_symbol('okex','eth','usdt'), frequency='60s', count=9)
#atr函数通过1min数据的收盘价返回ma数组
ma = ta.MA(data['close'], 9)
#最后一个值为当前的最新的ma_9数据,每次接受bar后进行更新
print(ma.iloc[-1])
3.9 其他函数
3.9.1 log - 日志函数
打印log用于策略调试 函数原型:
log(level, msg, source)
参数:
参数名
类型
是否必须
说明
level
str
是
日志级别 debug , info , warning , error
msg
str
是
信息
source
str
是
来源,自定义的名称
返回值:
None
示例:
log(level='info', msg='okex账户余额不足', source='strategy')
注意:
1. log函数仅支持实时模式,输出到实盘交易->运行日志。
2. level输入无效参数不会报错,终端日志无显示。
3. 参数类型报NameError错误, 缺少参数报TypeError错误。
3.9.2 get_version - 查询api版本
获取当前API的版本号 函数原型:
get_version()
返回值:
str字符串 当前API版本号
示例:
version = get_version()
3.9.3 now() - 查询当前时间
获取当前时间 函数原型:
now()
返回值:
str字符串("yyyy-mm-dd hh:mm:ss"格式)
示例:
dt=now()
3.10 错误处理等其他事件
3.10.1 on_backtest_finished - 回测结束事件
在回测模式下,策略运行完毕后会触发此事件,可以在方法中针对回测indicator做处理
函数原型:
on_backtest_finished(indicator)
参数:
参数名
类型
是否必须
说明
indicator
Indicator
是
绩效指标
示例:
def on_backtest_finished(indicator):
print(indicator)
返回:
打印出indicator指标对象
3.10.2 on_error - 错误处理事件
用户自定义的错误处理函数,当发生系统可识别的错误信息时触发,可在函数提供告警并处理异常情况
函数原型:
on_error(code, info)
参数:
参数名
类型
是否必须
说明
code
int
是
错误码
info
str
是
错误信息
示例:
import ctypes
def on_error(code, info):
#通过电脑扬声器进行告警
player = ctypes.windll.kernel32
player.Beep(50,100)
player.Beep(50,100)
player.Beep(50,100)
#然后打印错误,并终止策略运行
print(code,info)
stop()
3.10.3 on_market_data_connected - 实时行情网络连接成功事件
实时行情网络连接成功时触发 函数原型:
on_market_data_connected()
示例:
def on_market_data_connected():
print ('链接成功')
3.10.4 on_market_data_disconnected - 实时行情网络连接断开事件
实时行情断开时触发 函数原型:
on_market_data_disconnected()
示例:
打印链接失败
def on_market_data_disconnected():
print ('链接失败')
4. 错误码
错误码在策略本地运行以及订阅行情时会返回,0代表操作成功无需处理,其他错误会触发on_error(code,info),
可在on_error事件函数中做相应的处理
错误码
code
info
0
成功
1000
错误或无效的token
1001
无法连接到终端服务
1002
无法连接到历史行情服务
1010
无法获取服务器地址列表
1011
消息包解析错误
1012
网络消息包解析错误
1013
交易服务调用错误
1014
历史行情服务调用错误
1015
策略服务调用错误
1016
动态参数调用错误
1017
基本面数据服务调用错误
1018
回测服务调用错误
1019
交易网关服务调用错误
1020
无效的ACCOUNT_ID
1021
非法日期格式
1100
交易消息服务连接失败
1101
交易消息服务断开
1200
实时行情服务连接失败
1201
实时行情服务连接断开
1300
初始化回测失败,可能是终端未启动或无法连接到终端
1301
回测时间区间错误
1302
回测读取缓存数据错误
1303
回测写入缓存数据错误
5. API封禁规则
API封禁规则包括各交易所既有的调用频率限制规则;
针对交易所其他特殊规则,也会有相应的限时封禁策略,目前限时封禁策略只针对bitmex交易所有效
交易所特殊规则
对应ord_rej_reason_detail (Order和
封禁时
目标交
Execrpt对象参数)
长
易所
未开始交易
Market is not open
未支持该base币
Underlying leg market is not open
获取mark_price错误:该交易对
Underlying leg instrument has no mark
象没有mark_price
price
价格不合法
1min(封
1分钟)
BitMEX
1min
BitMEX
1min
BitMEX
Invalid price
1min
BitMEX
价格精度不合法(精度过高)
Invalid price tickSize
1min
BitMEX
限价价格超过限价单上
Price greater than limitUpPrice
1min
BitMEX
限价价格低于限价单下限
Price less than limitDownPrice
1min
BitMEX
买卖方向不合法
Invalid side
1min
BitMEX
止损止盈价格不合法
Invalid stopPx for ordType
1min
BitMEX
止损止盈价格精度不合法
Invalid stopPx tickSize
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
1min
BitMEX
账户内保证金资产不足
Account has insufficient Available Balance,
[xxx XBt] required
下单价值超过账户的风险上限(上
Value of positions and orders exceeds
限交易所指定)
account Risk Limit
持有仓位超过账户的风险上限(上
Value of position and orders exceeds
限交易所指定)
position Risk Limit
持仓正在被清算
Position is in liquidation
限价价格低于当前多头仓位的强
Order price is below the liquidation price
平价
of current long position
限价价格高于当前空头仓位的强
Order price is above the liquidation price
平价
of current short position
执行本订单会导致当前仓位强平
Executing at order price would lead to
发生
immediate liquidation
执行本订单会导致账户被进一步
Executing at order price would push
追加保证金
account deeper into margin call
账户需要追加保证金
Account is in margin call
执行本订单会导致账户被追加保
Executing at order price would put
证金
account into margin call
交易所特殊规则
对应ord_rej_reason_detail (Order和
封禁时
目标交
Execrpt对象参数)
长
易所
1min
BitMEX
平仓或减仓指令的买卖方向和持
Order had execInst of [Close|ReduceOnly]
仓方向不符合,比如持有多仓却要
and side of [Buy|Sell] but current position
求买入平空
is [xxx]
6. talib 库指标函数
各种指标计算使用三方ta-lib.py库计算,NFT的sdk中暂时不包含ta-lib库,如何安装和下载ta-lib请查看如何安装
talib;
talib库输入参数都包括一个Array,Array一般是收盘价/最高价/最低价的数组,通过订阅函数history_n() 获取行
情数据,通过num.py的np.asarray(List)方法将行情数据转化为收盘价/最高价/最低价数组
talib库支持:
Math Transform 数学变换
Math Operators 数学运算符
Volume Indicators 量指标
Volatility Indicators 波动性指标
Overlap Studies 重叠指标
Momentum Indicators 动量指标
Price Transform 价格指标
Cycle Indicators 循环指标
Statistic Functions 统计功能
Pattern Recognition 模式识别
以下函数按照格式函数("输入参数")="输出结果" 呈现;输入参数中Array(close),代表收盘价组成的数组序
列;输出参数Array(float)代表float类型的数组序列
Math Transform 数学变换
指标
描述
函数(输入参数)=输出结果
ACOS
Vector Trigonometric ACos (反余弦函数)
ACOS(Array(close)) = Array(float)
ASIN
Vector Trigonometric ASin (反正弦函数)
ASIN(Array(close)) = Array(float)
ATAN
Vector Trigonometric ATan (反正切函数)
ATAN(Array(close)) = Array(float)
CEIL
Vector Ceil (取整函数)
CEIL(Array(close)) = Array(float)
COS
Vector Trigonometric Cos (余弦函数)
COS(Array(close)) = Array(float)
COSH
Vector Trigonometric Cosh (双曲余弦值)
COSH(Array(close)) = Array(float)
EXP
Vector Arithmetic Exp (指数函数)
EXP(Array(close)) = Array(float)
FLOOR
Vector Floor (向下取整)
FLOOR(Array(close)) = Array(float)
LN
Vector Log Natural (自然对数)
LN(Array(close)) = Array(float)
LOG10
Vector Log10 (对数函数)
LOG10(Array(close)) = Array(float)
SIN
Vector Trigonometric Sin (正弦值)
SIN(Array(close)) = Array(float)
SINH
Vector Trigonometric Sinh (双曲正弦函数)
SINH(Array(close)) = Array(float)
SQRT
Vector Square Root (平方根)
SQRT(Array(close)) = Array(float)
TAN
Vector Trigonometric Tan (正切)
TAN(Array(close)) = Array(float)
TANH
Vector Trigonometric Tanh (双曲正切函数)
TANH(Array(close)) = Array(float)
Math Operators 数学运算符
指标
描述
函数(输入参数)=输出结果
Highest value over a
MAX
specified period (最大
MAX(Array(close),TimePeriod = 30) = Array(float)
值)
Index of highest value
MAXINDEX
over a specified
period (最大值索引)
MAXINDEX(Array(close),TimePeriod = 30) =
Array(Integer)
Lowest value over a
MIN
specified period (最小
MIN(Array(close),TimePeriod = 30) = Array(float)
值)
Index of lowest value
MININDEX
over a specified
period (最小值索引)
MINMAX
MINMAXINDEX
SUM
MININDEX(Array(close),TimePeriod = 30) =
Array(Integer)
Lowest and highest
MINMAX(Array(close),TimePeriod = 30) =
values over a specified
[Array(Min),Array(Max)];
period (最小最大值)
Min为float型的最小值,Max为最大值
Indexes of lowest and
MINMAXINDEX(Array(close),TimePeriod = 30) =
highest values over a
[Array(MinIdx),Array(MaxIdx)];
specified period (最小
MinIdx为int型的最小值索引,MaxIdx为int型最大值索
最大值索引)
引
Summation (求和)
SUM(Array(close),TimePeriod = 30) = Array(float)
Volume Indicators 量指标
指标
描述描述
函数(输入参数)=输出结果
Chaikin A/D
AD
Line (线随机
AD(Array[High,Low,Close,Volume]) = Array(float)
指标)
ADOSC
Chaikin A/D
ADOSC(Array[High,Low,Close,Volume],FastPeriod = 3,SlowPeriod =
Oscillator
10) = Array(float) ,Array[High,Low,Close,Volume]为最高价/最低价/收
(佳庆指标)
盘价/成交量的二维数组
On Balance
OBV
Volume (能
OBV(Array(close),Array[Volume]) = Array(float)
量潮)
Volatility Indicators 波动性指标
指标
描述
ATR
Average True Range (平均真实波幅)
NATR
TRANGE
函数(输入参数)=输出结果
ATR(Array[High,Low,Close],TimePeriod =
14) = Array(float)
Normalized Average True Range (归
NATR(Array[High,Low,Close],TimePeriod =
一化平均值范围)
14) = Array(float)
True Range (真实范围)
Overlap Studies 重叠指标
TRANGE(Array[High,Low,Close]) =
Array(float)
指标
描述
函数(输入参数)=输出结果
BBANDS(Array(close),TimePeriod = 5,DeviationsUp =
BBANDS
Bollinger Bands (布林带)
2,DeviationsDown = 2,MAType = 0) =
[Array(UpperBand),Array(MiddleBand),Array(LowerBand)]
Double Exponential
DEMA
Moving Average (双指数
DEMA(Array(close),TimePeriod = 30) = Array(float)
移动平均线)
Exponential Moving
EMA
Average (指数移动平均
EMA(Array(close),TimePeriod = 30) = Array(float)
线)
Hilbert Transform HT_TRENDLINE
Instantaneous
Trendline (希尔伯特变换,
HT_TRENDLINE(Array(close)) = Array(float)
瞬时趋势)
Kaufman Adaptive
KAMA
Moving Average (适应性
KAMA(Array(close),TimePeriod = 30) = Array(float)
移动平均线)
MA
Moving average (移动平
均线)
MESA Adaptive Moving
MAMA
Average (MESA 移动平
均线)
MIDPOINT
MIDPRICE
SAR
SAREXT
SMA
MidPoint over period
(中点)
Midpoint Price over
period (中点价格)
MA(Array(close),TimePeriod = 30,MAType = 0) = Array(float)
MAMA(Array(close),FastLimit = 0.5,SlowLimit = 0.05) =
[Array(outMAMA),Array(outFAMA)]
MIDPOINT(Array(close),TimePeriod = 14) = Array(float)
MIDPRICE(Array[High,Low],TimePeriod = 14) = Array(float)
Parabolic SAR (抛物线转
SAR(Array[High,Low],AccelerationFactor = 0.02,AFMaximum = 0.2)
向)
= Array(float)
Parabolic SAR -
SAREXT(Array[High,Low],StartValue = 0,OffsetonReverse =
Extended (增强型抛物线
0,AFInitLong = 0.02,A Long = 0.02,AFMaxLong = 0.2,AF InitShort =
转向)
0.02,AFShort = 0.02,AFMaxShort = 0.2) = Array(float)
Simple Moving Average
(简单移动平均)
SMA(Array(close),TimePeriod = 30) = Array(float)
Triple Exponential
T3
Moving Average (T3) (三
T3(Array(close),TimePeriod = 5,VolumeFactor = 0.7) = Array(float)
指数移动平均)
Triple Exponential
TEMA
Moving Average (三指数
TEMA(Array(close),TimePeriod = 30) = Array(float)
移动平均)
Triangular Moving
TRIMA
Average (三指数移动平
TRIMA(Array(close),TimePeriod = 30) = Array(float)
均)
WMA
Weighted Moving
Average (加权移动平均)
WMA(Array(close),TimePeriod = 30) = Array(float)
Momentum Indicators 动量指标
指标
ADX
ADXR
APO
描述
Average Directional Movement
Index (平均趋向指数)
Average Directional Movement
Index Rating (评估指数)
函数(输入参数)=输出结果
ADX(Array[High,Low,Close],TimePeriod = 14) = Array(float)
ADXR(Array[High,Low,Close],TimePeriod = 14) = Array(float)
Absolute Price Oscillator (绝对价
APO(Array(close),FastPeriod = 12,SlowPeriod = 26,MA Type = 0) =
格振荡指数)
Array(float)
AROON(Array[High,Low],TimePeriod = 14) =
AROON
Aroon (阿隆指标)
AROONOSC
Aroon Oscillator (阿隆震荡线)
AROONOSC(Array[High,Low],TimePeriod = 14) = Array(float)
BOP
Balance Of Power (均势指标)
BOP(Array[Open,High,Low,Close]) = Array(float)
CCI
CMO
DX
Commodity Channel Index (顺势
指标)
Chande Momentum Oscillator (钱
德动量摆动指标)
Directional Movement Index (动
向指数)
Moving Average
MACD
Convergence/Divergence (指数平
滑移动平均线)
MACDEXT
MACD with controllable MA type
(MA型可控 MACD)
[Array(outAroonDown),Array(outAroonUp)]
CCI(Array[High,Low,Close],TimePeriod = 14) = Array(float)
CMO(Array(close),TimePeriod = 14) = Array(float)
DX(Array[High,Low,Close],TimePeriod = 14) = Array(float)
MACD(Array(close),FastPeriod = 12,SlowPeriod = 26,SignalPeriod = 9) =
[Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
MACDEXT(Array(close),FastPeriod = 12,FastMA = 0,SlowPeriod = 26,Slow
MA = 0,SignalPeriod = 9,SignalMA = 0) =
[Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
Moving Average
MACDFIX
Convergence/Divergence Fix
MACDFIX(Array(close),SignalPeriod = 9) =
12/26 (移动平均收敛/发散修复
[Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
12/26)
MFI
MINUS_DI
MINUS_DM
MOM
PLUS_DI
PLUS_DM
PPO
Money Flow Index (货币流量指数)
Minus Directional Indicator (负向
指标)
Minus Directional Movement (负
向运动)
Momentum (动量)
Plus Directional Indicator (更向指
示器)
Plus Directional Movement (定向
运动)
MFI(Array[High,Low,Close,Volume],TimePeriod = 14) = Array(float)
MINUS_DI(Array[High,Low,Close],TimePeriod = 14) = Array(float)
MINUS_DM(Array[High,Low],TimePeriod = 14) = Array(float)
MOM(Array(close),TimePeriod = 10) = Array(float)
PLUS_DI(Array[High,Low,Close],TimePeriod = 14) = Array(float)
PLUS_DM(Array[High,Low],TimePeriod = 14) = Array(float)
Percentage Price Oscillator (价格
PPO(Array(close),FastPeriod = 12,SlowPeriod = 26,MAType = 0) =
振荡百分比)
Array(float)
Rate of change :
ROC
((price/prevPrice)-1)*100 (变动率
ROC(Array(close),TimePeriod = 10) = Array(float)
指标)
Rate of change Percentage:
ROCP
(price-prevPrice)/prevPrice (价格
ROCP(Array(close),TimePeriod = 10) = Array(float)
变化率)
ROCR
Rate of change ratio:
(price/prevPrice) (价格变化率)
ROCR(Array(close),TimePeriod = 10) = Array(float)
指标
描述
函数(输入参数)=输出结果
Rate of change ratio 100 scale:
ROCR100
(price/prevPrice)*100 (价格变化
ROCR100(Array(close),TimePeriod = 10) = Array(float)
率)
RSI
Relative Strength Index (相对强弱
指标)
STOCH
Stochastic (STOCH指标)
STOCHF
Stochastic Fast (快速STOCH指标)
STOCHRSI
RSI(Array(close),TimePeriod = 14) = Array(float)
STOCH(Array[High,Low,Close],Fast-kPeriod = 5,Slow-KPeriod = 3,Slow-KMA
= 0,Slow-DPeriod = 3,Slow-DMA = 0) = [Array(outSlowK),Array(outSlowD)]
STOCHF(Array[High,Low,Close],Fast-kPeriod = 5,Fast-DPeriod = 3,Fast-DMA
= 0) = [Array(outFastK),Array(outFastD)]
Stochastic Relative Strength
STOCHRSI(Array(close),TimePeriod = 14,Fast-kPeriod = 5,Fast-DPeriod =
Index (随机强弱指数)
3,Fast-DMA = 0) = [Array(outFastK),Array(outFastD)]
1-day Rate-Of-Change (ROC) of a
TRIX
Triple Smooth EMA (三重指数平滑
TRIX(Array(close),TimePeriod = 30) = Array(float)
平均线)
ULTOSC
Ultimate Oscillator (极限振子)
WILLR
Williams' %R (威廉指标)
ULTOSC(Array[High,Low,Close],FirstPeriod = 7,SecondPeriod =
14,ThirdPeriod = 28) = Array(float)
WILLR(Array[High,Low,Close],TimePeriod = 14) = Array(float)
Price Transform 价格指标
指标
描述
AVGPRICE
Average Price (平均价格)
MEDPRICE
Median Price (中位数价格)
MEDPRICE(Array[High,Low]) = Array(float)
TYPPRICE
Typical Price (典型价格)
TYPPRICE(Array[High,Low,Close]) = Array(float)
WCLPRICE
Weighted Close Price (加权收
盘价)
Cycle Indicators 循环指标
函数(输入参数)=输出结果
AVGPRICE(Array[Open,High,Low,Close]) =
Array(float)
WCLPRICE(Array[High,Low,Close]) = Array(float)
指标
描述
函数(输入参数)=输出结果
Hilbert Transform HT_DCPERIOD
Dominant Cycle Period (希尔
HT_DCPERIOD(Array(close)) = Array(float)
伯特变换, 主周期)
Hilbert Transform HT_DCPHASE
Dominant Cycle Phase (希尔
HT_DCPHASE(Array(close)) = Array(float)
伯特变换,主阶段)
Hilbert Transform - Phasor
HT_PHASOR
Components (希尔伯特变换,
相成分)
HT_SINE
[Array(outInPhase),Array(outQuadrature)]
Hilbert Transform - SineWave
HT_SINE(Array(close)) =
(希尔伯特变换,正弦波)
[Array(outSine),Array(outLeadSine)]
Hilbert Transform - Trend vs
HT_TRENDMODE
HT_PHASOR(Array(close)) =
Cycle Mode (希尔伯特变换-趋
势与周期模式)
HT_TRENDMODE(Array(close)) =
Array(Integer)
Statistic Functions 统计功能
指标
描述
LINEARREG
Linear Regression (线性回归)
LINEARREG_ANGLE
LINEARREG_INTERCEPT
LINEARREG_SLOPE
STDDEV
TSF
VAR
函数(输入参数)=输出结果
LINEARREG(Array(close),TimePeriod = 14) =
Array(float)
Linear Regression Angle (线
LINEARREG_ANGLE(Array(close),TimePeriod =
性回归的角度)
14) = Array(float)
Linear Regression Intercept
LINEARREG_INTERCEPT(Array(close),TimePeriod
(线性回归截距)
= 14) = Array(float)
Linear Regression Slope (线
LINEARREG_SLOPE(Array(close),TimePeriod =
性回归斜率)
14) = Array(float)
Standard Deviation (标准偏
STDDEV(Array(close),TimePeriod = 5,Deviations
差)
= 1) = Array(float)
Time Series Forecast (时间序
列预测)
Variance (变量定义)
Pattern Recognition 模式识别
TSF(Array(close),TimePeriod = 14) = Array(float)
VAR(Array(close),TimePeriod = 5,Deviations = 1)
= Array(float)
指标
描述
函数(输入参数)=输出结果
CDL2CROWS
Two Crows (K线图--两只乌鸦)
CDL2CROWS(Array[Open,High,Low,Close]) = Array(Integer)
CDL3BLACKCROWS
Three Black Crows (K线图--3只黑乌鸦)
CDL3BLACKCROWS(Array[Open,High,Low,Close]) = Array(Integer)
CDL3INSIDE
CDL3LINESTRIKE
CDL3OUTSIDE
CDL3STARSINSOUTH
CDL3WHITESOLDIERS
Three Inside Up/Down (K线图:3内上下震
荡)
Three-Line Strike (K线图:3线震荡)
Three Outside Up/Down (K线图:3外下震
荡)
CDL3INSIDE(Array[Open,High,Low,Close]) = Array(Integer)
CDL3LINESTRIKE(Array[Open,High,Low,Close]) = Array(Integer)
CDL3OUTSIDE(Array[Open,High,Low,Close]) = Array(Integer)
Three Stars In The South (K线图:南方三
CDL3STARSINSOUTH(Array[Open,High,Low,Close]) =
星)
Array(Integer)
Three Advancing White Soldiers (K线图:
CDL3WHITESOLDIERS(Array[Open,High,Low,Close]) =
三白兵)
Array(Integer)
CDLABANDONEDBABY(Array[Open,High,Low,Close],Penetration
CDLABANDONEDBABY
Abandoned Baby (K线图:弃婴)
CDLADVANCEBLOCK
Advance Block (K线图:推进)
CDLBELTHOLD
Belt-hold (K线图:带住)
CDLBELTHOLD(Array[Open,High,Low,Close]) = Array(Integer)
CDLBREAKAWAY
Breakaway (K线图:分离)
CDLBREAKAWAY(Array[Open,High,Low,Close]) = Array(Integer)
CDLCLOSINGMARUBOZU
Closing Marubozu (K线图:收盘光头光脚)
CDLCONCEALBABYSWALL
= 0.3) = Array(Integer)
CDLADVANCEBLOCK(Array[Open,High,Low,Close]) =
Array(Integer)
CDLCLOSINGMARUBOZU(Array[Open,High,Low,Close]) =
Array(Integer)
Concealing Baby Swallow (K线图:藏婴吞
CDLCONCEALBABYSWALL(Array[Open,High,Low,Close]) =
没形态)
Array(Integer)
CDLCOUNTERATTACK(Array[Open,High,Low,Close]) =
CDLCOUNTERATTACK
Counterattack (K线图:反击)
CDLDARKCLOUDCOVER
Dark Cloud Cover (K线图:乌云盖)
CDLDOJI
Doji (K线图:十字星 )
CDLDOJI(Array[Open,High,Low,Close]) = Array(Integer)
CDLDOJISTAR
Doji Star (K线图:十字星)
CDLDOJISTAR(Array[Open,High,Low,Close]) = Array(Integer)
CDLDRAGONFLYDOJI
Dragonfly Doji (K线图:蜻蜓十字星)
CDLENGULFING
Engulfing Pattern (K线图:吞没)
CDLEVENINGDOJISTAR
Evening Doji Star (K线图:黄昏十字星)
CDLEVENINGSTAR
Evening Star (K线图:黄昏之星)
CDLGAPSIDESIDEWHITE
Array(Integer)
CDLDARKCLOUDCOVER(Array[Open,High,Low,Close],Penetration
= 0.5) = Array(Integer)
CDLDRAGONFLYDOJI(Array[Open,High,Low,Close]) =
Array(Integer)
CDLENGULFING(Array[Open,High,Low,Close]) = Array(Integer)
CDLEVENINGDOJISTAR(Array[Open,High,Low,Close],Penetration
= 0.3) = Array(Integer)
CDLEVENINGSTAR(Array[Open,High,Low,Close],Penetration =
0.3) = Array(Integer)
Up/Down-gap side-by-side white lines (K
CDLGAPSIDESIDEWHITE(Array[Open,High,Low,Close]) =
线图:上/下间隙并排的白色线条)
Array(Integer)
CDLGRAVESTONEDOJI(Array[Open,High,Low,Close]) =
CDLGRAVESTONEDOJI
Gravestone Doji (K线图:墓碑十字线)
CDLHAMMER
Hammer (K线图:锤)
CDLHAMMER(Array[Open,High,Low,Close]) = Array(Integer)
CDLHANGINGMAN
Hanging Man (K线图:吊人)
CDLHANGINGMAN(Array[Open,High,Low,Close]) = Array(Integer)
CDLHARAMI
Harami Pattern (K线图:阴阳线)
CDLHARAMI(Array[Open,High,Low,Close]) = Array(Integer)
CDLHARAMICROSS
Harami Cross Pattern (K线图:交叉阴阳线)
CDLHARAMICROSS(Array[Open,High,Low,Close]) = Array(Integer)
CDLHIGHWAVE
High-Wave Candle (K线图:长脚十字线 )
CDLHIGHWAVE(Array[Open,High,Low,Close]) = Array(Integer)
CDLHIKKAKE
Hikkake Pattern (K线图:陷阱)
CDLHIKKAKE(Array[Open,High,Low,Close]) = Array(Integer)
CDLHIKKAKEMOD
Modified Hikkake Pattern (K线图:改良的
陷阱)
Array(Integer)
CDLHIKKAKEMOD(Array[Open,High,Low,Close]) = Array(Integer)
指标
描述
CDLHOMINGPIGEON
Homing Pigeon (K线图:信鸽)
函数(输入参数)=输出结果
CDLHOMINGPIGEON(Array[Open,High,Low,Close]) =
Array(Integer)
Identical Three Crows (K线图:相同的三只
CDLIDENTICAL3CROWS(Array[Open,High,Low,Close]) =
乌鸦)
Array(Integer)
CDLINNECK
In-Neck Pattern (K线图:颈纹)
CDLINNECK(Array[Open,High,Low,Close]) = Array(Integer)
CDLINVERTEDHAMMER
Inverted Hammer (K线图:倒锤)
CDLKICKING
Kicking (K线图:踢)
CDLKICKING(Array[Open,High,Low,Close]) = Array(Integer)
Kicking - bull/bear determined by the
CDLKICKINGBYLENGTH(Array[Open,High,Low,Close]) =
longer marubozu (K线图:踢牛/踢熊)
Array(Integer)
CDLIDENTICAL3CROWS
CDLKICKINGBYLENGTH
CDLINVERTEDHAMMER(Array[Open,High,Low,Close]) =
Array(Integer)
CDLLADDERBOTTOM(Array[Open,High,Low,Close]) =
CDLLADDERBOTTOM
Ladder Bottom (K线图:梯底)
CDLLONGLEGGEDDOJI
Long Legged Doji (K线图:长腿十字线)
CDLLONGLINE
Long Line Candle (K线图:长线)
CDLLONGLINE(Array[Open,High,Low,Close]) = Array(Integer)
CDLMARUBOZU
Marubozu (K线图:光头光脚 )
CDLMARUBOZU(Array[Open,High,Low,Close]) = Array(Integer)
CDLMATCHINGLOW
Matching Low (K线图:匹配低)
CDLMATHOLD
Mat Hold (K线图:垫住)
CDLMORNINGDOJISTAR
Morning Doji Star (K线图:早晨十字星)
CDLMORNINGSTAR
Morning Star (K线图:晨星)
CDLONNECK
On-Neck Pattern (K线图:颈型)
CDLONNECK(Array[Open,High,Low,Close]) = Array(Integer)
CDLPIERCING
Piercing Pattern (K线图:穿孔模式)
CDLPIERCING(Array[Open,High,Low,Close]) = Array(Integer)
CDLRICKSHAWMAN
Rickshaw Man (K线图:车夫)
CDLRISEFALL3METHODS
Array(Integer)
CDLLONGLEGGEDDOJI(Array[Open,High,Low,Close]) =
Array(Integer)
CDLMATCHINGLOW(Array[Open,High,Low,Close]) =
Array(Integer)
CDLMATHOLD(Array[Open,High,Low,Close],Penetration = 0.5) =
Array(Integer)
CDLMORNINGDOJISTAR(Array[Open,High,Low,Close],Penetration
= 0.3) = Array(Integer)
CDLMORNINGSTAR(Array[Open,High,Low,Close],Penetration =
0.3) = Array(Integer)
CDLRICKSHAWMAN(Array[Open,High,Low,Close]) =
Array(Integer)
Rising/Falling Three Methods (K线图:上
CDLRISEFALL3METHODS(Array[Open,High,Low,Close]) =
升/下降三法)
Array(Integer)
CDLSEPARATINGLINES(Array[Open,High,Low,Close]) =
CDLSEPARATINGLINES
Separating Lines (K线图:分割线)
CDLSHOOTINGSTAR
Shooting Star (K线图:流星)
CDLSHORTLINE
Short Line Candle (K线图:短线)
CDLSHORTLINE(Array[Open,High,Low,Close]) = Array(Integer)
CDLSPINNINGTOP
Spinning Top (K线图:陀螺)
CDLSPINNINGTOP(Array[Open,High,Low,Close]) = Array(Integer)
CDLSTALLEDPATTERN
Stalled Pattern (K线图:停滞模式)
CDLSTICKSANDWICH
Stick Sandwich (K线图:棍子三明治)
CDLTAKURI
Takuri (Dragonfly Doji with very long
lower shadow) (K线图:托里)
Array(Integer)
CDLSHOOTINGSTAR(Array[Open,High,Low,Close]) =
Array(Integer)
CDLSTALLEDPATTERN(Array[Open,High,Low,Close]) =
Array(Integer)
CDLSTICKSANDWICH(Array[Open,High,Low,Close]) =
Array(Integer)
CDLTAKURI(Array[Open,High,Low,Close]) = Array(Integer)
CDLTASUKIGAP
Tasuki Gap (K线图:翼隙)
CDLTASUKIGAP(Array[Open,High,Low,Close]) = Array(Integer)
CDLTHRUSTING
Thrusting Pattern (K线图:推模式)
CDLTHRUSTING(Array[Open,High,Low,Close]) = Array(Integer)
CDLTRISTAR
Tristar Pattern (K线图:三星模式)
CDLTRISTAR(Array[Open,High,Low,Close]) = Array(Integer)
CDLUNIQUE3RIVER
Unique 3 River (K线图:独特的3河)
CDLUNIQUE3RIVER(Array[Open,High,Low,Close]) = Array(Integer)
CDLUPSIDEGAP2CROWS
Upside Gap Two Crows (K线图:双飞乌鸦)
CDLUPSIDEGAP2CROWS(Array[Open,High,Low,Close]) =
Array(Integer)
指标
CDLXSIDEGAP3METHODS
描述
函数(输入参数)=输出结果
Upside/Downside Gap Three Methods (K
CDLXSIDEGAP3METHODS(Array[Open,High,Low,Close]) =
线图:上行/下行缺口三方法)
Array(Integer)
Download
Study collections