FCoin API
本文介绍FCoin API
介绍
通过了解以下信息,您可以方便的使用 FCoin 提供的 API 来接入 FCoin 交易平台。
认证
执行下面的代码进行用户验证:
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
FCoin 使用 API key 和 API secret 进行验证,请访问 设置中心,并注册成为开发者,获取 API key 和 API secret。
FCoin 的 API 请求,除公开的 API 外都需要携带 API key 以及签名
访问限制
目前访问频率为每个用户 100次 / 10秒,未来会按照业务区分访问频率限制。
API 签名
签名前准备的数据如下:
HTTP_METHOD
+ HTTP_REQUEST_URI
+ TIMESTAMP
+ POST_BODY
连接完成后,进行 Base64
编码,对编码后的数据进行 HMAC-SHA1
签名,并对签名进行二次 Base64
编码,各部分解释如下:
请注意需要进行两次 `Base64` 编码!
HTTP_METHOD
GET
, POST
, DELETE
, PUT
需要大写
HTTP_REQUEST_URI
https://api.fcoin.com/v2/
为 v2 API 的请求前缀
后面再加上真正要访问的资源路径,如 orders?param1=value1
,最终即 https://api.fcoin.com/v2/orders?param1=value1
对于请求的 URI 中的参数,需要按照按照字母表排序!
即如果请求的 URI 为 https://api.fcoin.com/v2/orders?c=value1&b=value2&a=value3
,则进行签名时,应先将请求参数按照字母表排序,最终进行签名的 URI 为 https://api.fcoin.com/v2/orders?a=value3&b=value2&c=value1
, 请注意,原请求 URI 中的三个参数顺序为 c, b, a
,排序后为 a, b, c
。
TIMESTAMP
访问 API 时的 UNIX EPOCH 时间戳,需要和服务器之间的时间差少于 30 秒
POST_BODY
如果是 POST
请求,POST
请求数据也需要被签名,签名规则如下:
所有请求的 key 按照字母顺序排序,然后进行 url 参数化,并使用 &
连接。
请注意 POST_BODY 的键值需要按照字母表排序!
如果请求数据为:
{
"username": "username",
"password": "passowrd"
}
则先将 key 按照字母排序,然后进行 url 参数化,即:
password=password
username=username
因为
p
在字母表中的排序在u
之前,所以password
要放在username
之前,然后使用&
进行连接,即:
password=password&username=username
完整示例
对于如下的请求:
POST https://api.fcoin.com/v2/orders
{
"type": "limit",
"side": "buy",
"amount": "100.0",
"price": "100.0",
"symbol": "btcusdt"
}
timestamp: 1523069544359
签名前的准备数据如下:
POSThttps://api.fcoin.com/v2/orders1523069544359amount=100.0&price=100.0&side=buy&symbol=btcusdt&type=limit
进行 Base64 编码,得到:
UE9TVGh0dHBzOi8vYXBpLmZjb2luLmNvbS92Mi9vcmRlcnMxNTIzMDY5NTQ0MzU5YW1vdW50PTEwMC4wJnByaWNlPTEwMC4wJnNpZGU9YnV5JnN5bWJvbD1idGN1c2R0JnR5cGU9bGltaXQ=
拷贝在申请 API Key 时获得的秘钥(API SECRET),下面的签名结果采用
3600d0a74aa3410fb3b1996cca2419c8
作为示例,对得到的结果使用秘钥进行
HMAC-SHA1
签名,并对二进制结果进行Base64
编码,得到:
DeP6oftldIrys06uq3B7Lkh3a0U=
即生成了用于向 API 服务器进行验证的最终签名
参数名称
FC-ACCESS-KEY
FC-ACCESS-SIGNATURE
FC-ACCESS-TIMESTAMP
说明
可以使用开发者工具(暂未开放)进行在线联调测试。
公开接口
查询服务器时间
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
server_time = api.server_time()
响应结果如下:
{
"status": 0,
"data": 1523430502977
}
此 API 用于获取服务器时间。
HTTP Request
GET https://api.fcoin.com/v2/public/server-time
查询可用币种
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
currencies = api.currencies()
响应结果如下:
{
"status": 0,
"data": [
"btc",
"eth"
]
}
此 API 用于获取可用币种。
HTTP Request
GET https://api.fcoin.com/v2/public/currencies
查询可用交易对
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
symbols = api.symbols()
响应结果如下:
{
"status": 0,
"data": [
{
"name": "btcusdt",
"base_currency": "btc",
"quote_currency": "usdt",
"price_decimal": 2,
"amount_decimal": 4
},
{
"name": "ethusdt",
"base_currency": "eth",
"quote_currency": "usdt",
"price_decimal": 2,
"amount_decimal": 4
}
]
}
此 API 用于获取可用交易对。
HTTP Request
GET https://api.fcoin.com/v2/public/symbols
行情
行情概述
行情是一个全公开的 API, 当前同时提供了 HTTP 和 WebSocket 的 API. 为确保可以更及时的获得行情, 推荐使用 WebSocket 进行接入. 为尽可能行情的实时性能, 当前公开部分只能获取最近一段时间的行情, 如果有需要获取全量或者历史行情, 请咨询 support@fcoin.com
所有 HTTP 请求的 URL base 为: https://api.fcoin.com/v2/market
所有 WebSocket 请求的 URL 为: wss://api.fcoin.com/v2/ws
下文会统一术语:
topic
表示订阅的主题symbol
表示对应交易币种. 所有币种区分的 topic 都在 topic 末尾.ticker
行情 tick 信息, 包含最新成交价, 最新成交量, 买一卖一, 近 24 小时成交量.depth
表示行情深度, 买卖盘, 盘口.level
表示行情深度类型. 如L20
,L100
.trade
表示最新成交, 最新交易.candle
表示蜡烛图, 蜡烛棒, K 线.resolution
表示蜡烛图的种类. 如M1
,M15
.base volume
表示基准货币成交量, 如 btcusdt 中 btc 的量.quote volume
表示计价货币成交量, 如 btcusdt 中 usdt 的量ts
表示推送服务器的时间. 是毫秒为单位的数字型字段, unix epoch in millisecond.
WebSocket 首次建立连接
服务器会发送一个欢迎信息
服务器返回
{
"type":"hello",
"ts":1523693784042
}
ts
: 推送服务器当前的时间.
WebSocket 连接保持 - heartbeat
WebSocket 客户端和 WebSocket 服务器建立连接之后,推荐 WebSocket Client 每隔 30s(这个频率可能会变化) 向服务器发起一次 ping 请求,如果服务器长时间没有接收到客户端的 ping 请求将会主动断开连接(300s)。
WebSocket 请求
import time
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
now_ms = int(time.time())
api.market.ping(now_ms)
服务器返回
{
"type":"ping",
"ts":1523693784042,
"gap":112
}
gap
: 推送服务器处理此语句的时间和客户端传输的时间差.ts
: 推送服务器当前的时间.
获取推送服务器时间
可以通过 ping 请求时服务器返回的 ts 和 gap 值获取推送服务器时间和数据传输时间差
- gap: 推送服务器处理此语句的时间和客户端传输的时间差.
- ts: 推送服务器当前的时间.
获取 ticker 数据
为了使得 ticker 信息组足够小和快, 我们强制使用了列表格式.
ticker 列表对应字段含义说明:
[
"最新成交价",
"最近一笔成交的成交量",
"最大买一价",
"最大买一量",
"最小卖一价",
"最小卖一量",
"24小时前成交价",
"24小时内最高价",
"24小时内最低价",
"24小时内基准货币成交量, 如 btcusdt 中 btc 的量",
"24小时内计价货币成交量, 如 btcusdt 中 usdt 的量"
]
HTTP 请求
GET https://api.fcoin.com/v2/market/ticker/$symbol
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
api.market.get_ticker("ethbtc")
{
"status": 0,
"data": {
"type": "ticker.btcusdt",
"seq": 680035,
"ticker": [
7140.890000000000000000,
1.000000000000000000,
7131.330000000,
233.524600000,
7140.890000000,
225.495049866,
7140.890000000,
7140.890000000,
7140.890000000,
1.000000000,
7140.890000000000000000
]
}
}
WebSocket 订阅
topic: ticker.$symbol
import fcoin
fcoin_ws = fcoin.init_ws()
topics = ["ticker.ethbtc", "ticker.btcusdt"]
fcoin_ws.handle(print)
fcoin_ws.sub(topics)
订阅成功的响应结果如下:
{
"type": "topics",
"topics": ["ticker.ethbtc", "ticker.btcusdt"]
}
常规订阅的通知消息格式如下:
{
"type": "ticker.btcusdt",
"seq": 680035,
"ticker": [
7140.890000000000000000,
1.000000000000000000,
7131.330000000,
233.524600000,
7140.890000000,
225.495049866,
7140.890000000,
7140.890000000,
7140.890000000,
1.000000000,
7140.890000000000000000
]
}
获取最新的深度明细
HTTP Request
GET https://api.fcoin.com/v2/market/depth/$level/$symbol
$level
包含的种类:
类型 | 说明 |
---|---|
L20 |
20 档行情深度. |
L100 |
100 档行情深度. |
full |
全量的行情深度, 不做时间保证和推送保证. |
其中 L20
的推送时间会略早于 L100
, 推送频次会略多于 L100
, 看具体的压力和情况. 此处请按需使用.
WebSocket 订阅
订阅 topic: depth.$level.$symbol
import fcoin
fcoin_ws = fcoin.init_ws()
topics = ["depth.L20.ethbtc", "depth.L100.btcusdt"]
fcoin_ws.handle(print)
fcoin_ws.sub(topics)
订阅成功的响应结果如下:
{
"type": "topics",
"topics": ["depth.L20.ethbtc", "depth.L100.btcusdt"]
}
常规的推送结果
bids 和 asks 对应的数组一定是偶数条目, 买(卖)1价, 买(卖)1量, 依次往后排列.
{
"type": "depth.L20.ethbtc",
"ts": 1523619211000,
"seq": 120,
"bids": [0.000100000, 1.000000000, 0.000010000, 1.000000000],
"asks": [1.000000000, 1.000000000]
}
获取最新的成交明细
通过对比其中的成交 id 大小才能决定是否是更新的成交.{trade id} 需要注意, 常规由于 trade 到 transaction 过程的存在, 公开行情的成交 id 并不实际对应清算系统中的成交 id. 即使成交是一条记录, 也无法保证最新成交在重新获取时候 id 永远保持一致.
PS: 历史行情中, 是可以保证成交 id 保持恒定. {transaction id} 此处只作为行情更新通知, 不应依赖归档使用.
HTTP Request
GET https://api.fcoin.com/v2/market/trades/$symbol
查询参数(HTTP Query)
参数 | 默认值 | 描述 |
---|---|---|
before | 查询某个 id 之前的 Trade | |
limit | 默认为 20 条 |
WebSocket 获取最近的成交
topic: trade.$symbol
limit: 最近的成交条数 args: [topic, limit]
import fcoin
fcoin_ws = fcoin.init_ws()
topic = "trade.ethbtc"
limit = 3
args = [topic, limit]
fcoin_ws.req(args, rep_handler)
请求成功的响应结果如下:
{"id":null,
"ts":1523693400329,
"data":[
{
"amount":1.000000000,
"ts":1523419946174,
"id":76000,
"side":"sell",
"price":4.000000000
},
{
"amount":1.000000000,
"ts":1523419114272,
"id":74000,
"side":"sell",
"price":4.000000000
},
{
"amount":1.000000000,
"ts":1523415182356,
"id":71000,
"side":"sell",
"price":3.000000000
}
]
}
WebSocket 订阅
import fcoin
fcoin_ws = fcoin.init_ws()
topics = ["trade.ethbtc", "trade.btcusdt"]
fcoin_ws.handle(print)
fcoin_ws.sub(topics)
订阅成功的响应结果如下:
{
"type": "topics",
"topics": ["trade.ethbtc"]
}
常规的推送结果
{
"type":"trade.ethbtc",
"id":76000,
"amount":1.000000000,
"ts":1523419946174,
"side":"sell",
"price":4.000000000
}
获取 Candle 信息
HTTP Request
GET https://api.fcoin.com/v2/market/candles/$resolution/$symbol
查询参数(HTTP Query)
参数 | 默认值 | 描述 |
---|---|---|
before | 查询某个 id 之前的 Candle | |
limit | 默认为 20 条 |
$resolution 包含的种类
类型 | 说明 |
---|---|
M1 |
1 分钟 |
M3 |
3 分钟 |
M5 |
5 分钟 |
M15 |
15 分钟 |
M30 |
30 分钟 |
H1 |
1 小时 |
H4 |
4 小时 |
H6 |
6 小时 |
D1 |
1 日 |
W1 |
1 周 |
MN |
1 月 |
Weboskcet 订阅 Candle 数据
topic: candle.$resolution.$symbol
import fcoin
fcoin_ws = fcoin.init_ws()
topics = ["candle.M1.ethbtc", "depth.L20.ethbtc", "trade.ethbtc"]
fcoin_ws.handle(print)
fcoin_ws.sub(topics)
订阅成功的响应结果如下:
{
"type": "topics",
"topics": ["candle.M1.ethbtc"]
}
常规订阅的通知消息格式如下:
{
"type":"candle.M1.ethbtc",
"id":1523691480,
"seq":11400000,
"open":2.000000000,
"close":2.000000000,
"high":2.000000000,
"low":2.000000000,
"count":0,
"base_vol":0,
"quote_vol":0
}
账户与资产
查询账户资产
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
api.accounts_balance
响应结果如下:
{
"status": 0,
"data": [
{
"currency": "btc",
"available": "50.0",
"frozen": "50.0",
"balance": "100.0"
}
]
}
此 API 用于查询用户的资产列表。
HTTP Request
GET https://api.fcoin.com/v2/accounts/balance
订单
订单模型说明
订单模型由以下属性构成:
属性 | 类型 | 含义解释 |
---|---|---|
id |
String |
订单 ID |
symbol |
String |
交易对 |
side |
String |
交易方向(buy , sell ) |
type |
String |
订单类型(limit ,market ) |
price |
String |
下单价格 |
amount |
String |
下单数量 |
state |
String |
订单状态 |
executed_value |
String |
已成交 |
filled_amount |
String |
成交量 |
fill_fees |
String |
手续费 |
created_at |
Long |
创建时间 |
source |
String |
来源 |
订单状态说明:
属性 | 含义解释 |
---|---|
submitted |
已提交 |
partial_filled |
部分成交 |
partial_canceled |
部分成交已撤销 |
filled |
完全成交 |
canceled |
已撤销 |
pending_cancel |
撤销已提交 |
创建新的订单
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
order_create_param = fcoin.order_create_param('btcusdt', 'buy', 'limit', '8000.0', '1.0')
api.orders.create(order_create_param)
响应结果如下:
{
"status": 0,
"data": "9d17a03b852e48c0b3920c7412867623"
}
此 API 用于创建新的订单。
HTTP Request
POST https://api.fcoin.com/v2/orders
请求参数
参数 | 默认值 | 描述 |
---|---|---|
symbol | 无 | 交易对 |
side | 无 | 交易方向 |
type | 无 | 订单类型 |
price | 无 | 价格 |
amount | 无 | 下单量 |
查询订单列表
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
api.orders.get()
响应结果如下:
{
"status": 0,
"data": [
{
"id": "string",
"symbol": "string",
"type": "limit",
"side": "buy",
"price": "string",
"amount": "string",
"state": "submitted",
"executed_value": "string",
"fill_fees": "string",
"filled_amount": "string",
"created_at": 0,
"source": "web"
}
]
}
此 API 用于查询订单列表。
HTTP Request
GET https://api.fcoin.com/v2/orders
查询参数
参数 | 默认值 | 描述 |
---|---|---|
symbol | 交易对 | |
states | 订单状态 | |
before | 查询某个页码之前的订单 | |
after | 查询某个页码之后的订单 | |
limit | 每页的订单数量,默认为 20 条 |
获取指定订单
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
api.orders.get('9d17a03b852e48c0b3920c7412867623')
响应结果如下:
{
"status": 0,
"data": {
"id": "9d17a03b852e48c0b3920c7412867623",
"symbol": "string",
"type": "limit",
"side": "buy",
"price": "string",
"amount": "string",
"state": "submitted",
"executed_value": "string",
"fill_fees": "string",
"filled_amount": "string",
"created_at": 0,
"source": "web"
}
}
此 API 用于返回指定的订单详情。
HTTP Request
GET https://api.fcoin.com/v2/orders/{order_id}
URL 参数
参数 | 描述 |
---|---|
order_id | 订单 ID |
申请撤销订单
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
api.orders.submit_cancel(2)
响应结果如下:
{
"status": 0,
"msg": "string",
"data": true
}
此 API 用于撤销指定订单,订单撤销过程是异步的,即此 API 的调用成功代表着订单已经进入撤销申请的过程,需要等待撮合的进一步处理,才能进行订单的撤销确认。
HTTP Request
POST https://api.fcoin.com/v2/orders/{order_id}/submit-cancel
URL 参数
参数 | 解释 |
---|---|
order_id | 订单 ID |
查询指定订单的成交记录
import fcoin
api = fcoin.authorize('key', 'secret', timestamp)
api.orders.get('9d17a03b852e48c0b3920c7412867623').match_results()
响应结果如下:
{
"status": 0,
"data": [
{
"price": "string",
"fill_fees": "string",
"filled_amount": "string",
"side": "buy",
"type": "limit",
"created_at": 0
}
]
}
此 API 用于获取指定订单的成交记录
HTTP Request
GET https://api.fcoin.com/v2/orders/{order_id}/match-results
URL 参数
参数 | 解释 |
---|---|
order_id | 订单 ID |
订单错误代码
错误代码 | 含义解释 |
---|---|
2000 | 账户错误 |
错误代码
错误代码 | 含义解释 |
---|---|
400 | Bad Request -- 错误的请求 |
401 | Unauthorized -- API key 或者签名,时间戳有误 |
403 | Forbidden -- 禁止访问 |
404 | Not Found -- 未找到请求的资源 |
405 | Method Not Allowed -- 使用的 HTTP 方法不适用于请求的资源 |
406 | Not Acceptable -- 请求的内容格式不是 JSON |
429 | Too Many Requests -- 请求受限,请降低请求频率 |
500 | Internal Server Error -- 服务内部错误,请稍后再进行尝试 |
503 | Service Unavailable -- 服务不可用,请稍后再进行尝试 |
FCoin API的更多相关文章
- node js fcoin api 出现 api key check fail : {"status":1090,"msg":"Illegal API signature"}
//主区://ft / btc 不支持市价 买入数量不能小于5个FT 买//ft / eth 支持市价 最小买入eth不能小于0.01 买//ft / usdt 支持市价 最小买入usdt不能小于10 ...
- 各大知名区块链交易所链接及API文档链接
区块链交易所链接 火币网(Huobi):https://www.huobi.br.com/zh-cn/ API文档:https://github.com/huobiapi/API_Docs/wiki ...
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
- 12306官方火车票Api接口
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- html5 canvas常用api总结(三)--图像变换API
canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...
- JavaScript 对数据处理的5个API
JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- javascript的api设计原则
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
随机推荐
- U3D的有限状态机系统
或许广大程序员之前接触过游戏状态机,这已不是个新鲜的词汇了.其重要性我也不必多说了,但今天我要讲到的一个状态机框架或许您以前并未遇到过.所以,我觉得有必要将自己的心得分享一下.下面是一个链接:http ...
- npm yarn
1.从接触nodejs开始,一直就青睐于npm包管理工具,熟悉的命令以及提供的各种便利,也让自己没有想过更换为其他的:但是,有人也说过“海纳百川,方可走远”.因此还是有必要了解一下其他的包管理工具,比 ...
- Java网络编程之查找Internet地址
一.概述 连接到Internet上计算机都有一个称为Internet地址或IP地址的唯一的数来标识.由于IP很难记住,人们设计了域名系统(DNS),DNS可以将人们可以记忆的主机名与计算机可以记忆的I ...
- iOS AOP编程思想及实践
什么是 AOP Wikipedia 上的 AOP 定义: In computing, aspect-oriented programming (AOP) is a programming paradi ...
- nginx介绍和安装
1.nginx的介绍 1.1 nginx的优势 1) 作为Web服务器,Nginx处理静态文件.索引文件,自动索引的效率非常高. 2) 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站 ...
- 13条Android手机必备技巧 让玩机更有趣
腾讯数码讯(编译:张秀梅)如果你不是一名极客或手机爱好者,那么或许对于手中的Android手机来说,肯定无法做到百分之百了解.对于这款世界上最受欢迎的操作系统来说,有许多不为大部分人所知晓的使用技巧或 ...
- Qt封装百度人脸识别+图像识别
AI技术的发展在最近几年如火如荼,工资待遇也是水涨船高,应用的前景也是非常广阔,去年火起来的人脸识别,今年全国遍地开花,之前封装了下face++的人脸识别等接口,今年看了下百度的AI,还免费了,效果也 ...
- 【Spring源码分析系列】启动component-scan类扫描加载过程
原文地址:http://blog.csdn.net/xieyuooo/article/details/9089441/ 在spring 3.0以上大家都一般会配置一个Servelet,如下所示: &l ...
- javah 错误: 无法访问android.app.Activity问题解决
cd /Users/musictom/Documents/source/ky/app/build/intermediates/classes/debug javah -jni -classpath / ...
- Redis学习笔记--Redis配置文件redis.conf参数配置详解
########################################## 常规 ########################################## daemonize n ...