From a1899c6e9245fbfbd35d000fed50bdeae7228618 Mon Sep 17 00:00:00 2001 From: lester Date: Fri, 7 Jul 2023 15:32:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 60 +++++++++++ "code\345\210\227\350\241\250.md" | 22 ++++ example/http_request.py | 21 ++++ example/websocket_request.py | 93 ++++++++++++++++ .../K\347\272\277\346\237\245\350\257\242.md" | 101 ++++++++++++++++++ ...45\345\217\243\351\231\220\345\210\266.md" | 20 ++++ ...45\344\273\267\346\237\245\350\257\242.md" | 88 +++++++++++++++ ...45\344\273\267\346\237\245\350\257\242.md" | 98 +++++++++++++++++ ...60\345\235\200\350\257\264\346\230\216.md" | 14 +++ ...50\346\240\207\345\207\206\345\244\264.md" | 31 ++++++ ...45\344\273\267\350\256\242\351\230\205.md" | 38 +++++++ .../\345\277\203\350\267\263.md" | 36 +++++++ ...45\344\273\267\350\256\242\351\230\205.md" | 76 +++++++++++++ ...45\345\217\243\351\231\220\345\210\266.md" | 13 +++ ...45\344\273\267\350\256\242\351\230\205.md" | 95 ++++++++++++++++ ...60\345\235\200\350\257\264\346\230\216.md" | 13 +++ ...50\346\240\207\345\207\206\345\244\264.md" | 39 +++++++ ...45\345\205\245\346\214\207\345\215\227.md" | 53 +++++++++ ...57\347\240\201\350\257\264\346\230\216.md" | 11 ++ 19 files changed, 922 insertions(+) create mode 100644 README.md create mode 100644 "code\345\210\227\350\241\250.md" create mode 100644 example/http_request.py create mode 100644 example/websocket_request.py create mode 100644 "http\346\216\245\345\217\243/K\347\272\277\346\237\245\350\257\242.md" create mode 100644 "http\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" create mode 100644 "http\346\216\245\345\217\243/\346\234\200\346\226\260\346\210\220\344\272\244\346\212\245\344\273\267\346\237\245\350\257\242.md" create mode 100644 "http\346\216\245\345\217\243/\346\234\200\346\226\260\347\233\230\345\217\243\346\212\245\344\273\267\346\237\245\350\257\242.md" create mode 100644 "http\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" create mode 100644 "http\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" create mode 100644 "websocket\346\216\245\345\217\243/\345\217\226\346\266\210\346\212\245\344\273\267\350\256\242\351\230\205.md" create mode 100644 "websocket\346\216\245\345\217\243/\345\277\203\350\267\263.md" create mode 100644 "websocket\346\216\245\345\217\243/\346\210\220\344\272\244\346\212\245\344\273\267\350\256\242\351\230\205.md" create mode 100644 "websocket\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" create mode 100644 "websocket\346\216\245\345\217\243/\347\233\230\345\217\243\346\212\245\344\273\267\350\256\242\351\230\205.md" create mode 100644 "websocket\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" create mode 100644 "websocket\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" create mode 100644 "\346\216\245\345\205\245\346\214\207\345\215\227.md" create mode 100644 "\351\224\231\350\257\257\347\240\201\350\257\264\346\230\216.md" diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad084fe --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# Free Forex Market Data +Free Forex Quote API 免费的外汇贵金属行情API + +简单好用的免费开源外汇贵金属行情API + +## 功能特性: + +- 免费开源 + +- 获取外汇实时行情 + +- 获取外汇实时多档盘口 + +- 获取外汇K线数据 + +- 获取贵金属实时行情 + +- 获取贵金属实时多档盘口 + +- 获取贵金属K线数据 + + + + +## 接口介绍 +- [接入指南](./接入指南.md) +- [错误码说明](./错误码说明.md) +- [code列表](./code列表.md) + +### http接口 +- [行情地址说明](./http接口/行情地址说明.md) +- [接口限制](./http接口/接口限制.md) +- [通用标准头](./http接口/通用标准头.md) +- [获取最新成交报价查询](./http接口/最新成交报价查询.md) +- [最新盘口报价查询](./http接口/最新盘口报价查询.md) +- [K线查询](./http接口/K线查询.md) + +### websocket接口 +- [行情地址说明](./websocket接口/行情地址说明.md) +- [接口限制](./websocket接口/接口限制.md) +- [通用标准头](./websocket接口/通用标准头.md) +- [心跳](./websocket接口/心跳.md) +- [成交报价订阅](./websocket接口/成交报价订阅.md) +- [盘口报价订阅](./websocket接口/盘口报价订阅.md) +- [取消报价订阅](./websocket接口/取消报价订阅.md) + +## Python使用示例,超简单上手 + +- [http请求示例](./example/http_request.py) +- [websocket请求示例](./example/websocket_request.py) + + + + +## 联系我们 + +- Telegram: https://t.me/ts_support_erik + +## 其他作品 + diff --git "a/code\345\210\227\350\241\250.md" "b/code\345\210\227\350\241\250.md" new file mode 100644 index 0000000..f1bb6b7 --- /dev/null +++ "b/code\345\210\227\350\241\250.md" @@ -0,0 +1,22 @@ +# 目前支持如下code + +## 目前支持如下外汇和贵金属代码,需要新增产品可直接联系
+姓名:erik wang
+邮箱:erik.wang@chixi88.com
+Telegram: https://t.me/ts_support_erik
+ +| 类别 | name | code | +| --- | --- | --- | +| 外汇 | GBP/JPY | GBPJPY | +| 外汇 | CAD/JPY | CADJPY | +| 外汇 | GBP/CAD | GBPCAD | +| 外汇 | CAD/CHF | CADCHF | +| 外汇 | USD/JPY | USDJPY | +| 外汇 | EUR/CAD | EURCAD | +| 外汇 | CHF/JPY | CHFJPY | +| 外汇 | EUR/CHF | EURCHF | +| 外汇 | EUR/JPY | EURJPY | +| 外汇 | GBP/CHF | GBPCHF | +| 外汇 | USD/CHF | USDCHF | +| 能源 | UKOIL | UKOIL | +| 贵金属 | GOLD | GOLD | \ No newline at end of file diff --git a/example/http_request.py b/example/http_request.py new file mode 100644 index 0000000..6d66b7c --- /dev/null +++ b/example/http_request.py @@ -0,0 +1,21 @@ +import requests # pip3 install requests +import json + +# 将如下字段信息进行url的encode,复制到url的查询字符串的query里 +""" +{"trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806","data":{"code":"USDJPY","kline_type":1,"kline_timestamp_end":0,"query_kline_num":2,"adjust_type":0}} +""" + +# Base URL being accessed +test_url = 'https://quote.aatest.online/quote-b-api/kline?token=3662a972-1a5d-4bb1-88b4-66ca0c402a03-1688712831841&query=%7B%22trace%22%3A%223baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806%22%2C%22data%22%3A%7B%22code%22%3A%22USDJPY%22%2C%22kline_type%22%3A1%2C%22kline_timestamp_end%22%3A0%2C%22query_kline_num%22%3A2%2C%22adjust_type%22%3A0%7D%7D' + +# Extra headers +test_headers = { + 'Content-Type' : 'application/json' +} + +resp = requests.get(url=test_url, headers=test_headers) + +# Decoded text returned by the request +text = resp.text +print(text) \ No newline at end of file diff --git a/example/websocket_request.py b/example/websocket_request.py new file mode 100644 index 0000000..7e54c79 --- /dev/null +++ b/example/websocket_request.py @@ -0,0 +1,93 @@ +import json +import websocket # pip install websocket-client + +class Feed(object): + + def __init__(self): + self.url = 'wss://quote.aatest.online/quote-b-ws-api?token=3662a972-1a5d-4bb1-88b4-66ca0c402a03-1688712831841' # 这里输入websocket的url + self.ws = None + + def on_open(self, ws): + """ + Callback object which is called at opening websocket. + 1 argument: + @ ws: the WebSocketApp object + """ + print('A new WebSocketApp is opened!') + + # 开始订阅(举个例子) + sub_param = { + "cmd_id": 22002, + "seq_id": 123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + "symbol_list":[ + { + "code": "USDJPY", + "depth_level": 5, + }, + { + "code": "GBPUSD", + "depth_level": 5, + } + ] + } + } + sub_str = json.dumps(sub_param) + ws.send(sub_str) + print("depth quote are subscribed!") + + def on_data(self, ws, string, type, continue_flag): + """ + 4 argument. + The 1st argument is this class object. + The 2nd argument is utf-8 string which we get from the server. + The 3rd argument is data type. ABNF.OPCODE_TEXT or ABNF.OPCODE_BINARY will be came. + The 4th argument is continue flag. If 0, the data continue + """ + + def on_message(self, ws, message): + """ + Callback object which is called when received data. + 2 arguments: + @ ws: the WebSocketApp object + @ message: utf-8 data received from the server + """ + # 对收到的message进行解析 + result = eval(message) + print(result) + + def on_error(self, ws, error): + """ + Callback object which is called when got an error. + 2 arguments: + @ ws: the WebSocketApp object + @ error: exception object + """ + print(error) + + def on_close(self, ws, close_status_code, close_msg): + """ + Callback object which is called when the connection is closed. + 2 arguments: + @ ws: the WebSocketApp object + @ close_status_code + @ close_msg + """ + print('The connection is closed!') + + def start(self): + self.ws = websocket.WebSocketApp( + self.url, + on_open=self.on_open, + on_message=self.on_message, + on_data=self.on_data, + on_error=self.on_error, + on_close=self.on_close, + ) + self.ws.run_forever() + + +if __name__ == "__main__": + feed = Feed() + feed.start() \ No newline at end of file diff --git "a/http\346\216\245\345\217\243/K\347\272\277\346\237\245\350\257\242.md" "b/http\346\216\245\345\217\243/K\347\272\277\346\237\245\350\257\242.md" new file mode 100644 index 0000000..6251817 --- /dev/null +++ "b/http\346\216\245\345\217\243/K\347\272\277\346\237\245\350\257\242.md" @@ -0,0 +1,101 @@ +## GET K线查询 + +GET /quote-b-api/kline + +### 请求参数 + +| 名称 | 位置 | 类型 | 必选 | 说明 | +| ---------------------- | ----- | ------- | ---- | ------------------------------------------------------------ | +| token | query | string | 否 | | +| query | query | string | 否 | 查看query请求参数说明 | + +> query 请求参数 + +将如下json进行UrlEncode编码,赋值到url的查询字符串的query里 +```json +{ + "trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data": { + "code": "USDJPY", + "kline_type": 1, + "kline_timestamp_end": 0, + "query_kline_num": 2, + "adjust_type": 0 + } +} +``` + +### query请求参数 + +| 名称 | 类型 | 必选 | 说明 | +| ---------------------- | ------- | ---- | ------------------------------------------------------------ | +| trace | string | 是 | 追踪码,用来查询日志使用,请保证每次请求时唯一 | +| data | object | 是 | | +| » code | string | 是 | 请查看code列表,选择你要查询的code | +| » kline_type | integer | 是 | k线类型,1分钟K,2为5分钟K,3为15分钟K,4为30分钟K,5为小时K,6为2小时K,7为4小时K,8为日K,9为周K,10为月K | +| » kline_timestamp_end | integer | 是 | 从那个时间点往前查,为0表示从当前时间,默认为0 | +| » query_kline_num | integer | 是 | 查询多少根K线,最多1000根 | +| » adjust_type | integer | 是 | 复权类型,对于股票类的code才有效,例如:0:除权,1:前复权 | + +> 返回示例 + +> OK + +```json +{ + "ret": 200, + "msg": "ok", + "trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc", + "data": { + "code": "USDJPY", + "kline_type": 1, + "kline_list": [ + { + "timestamp": "1677829200", + "open_price": "136.421", + "close_price": "136.412", + "high_price": "136.422", + "low_price": "136.407", + "volume": "0", + "turnover": "0" + }, + { + "timestamp": "1677829260", + "open_price": "136.412", + "close_price": "136.401", + "high_price": "136.415", + "low_price": "136.397", + "volume": "0", + "turnover": "0" + } + ] + } +} +``` + +### 返回结果 + +| 状态码 | 状态码含义 | 说明 | 数据模型 | +| ------ | ------------------------------------------------------- | ---- | -------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | Inline | + +### 返回数据结构 + +状态码 **200** + +| 名称 | 类型 | 必选 | 约束 | 中文名 | 说明 | +| --------------- | -------- | ---- | ---- | ------ | ------------------------------------------------------------ | +| » ret | integer | true | | | | +| » msg | string | true | | | | +| » trace | string | true | | | | +| » data | object | true | | | | +| »» code | string | true | | | 代码 | +| »» kline_type | integer | true | | | k线类型,1分钟K,2为5分钟K,3为15分钟K,4为30分钟K,5为小时K,6为2小时K,7为4小时K,8为日K,9为周K,10为月K | +| »» kline_list | [object] | true | | | | +| »»» timestamp | string | true | | | 该K线时间戳 | +| »»» open_price | string | true | | | 该K线开盘价 | +| »»» close_price | string | true | | | 该K线收盘价 | +| »»» high_price | string | true | | | 该K线最高价 | +| »»» low_price | string | true | | | 该K线最低价 | +| »»» volume | string | true | | | 该K线成交数量 | +| »»» turnover | string | true | | | 该K线成交金额 | diff --git "a/http\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" "b/http\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" new file mode 100644 index 0000000..18e286b --- /dev/null +++ "b/http\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" @@ -0,0 +1,20 @@ +# http接口限制 + +## http接口限制1-IP类限制 +相同IP的多次请求,按接口确定具体次数限制,互不影响 + +- /kline 每10秒只能请求1次 +- /depth-tick 每秒只能请求1次 +- /trade-tick 每秒只能请求1次 +### 举例: +- IP为A,调用/kline接口查询K线,14:03:01请求了1次,并且它也在这一分钟调用了/trade-tick接口查询成交报价1次,后台服务都能正常提供服务 +- IP为A,调用/kline接口查询K线,14:03:01请求了2次,前1次后台服务都能正常提供服务,最后1次给出错误回应 + +## http接口限制2-连接数限制 +为避免过多请求对于后台服务造成过大压力,最大连接数限制在100个,视后续服务运行表现再进行调节,超过限制的请求,直接会断开连接 + +## http接口限制3-K线查询限制 +一次只能查询1个code的K线,一次最多只能查询1000根K线,对于查询超过1000根以上的,则按1000根来进行查询 + +## http接口限制4-报价查询限制 +一次查询,最多只能查询5个code,对于查询超过5个以上的,则按5个来查询 \ No newline at end of file diff --git "a/http\346\216\245\345\217\243/\346\234\200\346\226\260\346\210\220\344\272\244\346\212\245\344\273\267\346\237\245\350\257\242.md" "b/http\346\216\245\345\217\243/\346\234\200\346\226\260\346\210\220\344\272\244\346\212\245\344\273\267\346\237\245\350\257\242.md" new file mode 100644 index 0000000..3e0d24d --- /dev/null +++ "b/http\346\216\245\345\217\243/\346\234\200\346\226\260\346\210\220\344\272\244\346\212\245\344\273\267\346\237\245\350\257\242.md" @@ -0,0 +1,88 @@ +## GET 最新成交报价查询 + +GET /quote-b-api/trade-tick + +### 请求参数 + +| 名称 | 位置 | 类型 | 必选 | 说明 | +| ---------------------- | ----- | ------- | ---- | ------------------------------------------------------------ | +| token | query | string | 否 | | +| query | query | string | 否 | 查看query请求参数说明 | + +> query 请求参数 + +将如下json进行UrlEncode编码,赋值到url的查询字符串的query里 +```json +{ + "trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc", + "data": { + "symbol_list": [ + { + "code": "USDJPY" + }, + { + "code": "GBPUSD" + } + ] + } +} +``` + +### query请求参数 + +| 名称 | 类型 | 必选 | 说明 | +| -------------- | -------- | ---- | ---- | +| trace | string | 是 | | +| data | object | 是 | | +| » symbol_list | [object] | 是 | | +| »» code | string | 否 | 代码 | + +> 返回示例 + +> OK + +```json +{ + "ret": 200, + "msg": "ok", + "trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc", + "data": { + "tick_list": [ + { + "code": "857.HK", + "seq": "30841439", + "tick_time": "1677831545217", + "price": "136.302", + "volume": "0", + "turnover": "0", + "trade_direction": 0 + } + ] + } +} +``` + +### 返回结果 + +| 状态码 | 状态码含义 | 说明 | 数据模型 | +| ------ | ------------------------------------------------------- | ---- | -------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | Inline | + +### 返回数据结构 + +状态码 **200** + +| 名称 | 类型 | 必选 | 约束 | 中文名 | 说明 | +| ------------------- | -------- | ----- | ---- | ------ | ------------------------------------ | +| » ret | integer | true | | | 返回code | +| » msg | string | true | | | 返回code对应消息 | +| » trace | string | true | | | 请求的trace | +| » data | object | true | | | | +| »» tick_list | [object] | true | | | | +| »»» code | string | false | | | 代码 | +| »»» seq | string | false | | | 序号 | +| »»» tick_time | string | false | | | 时间戳 | +| »»» price | string | false | | | 成交价 | +| »»» volume | string | false | | | 成交量 | +| »»» turnover | string | false | | | 成交额 | +| »»» trade_direction | integer | false | | | 交易方向,0为默认值,1为BUY,2为SELL | \ No newline at end of file diff --git "a/http\346\216\245\345\217\243/\346\234\200\346\226\260\347\233\230\345\217\243\346\212\245\344\273\267\346\237\245\350\257\242.md" "b/http\346\216\245\345\217\243/\346\234\200\346\226\260\347\233\230\345\217\243\346\212\245\344\273\267\346\237\245\350\257\242.md" new file mode 100644 index 0000000..74909e8 --- /dev/null +++ "b/http\346\216\245\345\217\243/\346\234\200\346\226\260\347\233\230\345\217\243\346\212\245\344\273\267\346\237\245\350\257\242.md" @@ -0,0 +1,98 @@ +## GET 最新盘口报价查询 + +GET /quote-b-api/depth-tick + +### 请求参数 + +| 名称 | 位置 | 类型 | 必选 | 说明 | +| ---------------------- | ----- | ------- | ---- | ------------------------------------------------------------ | +| token | query | string | 否 | | +| query | query | string | 否 | 查看query请求参数说明 | + +> query 请求参数 + +将如下json进行UrlEncode编码,赋值到url的查询字符串的query里 +```json +{ + "trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc", + "data": { + "symbol_list": [ + { + "code": "USDJPY" + }, + { + "code": "GBPUSD" + } + ] + } +} +``` + +### query请求参数 + +|名称|类型|必选|说明| +|---|---|---|---| +|trace|string| 是 || +|data|object| 是 || +|» symbol_list|[object]| 是 || +|»» code|string| 否 |代码| + +> 返回示例 + +> OK + +```json +{ + "ret": 200, + "msg": "ok", + "trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc", + "data": { + "tick_list": [ + { + "code": "USDJPY", + "seq": "30686349", + "tick_time": "1677830357227", + "bids": [ + { + "price": "136.424", + "volume": "100000.00" + } + ], + "asks": [ + { + "price": "136.427", + "volume": "400000.00" + } + ] + } + ] + } +} +``` + +### 返回结果 + +|状态码|状态码含义|说明|数据模型| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|OK|Inline| + +### 返回数据结构 + +状态码 **200** + +|名称|类型|必选|约束|中文名|说明| +|---|---|---|---|---|---| +|» ret|integer|true|||返回code| +|» msg|string|true|||返回code对应消息| +|» trace|string|true|||请求的trace| +|» data|object|true|||| +|»» tick_list|[object]|true|||| +|»»» code|string|false|||代码| +|»»» seq|string|false|||报价序号| +|»»» tick_time|string|false|||报价时间戳| +|»»» bids|[object]|false|||bid列表| +|»»»» price|string|false|||价| +|»»»» volume|string|false|||量| +|»»» asks|[object]|false|||ask列表| +|»»»» price|string|false|||价| +|»»»» volume|string|false|||量| diff --git "a/http\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" "b/http\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" new file mode 100644 index 0000000..8e71087 --- /dev/null +++ "b/http\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" @@ -0,0 +1,14 @@ +# 行情地址说明 +/quote-b-api 股票查询API + +查询API为http协议,url为https://quote.aatest.online/quote-b-api + +每发送一次查询请求或者订阅请求时,需要带上token信息,当前支持的token如下: +e945d7d9-9e6e-4721-922a-7251a9d311d0-1678159756806
+ +请求示例:
+ +https://quote.aatest.online/quote-b-api/kline?token=3662a972-1a5d-4bb1-88b4-66ca0c402a03-1688712831841&query=queryData
+ +具体调用方式,请查看http接口列表 + diff --git "a/http\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" "b/http\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" new file mode 100644 index 0000000..3cfc393 --- /dev/null +++ "b/http\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" @@ -0,0 +1,31 @@ +# 请求通用标准头介绍 + +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ----- | ------ | ------ | ------ | ----------------------------------------------- | +| trace | 跟踪号 | string | 是 | 请求者生成唯一,响应与请求将保持一致,最大长度64 | +| data | 数据体 | object | 是 | 具体数据格式见各个接口定义 | +```json +{ + "trace":"asdfsdfa", + "data":{ + } +} +``` + +# 应答通用标准头介绍 + +| 字段 | 名称 | 类型 | 说明 | +| ----- | ------ | ------ | ----------------------------------------------- | +| ret | 返回值 | int32 | [错误码说明](doc-2138451) | +| msg | 消息 | string | 对成功或者失败具体的描述 | +| trace | 跟踪号 | string | 请求者生成唯一,响应与请求将保持一致,最大长度64 | +| data | 数据体 | object | 具体数据格式见各个接口定义 | +```json +{ + "ret":202, + "msg":"request data param invalid", + "trace":"asdfsdfa", + "data":{ + } +} +``` \ No newline at end of file diff --git "a/websocket\346\216\245\345\217\243/\345\217\226\346\266\210\346\212\245\344\273\267\350\256\242\351\230\205.md" "b/websocket\346\216\245\345\217\243/\345\217\226\346\266\210\346\212\245\344\273\267\350\256\242\351\230\205.md" new file mode 100644 index 0000000..9b0ddc7 --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\345\217\226\346\266\210\346\212\245\344\273\267\350\256\242\351\230\205.md" @@ -0,0 +1,38 @@ +# 接口说明 +# 请求-协议号:22006 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ----------- | -------- | ------ | ------ | ------------------------------------------------------------ | +| cancel_type | 取消类型 | uint32 | 是 | 0:取消所有报价订阅,1:取消盘口报价订阅,2:取消成交报价订阅 | +## 请求示例 +```json +{ + "cmd_id":22006, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + "cancel_type": 1, + } +} +``` +# 应答-协议号:22007 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 说明 | +| --- | --- | --- | --- | +| | | | | +## 应答示例 +```json +{ + "ret":200, + "msg":"ok", + "cmd_id":22007, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` \ No newline at end of file diff --git "a/websocket\346\216\245\345\217\243/\345\277\203\350\267\263.md" "b/websocket\346\216\245\345\217\243/\345\277\203\350\267\263.md" new file mode 100644 index 0000000..3ca2734 --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\345\277\203\350\267\263.md" @@ -0,0 +1,36 @@ +# 接口说明 +要求请求者每10秒发送一次,在30秒内如果没有收到心跳请求,就会认为超时,断开请求者的websocket连接 +# 请求-协议号:22000 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| --- | --- | --- | --- | --- | +## 请求示例 +```json +{ + "cmd_id":22000, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` +# 应答-协议号:22001 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 说明 | +| --- | --- | --- | --- | +## 应答示例 +```json +{ + "ret":200, + "msg":"ok", + "cmd_id":22001, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` \ No newline at end of file diff --git "a/websocket\346\216\245\345\217\243/\346\210\220\344\272\244\346\212\245\344\273\267\350\256\242\351\230\205.md" "b/websocket\346\216\245\345\217\243/\346\210\220\344\272\244\346\212\245\344\273\267\350\256\242\351\230\205.md" new file mode 100644 index 0000000..152c90c --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\346\210\220\344\272\244\346\212\245\344\273\267\350\256\242\351\230\205.md" @@ -0,0 +1,76 @@ +# 接口说明 + +该接口特性为对于每一个websocket连接,每发送一次该请求,后台会默认覆盖上一次订阅请求。订阅成功后会进行推送数据。 +# 请求-协议号:22004 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ----------- | -------- | ----- | ------ | ------------------------ | +| symbol_list | 产品列表 | array | 是 | 具体格式见下面symbol定义 | +### symbol定义 +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ---- | ---- | ------ | ------ | ------------------------ | +| code | 代码 | string | 是 | 具体内容,请查阅code列表 | +## 请求示例 +```json +{ + "cmd_id":22004, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + "symbol_list": [ + { + "code": "USDJPY" + }, + ], + } +} +``` +# 应答-协议号:22005 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 说明 | +| --- | --- | --- | --- | +| | | | | +## 应答示例 +```json +{ + "ret":200, + "msg":"ok", + "cmd_id":22005, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` +# 推送-协议号:22998 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 说明 | +| --------------- | ---------- | ------ | -------------------------- | +| code | 代码 | string | 具体内容,请查阅code列表 | +| seq | 报价序号 | string | | +| tick_time | 报价时间戳 | string | 单位毫秒 | +| price | 成交价 | string | | +| volume | 成交量 | string | | +| turnover | 成交额 | string | | +| trade_direction | 成交方向 | uint32 | 0为默认值,1为BUY,2为SELL | +## 应答示例 +```json +{ + "cmd_id":22998, + "data":{ + "code": "USDJPY", + "seq": "1605509068000001", + "tick_time": "1605509068", + "price": "651.12", + "volume": "300", + "turnover": "12345.6", + "trade_direction": 1, + } +} +``` \ No newline at end of file diff --git "a/websocket\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" "b/websocket\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" new file mode 100644 index 0000000..1931f0d --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\346\216\245\345\217\243\351\231\220\345\210\266.md" @@ -0,0 +1,13 @@ +# websocket接口限制 + +### websocket接口限制1-IP类限制 +相同的token,相同的IP的,只能建立一个websocket连接 + +### websocket接口限制2-连接数限制 +为避免过多请求对于后台服务造成过大压力,ws-api的最大连接数限制在100个,视后续服务运行表现再进行调节,超过限制的,则直接断开连接 + +### websocket接口限制3-接口调用频率限制 +一个websocket连接的多次请求需要间隔1秒发送,比如A在28分30秒时调用了ws-api ,不管是否断开该Websocket连接,如果A接着又调用ws-api ,此时时间还是28分30秒,那第二次请求会被拒绝 + +### websocket接口限制4-报价订阅限制 +一次订阅,最多只能订阅5个code,如果订阅超过5个,则按5个来订阅 \ No newline at end of file diff --git "a/websocket\346\216\245\345\217\243/\347\233\230\345\217\243\346\212\245\344\273\267\350\256\242\351\230\205.md" "b/websocket\346\216\245\345\217\243/\347\233\230\345\217\243\346\212\245\344\273\267\350\256\242\351\230\205.md" new file mode 100644 index 0000000..570c2e2 --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\347\233\230\345\217\243\346\212\245\344\273\267\350\256\242\351\230\205.md" @@ -0,0 +1,95 @@ +# 接口说明 +该接口特性为对于每一个websocket连接,每发送一次该请求,后台会默认覆盖上一次订阅请求。订阅成功后会进行推送数据。 +# 请求-协议号:22002 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ----------- | -------- | ----- | ------ | ------------------------ | +| symbol_list | 产品列表 | array | 是 | 具体格式见下面symbol定义 | +### symbol定义 +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ----------- | -------- | ------ | ------ | ------------------------------------------------------------ | +| code | 代码 | string | 是 | 具体内容,请查阅code列表 | +| depth_level | 深度层级 | uint32 | 否 | 如果没有depth_level字段时,后台只会提供一层的报价,请求的层级大于实际报价层级,或者如果没有depth_level字段时,则后台按实际报价有多少层给多少层 | +## 请求示例 +```json +{ + "cmd_id":22002, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + "symbol_list": [ + { + "code": "USDJPY", + "depth_level": 5, + }, + ], + } +} +``` +# 应答-协议号:22003 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 说明 | +| --- | --- | --- | --- | +| | | | | + + +## 应答示例 +```json +{ + "ret":200, + "msg":"ok", + "cmd_id":22003, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` +# 推送-协议号:22999 +## 数据格式:json +## 数据结构 +### data定义 +| 字段 | 名称 | 类型 | 说明 | +| --------- | ---------- | ------ | ------------------------ | +| code | 代码 | string | 具体内容,请查阅code列表 | +| seq | 报价序号 | string | | +| tick_time | 报价时间戳 | string | 单位毫秒 | +| bids | bid深度 | array | 见下面bids定义 | +| asks | ask深度 | array | 见下面asks定义 | +### bids定义 +| 字段 | 名称 | 类型 | 说明 | +| ------ | ---------------- | ------ | ---- | +| price | 买一价,买盘价格 | string | | +| volume | 买一量,买盘量 | string | | +### asks定义 +| 字段 | 名称 | 类型 | 说明 | +| ------ | ---------------- | ------ | ---- | +| price | 买一价,买盘价格 | string | | +| volume | 买一量,买盘量 | string | | +## 应答示例 +```json +{ + "cmd_id":22999, + "data":{ + "code": "USDJPY", + "seq": "1605509068000001", + "tick_time": "1605509068", + "bids": [ + { + "pric": "9.12", + "volume": "9.12", + }, + ], + "asks": [ + { + "price": "147.12", + "volume": "147.12", + }, + ], + } +} +``` \ No newline at end of file diff --git "a/websocket\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" "b/websocket\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" new file mode 100644 index 0000000..68abc33 --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\350\241\214\346\203\205\345\234\260\345\235\200\350\257\264\346\230\216.md" @@ -0,0 +1,13 @@ +# 行情地址说明 + +/quote-b-ws-api 股票订阅API + +订阅API为websocket协议,url为wss://quote.aatest.online/quote-b-ws-api + +每发送一次查询请求或者订阅请求时,需要带上token信息,当前支持的token如下: +3662a972-1a5d-4bb1-88b4-66ca0c402a03-1688712831841
+ +建立连接:wss://quote.aatest.online/quote-b-ws-api?token=3662a972-1a5d-4bb1-88b4-66ca0c402a03-1688712831841,然后就可以订阅具体的接口数据了
+ +具体调用方式,请查看websocket接口列表 + diff --git "a/websocket\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" "b/websocket\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" new file mode 100644 index 0000000..9480bea --- /dev/null +++ "b/websocket\346\216\245\345\217\243/\351\200\232\347\224\250\346\240\207\345\207\206\345\244\264.md" @@ -0,0 +1,39 @@ +# 请求通用标准头介绍 + +| 字段 | 名称 | 类型 | 必填项 | 说明 | +| ------ | ------ | ------ | ---------------------- | ----------------------------------------------- | +| cmd_id | 协议号 | uint32 | 详见各个接口定义有提供 | | +| seq_id | 序列号 | uint32 | 是 | 请求者生成唯一,响应与请求将保持一致 | +| trace | 跟踪号 | string | 是 | 请求者生成唯一,响应与请求将保持一致,最大长度64 | +| data | 数据体 | object | 是 | 具体数据格式见各个接口定义 | +```json +{ + "cmd_id":22000, + "seq_id":123, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` + +# 应答通用标准头介绍 + +| 字段 | 名称 | 类型 | 说明 | +| ------ | ------ | ------ | ----------------------------------------------- | +| ret | 返回值 | int32 | [错误码说明](doc-2138451) | +| msg | 消息 | string | 对成功或者失败具体的描述 | +| cmd_id | 协议号 | uint32 | 详见各个接口定义有提供 | +| seq_id | 序列号 | uint32 | 请求者生成唯一,响应与请求将保持一致 | +| trace | 跟踪号 | string | 请求者生成唯一,响应与请求将保持一致,最大长度64 | +| data | 数据体 | object | 具体数据格式见各个接口定义 | +```json +{ + "ret":201, + "msg":"request header param invalid", + "cmd_id":0, + "seq_id":0, + "trace":"3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806", + "data":{ + } +} +``` \ No newline at end of file diff --git "a/\346\216\245\345\205\245\346\214\207\345\215\227.md" "b/\346\216\245\345\205\245\346\214\207\345\215\227.md" new file mode 100644 index 0000000..a03486e --- /dev/null +++ "b/\346\216\245\345\205\245\346\214\207\345\215\227.md" @@ -0,0 +1,53 @@ +# 简介 +本文档主要目的是对外提供免费的行情接口快速接入方法。 +主要功能如下: +- 免费开源 +- 获取外汇实时行情 + +- 获取外汇实时多档盘口 + +- 获取外汇K线数据 + +- 获取贵金属实时行情 + +- 获取贵金属实时多档盘口 + +- 获取贵金属K线数据 + +# 接口分类 +接口分为http接口和websocket接口两大类。 + +## http接口主要提供: +- K线查询 +- 最新盘口报价查询 +- 最新成交报价查询 + +## websocket接口主要提供: +- 心跳 +- 盘口报价订阅 +- 成交报价订阅 +- 订阅取消 + +# 接入流程 +### 第1步:通过行情地址说明文档了解接口的访问url以及请求时携带的参数 +- [http行情地址说明](./http接口/行情地址说明.md) +- [websocket行情地址说明](./websocket接口/行情地址说明.md) +### 第2步:请看接口限制说明文档,了解调用时应该有那些需要注意的地方,避免调用被拒绝 +- [http接口限制](./http接口/接口限制.md) +- [websocket接口限制](./websocket接口/接口限制.md) +- [错误码说明](./错误码说明.md) +### 第3步:请查看通用标准头说明文档,了解请求和响应的数据格式如何 +- [http通用标准头](./http接口/通用标准头.md) +- [websocket通用标准头](./websocket接口/通用标准头.md) +### 第4步:请查看code列表文档,好决定要那一个产品的行情数据 +- [code列表](./code列表.md) +### 第5步:请求具体接口获取你想要的数据 +#### http接口 +- [获取最新成交报价查询](./http接口/最新成交报价查询.md) +- [最新盘口报价查询](./http接口/最新盘口报价查询.md) +- [K线查询](./http接口/K线查询.md) +#### websocket接口 +- [心跳](./websocket接口/心跳.md) +- [成交报价订阅](./websocket接口/成交报价订阅.md) +- [盘口报价订阅](./websocket接口/盘口报价订阅.md) +- [取消报价订阅](./websocket接口/取消报价订阅.md) \ No newline at end of file diff --git "a/\351\224\231\350\257\257\347\240\201\350\257\264\346\230\216.md" "b/\351\224\231\350\257\257\347\240\201\350\257\264\346\230\216.md" new file mode 100644 index 0000000..f1b6c8d --- /dev/null +++ "b/\351\224\231\350\257\257\347\240\201\350\257\264\346\230\216.md" @@ -0,0 +1,11 @@ +# 错误码说明 + +| 错误码 | 含义 | +| ------ | ---------------------------- | +| 200 | ok | +| 400 | request header param invalid | +| 400 | request data param invalid | +| 401 | token invalid | +| 429 | rate limit | +| 600 | code invalid | +| 601 | body empty | \ No newline at end of file