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