├── .gitattributes ├── C++ ├── build.sh └── main.cpp ├── Golang └── main.go ├── JAVA ├── pom.xml └── src │ └── main │ └── java │ ├── META-INF │ └── MANIFEST.MF │ └── com │ └── client │ ├── Client.java │ └── Main.java ├── PHP └── level2.php ├── Python └── level2.py └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=python 2 | *.cpp linguist-language=python 3 | -------------------------------------------------------------------------------- /C++/build.sh: -------------------------------------------------------------------------------- 1 | #依赖zlib/websocketpp/gcc版本>4.8.5 2 | yum install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils 3 | yum install zlib-ada-devel.x86_64 4 | yum install websocketpp-devel.noarch 5 | 6 | #buid 7 | g++ -o client main.cpp -lboost_system -lpthread -lz -std=c++11 8 | #run 9 | ./client -------------------------------------------------------------------------------- /C++/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "zlib.h" 9 | #define CHUNK 16384 10 | using websocketpp::lib::placeholders::_1; 11 | using websocketpp::lib::placeholders::_2; 12 | using websocketpp::lib::bind; 13 | typedef websocketpp::client client; 14 | typedef websocketpp::config::asio_client::message_type::ptr message_ptr; 15 | int DecompressString(const char *in_str, size_t in_len, std::string &out_str); 16 | 17 | /** 18 | * 接收处理 19 | */ 20 | void on_message(client *c, websocketpp::connection_hdl hdl, message_ptr msg) { 21 | //文本消息 22 | if (msg->get_opcode()==websocketpp::frame::opcode::text){ 23 | std::cout <<"Text响应:"<get_payload().c_str()<< std::endl; 24 | } 25 | //二进制消息 26 | if (msg->get_opcode()==websocketpp::frame::opcode::binary){ 27 | std::string tmp = ""; 28 | std::string &out_decompress = tmp; 29 | DecompressString( msg->get_payload().c_str(), msg->get_payload().size(), out_decompress); 30 | std::cout <<"Binary响应:"<send(hdl, "add=lv1_600519,lv2_600519", websocketpp::frame::opcode::text); 40 | std::cout << "连接成功" << std::endl; 41 | } 42 | 43 | int main(int argc, char *argv[]) { 44 | //服务地址。 注意:C++版本的地址 问号前需加斜杠 45 | std::string wsUrl = "ws://<服务器地址>/?token="; 46 | 47 | client c; 48 | //连接相关 49 | try { 50 | //debug日志开关 51 | // c.set_access_channels(websocketpp::log::alevel::all); 52 | c.clear_access_channels(websocketpp::log::alevel::all); 53 | c.init_asio(); 54 | 55 | // 注册处理函数 56 | c.set_message_handler(bind(&on_message, &c, ::_1, ::_2)); 57 | c.set_open_handler(bind(&on_open, &c, _1)); 58 | 59 | websocketpp::lib::error_code ec; 60 | client::connection_ptr con = c.get_connection(wsUrl, ec); 61 | if (ec) { 62 | std::cout << "连接失败: " << ec.message() << std::endl; 63 | return 0; 64 | } 65 | c.connect(con); 66 | c.run(); 67 | } catch (websocketpp::exception const &e) { 68 | std::cout << e.what() << std::endl; 69 | } 70 | } 71 | /** 72 | *解压缩方法 73 | */ 74 | int DecompressString(const char *in_str, size_t in_len, std::string &out_str) { 75 | if (!in_str) 76 | return Z_DATA_ERROR; 77 | int ret; 78 | unsigned have; 79 | z_stream strm; 80 | unsigned char out[CHUNK]; 81 | strm.zalloc = Z_NULL; 82 | strm.zfree = Z_NULL; 83 | strm.opaque = Z_NULL; 84 | strm.avail_in = 0; 85 | strm.next_in = Z_NULL; 86 | ret = inflateInit2(&strm, -MAX_WBITS); 87 | if (ret != Z_OK) 88 | return ret; 89 | std::shared_ptr sp_strm(&strm, [](z_stream *strm) { 90 | (void) inflateEnd(strm); 91 | }); 92 | const char *end = in_str + in_len; 93 | size_t pos_index = 0; 94 | size_t distance = 0; 95 | int flush = 0; 96 | do { 97 | distance = end - in_str; 98 | strm.avail_in = (distance >= CHUNK) ? CHUNK : distance; 99 | strm.next_in = (Bytef *) in_str; 100 | in_str += strm.avail_in; 101 | flush = (in_str == end) ? Z_FINISH : Z_NO_FLUSH; 102 | do { 103 | strm.avail_out = CHUNK; 104 | strm.next_out = out; 105 | ret = inflate(&strm, Z_NO_FLUSH); 106 | if (ret == Z_STREAM_ERROR) 107 | break; 108 | switch (ret) { 109 | case Z_NEED_DICT: 110 | ret = Z_DATA_ERROR; 111 | case Z_DATA_ERROR: 112 | case Z_MEM_ERROR: 113 | return ret; 114 | } 115 | have = CHUNK - strm.avail_out; 116 | out_str.append((const char *) out, have); 117 | } while (strm.avail_out == 0); 118 | } while (flush != Z_FINISH); 119 | return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; 120 | } 121 | 122 | -------------------------------------------------------------------------------- /Golang/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "compress/flate" 6 | "github.com/gorilla/websocket" 7 | "log" 8 | "time" 9 | ) 10 | 11 | func main() { 12 | //连接地址 13 | wsUrl := "ws://<服务器地址>?token=" 14 | conn, _, err := websocket.DefaultDialer.Dial(wsUrl, nil) 15 | if err != nil { 16 | log.Fatalln("连接错误:", err) 17 | } 18 | //接收协程 19 | go func() { 20 | receive(conn) 21 | }() 22 | 23 | //发送订阅 24 | cmd := "all=lv2_600519,lv1_000001" 25 | err = conn.WriteMessage(websocket.TextMessage, []byte(cmd)) 26 | if err != nil { 27 | log.Fatalln("发送指令错误:", err) 28 | } 29 | log.Println("发送指令成功,等待接收") 30 | for { 31 | time.Sleep(time.Second) 32 | } 33 | } 34 | 35 | func receive(conn *websocket.Conn) { 36 | for { 37 | //阻塞接收 38 | messageType, rb, err := conn.ReadMessage() 39 | if err != nil { 40 | log.Fatalln("接收错误:", err) 41 | return 42 | } 43 | //文本消息 44 | if messageType == websocket.TextMessage { 45 | log.Println("Text响应:", string(rb)) 46 | } 47 | //二进制消息 48 | if messageType == websocket.BinaryMessage { 49 | unZipByte := DeCompress(rb) 50 | log.Println("Binary推送:", string(unZipByte)) 51 | } 52 | } 53 | } 54 | 55 | //解压方法 56 | func DeCompress(b []byte) []byte { 57 | var buffer bytes.Buffer 58 | buffer.Write([]byte(b)) 59 | reader := flate.NewReader(&buffer) 60 | var result bytes.Buffer 61 | result.ReadFrom(reader) 62 | reader.Close() 63 | return result.Bytes() 64 | } 65 | -------------------------------------------------------------------------------- /JAVA/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | com.client 7 | test 8 | 1.0-SNAPSHOT 9 | jar 10 | socketClient 11 | http://maven.apache.org 12 | 13 | UTF-8 14 | 18 15 | 18 16 | 17 | 18 | 19 | org.java-websocket 20 | Java-WebSocket 21 | 1.3.5 22 | 23 | 24 | 25 | 26 | 27 | org.apache.maven.plugins 28 | maven-shade-plugin 29 | 1.2.1 30 | 31 | 32 | package 33 | 34 | shade 35 | 36 | 37 | 38 | 40 | com.client.Main 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /JAVA/src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.client.Main 3 | 4 | -------------------------------------------------------------------------------- /JAVA/src/main/java/com/client/Client.java: -------------------------------------------------------------------------------- 1 | package com.client; 2 | import org.java_websocket.client.WebSocketClient; 3 | import org.java_websocket.handshake.ServerHandshake; 4 | import java.net.URI; 5 | import java.net.URISyntaxException; 6 | import java.nio.ByteBuffer; 7 | import java.text.SimpleDateFormat; 8 | import java.util.Date; 9 | import java.io.ByteArrayOutputStream; 10 | import java.io.IOException; 11 | import java.util.zip.Inflater; 12 | import java.util.zip.DataFormatException; 13 | 14 | public class Client extends WebSocketClient { 15 | 16 | SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 17 | 18 | public Client(String url) throws URISyntaxException { 19 | super(new URI(url)); 20 | } 21 | 22 | @Override 23 | public void onOpen(ServerHandshake shake) { 24 | //发送订阅命令 25 | this.send("add=lv1_600519,lv2_600519"); 26 | } 27 | 28 | /** 29 | * 命令返回文本消息 30 | */ 31 | @Override 32 | public void onMessage(String paramString) { 33 | System.out.println(sdf.format(new Date()) + " Text响应:" + paramString); 34 | } 35 | 36 | @Override 37 | public void onClose(int paramInt, String paramString, boolean paramBoolean) { 38 | System.out.println("连接关闭"); 39 | } 40 | 41 | @Override 42 | public void onError(Exception e) { 43 | System.out.println("连接异常" + e); 44 | } 45 | 46 | /** 47 | * 行情接收处理 48 | */ 49 | @Override 50 | public void onMessage(ByteBuffer bytes) { 51 | super.onMessage(bytes); 52 | String s=""; 53 | try { 54 | //二进制解压缩 55 | byte[] dec=decompress(bytes.array()); 56 | s = new String(dec, "UTF-8"); 57 | }catch (IOException e){ 58 | System.err.println("Binary解析IO异常:"+e.getMessage()); 59 | return; 60 | } 61 | catch (DataFormatException e){ 62 | System.err.println("Binary解析格式异常:"+e.getMessage()); 63 | return; 64 | } 65 | System.out.println(sdf.format(new Date()) + " Binary响应:" + s); 66 | } 67 | 68 | /** 69 | * 解压缩方法 70 | */ 71 | public static byte[] decompress(byte[] compressedData) throws DataFormatException { 72 | Inflater inflater = new Inflater(true); 73 | inflater.setInput(compressedData); 74 | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressedData.length); 75 | byte[] buffer = new byte[1024]; 76 | while (!inflater.finished()) { 77 | int count = inflater.inflate(buffer); 78 | outputStream.write(buffer, 0, count); 79 | } 80 | inflater.end(); 81 | return outputStream.toByteArray(); 82 | } 83 | } -------------------------------------------------------------------------------- /JAVA/src/main/java/com/client/Main.java: -------------------------------------------------------------------------------- 1 | package com.client; 2 | 3 | import java.net.URISyntaxException; 4 | 5 | public class Main { 6 | public static void main(String[] args) throws URISyntaxException { 7 | String wsUrl = "ws://<服务器地址>?token="; 8 | Client fd = new Client(wsUrl); 9 | fd.connect(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /PHP/level2.php: -------------------------------------------------------------------------------- 1 | '; 10 | //服务器端口 11 | $port = <服务器端口>; 12 | 13 | //连接 14 | $conn = new Client($host, $port); 15 | $conn->upgrade("/?token="); 16 | 17 | //发送订阅 18 | $conn->push("add=lv2_600519,lv1_000001"); 19 | 20 | //开启接收协程 21 | go("receive", $conn); 22 | }); 23 | 24 | function receive($client) 25 | { 26 | while (true) { 27 | $data = $client->recv(); 28 | $time = date("H:i:s"); 29 | //解压 30 | @$zipStr = gzinflate($data->data); 31 | if ($zipStr) { 32 | echo "{$time} Binary推送:{$zipStr}\n"; 33 | } else { 34 | echo "{$time} Text响应:{$data->data}\n"; 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /Python/level2.py: -------------------------------------------------------------------------------- 1 | #!python3 2 | # -*- coding:utf-8 -*- 3 | import time 4 | import websocket 5 | import zlib 6 | 7 | 8 | # 发送订阅 9 | def on_open(ws): 10 | ws.send("all=lv2_600519,lv1_000001") 11 | 12 | 13 | # 接收推送 14 | def on_message(ws, message, type, flag): 15 | # 命令返回文本消息 16 | if type == websocket.ABNF.OPCODE_TEXT: 17 | print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message) 18 | print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message) 19 | # 行情推送压缩二进制消息,在此解压缩 20 | if type == websocket.ABNF.OPCODE_BINARY: 21 | rb = zlib.decompress(message, -zlib.MAX_WBITS) 22 | print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Binary响应:", rb.decode("utf-8")) 23 | 24 | 25 | def on_error(ws, error): 26 | print(error) 27 | 28 | 29 | def on_close(ws, code, msg): 30 | print(time.strftime('%H:%M:%S', time.localtime(time.time())), "连接已断开") 31 | 32 | 33 | wsUrl = "ws://<服务器地址>?token=" 34 | ws = websocket.WebSocketApp(wsUrl, 35 | on_open=on_open, 36 | on_data=on_message, 37 | on_error=on_error, 38 | on_close=on_close) 39 | ws.run_forever() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## websocket行情接入 2 | 3 | 4 | [行情测试](http://jvquant.com/websocket.html) http://jvquant.com/websocket.html 5 | 6 | [交易在线测试](http://jvquant.com/trade.html) http://jvquant.com/trade.html 7 | 8 | [官方文档地址](http://jvquant.com/wiki.html) http://jvquant.com/wiki.html 9 | 10 | ## 分配服务器 11 | 12 | 13 | `注意:`每次分配的服务器地址会发生变化,连接服务前,请务必调用该接口获取最新的服务器地址。 14 | 15 | 获取服务器: 16 | 17 | 接口参数: 18 | 19 | | # | 参数名 | 类型 | 描述 | 20 | | --- | --- | --- | --- | 21 | | 1 | market | string | 市场标志,沪深为ab | 22 | | 2 | type | string | 接口类别,行情类别为websocket | 23 | | 3 | token | string | jvQuant token | 24 | 25 | 接口返回: 26 | 27 | | # | 参数名 | 类型 | 描述 | 28 | | --- | --- | --- | --- | 29 | | 1 | code | string | 请求状态码 | 30 | | 2 | server | string | 分配服务器地址及端口号 | 31 | 32 | 返回示例: 33 | 34 | ## code规范 35 | 36 | jvQuant支持沪深主板、科创板、创业板,股票以及可转债行情,提供level1和level2数据推送。 37 | 38 | 订阅代码由`行情标志`和`证券代码`组成,用分隔符"`_`"连接。 39 | 40 | 如: 41 | 42 | lv1\_600519,代表贵州茅台level1行情 43 | 44 | lv2\_127063,代表贵轮转债level2行情 45 | 46 | | # | 行情标志 | 类型 | 描述 | 47 | | --- | --- | --- | --- | 48 | | 1 | lv1 | string | level1行情 | 49 | | 2 | lv2 | string | level2行情 | 50 | 51 | ## 连接登录 52 | 53 | 使用分配的服务器地址,通过websokcet协议连接服务器。 54 | 55 | websocket接口地址: 56 | 57 | ## 订阅行情 58 | 59 | 创建websocket连接后,您可以输入以下指令进行行情订阅: 60 | 61 | | # | 指令 | 参数 | 描述 | 62 | | -- | --- | --- | --- | 63 | | 1 | add | string | 增加订阅code | 64 | | 2 | del | string | 删除订阅code | 65 | | 3 | all | string | 覆盖全部code | 66 | | 4 | list | string | 查看全部订阅code | 67 | | 5 | his | string | (history)查看今日已订阅的code汇总信息 | 68 | 69 | 指令后接code参数,用分隔符"`=`"连接,多个code用分隔符"`,`"分隔。 70 | 71 | 例: 72 | 73 | `add=lv1_600519,lv2_127063` ,表示增加订阅lv1\_600519,lv2\_127063行情。 74 | 75 | `del=lv1_600519,lv2_127063` ,表示删除订阅lv1\_600519,lv2\_127063行情。 76 | 77 | `all=lv1_600519` ,表示覆盖全部订阅code。 78 | 79 | `all=` ,后接参数为空,表示删除全部订阅code。 80 | 81 | `list` ,无需参数,表示查看全部订阅code。 82 | 83 | ## 解析行情 84 | 85 | 为提高数据传输速率,行情推送采用二进制方式传输,请在接收端解压缩为字符串。 86 | 87 | ### level1 88 | 89 | level1行情推送数据以换行符"`\n`"为分隔,每一行以lv1\_xxxxxx=为开头,代表该类别code对应的行情。 90 | 91 | lv1每笔交易数据字段以"`,`"为分隔符,定义如下: 92 | 93 | 推送时间`,`证券名称`,`最新价格`,`涨幅`,`成交量`,`成交额`,`买五档\[挂单数量,挂单价格\]`,`卖五档\[挂单数量,挂单价格\] 94 | 95 | leve1推送数据包格式如下: 96 | 97 | ``lv1_证券代码1=推送时间`,`证券名称`,`最新价格`,`涨幅`,`成交量`,`成交额`,`买五档[挂单数量,挂单价格]`,`卖五档[挂单数量,挂单价格]...`` ``lv1_证券代码2=推送时间`,`证券名称`,`最新价格`,`涨幅`,`成交量`,`成交额`,`买五档[挂单数量,挂单价格]`,`卖五档[挂单数量,挂单价格]...`` 98 | 99 | ### level2 100 | 101 | level2行情推送数据以换行符"`\n`"为分隔,每一行以lv2\_xxxxxx=为开头,代表该类别code对应的行情。 102 | 103 | 同一时刻会存在多笔交易,以"`|`"为分隔符。 104 | 105 | lv2每笔交易数据字段以"`,`"为分隔符,定义如下: 106 | 107 | 成交时间(毫秒)`,`成交编号`,`成交价格`,`成交数量/(股) 108 | 109 | 推送数据包格式如下: 110 | 111 | `lv2_证券代码1=成交时间1,成交编号1,成交价格1,成交数量1|成交编号2,成交时间2,成交价格2,成交数量2...` `lv2_证券代码2=成交时间1,成交编号1,成交价格1,成交数量1|成交编号2,成交时间2,成交价格2,成交数量2...` 112 | 113 | [行情测试](http://jvquant.com/websocket.html) 114 | 115 | ## 交易接入 116 | 117 | jvQuant OpenAPI直达券商,提供多种登录及交易方式。 118 | 119 | 您只需输入对应券商的资金账号密码,即可调用jvQuant OpenAPI进行交易。 120 | 121 | \*个人账户仅支持东方财富登录,机构账户无限制。 122 | 123 | ## 分配服务器 124 | 125 | 为实现更好的用户体验,jvQuant会根据您所在的地区分配合适的服务器。 126 | 127 | `注意:`每次分配的服务器地址会发生变化,连接服务前,请务必调用该接口获取最新的服务器地址。 128 | 129 | 分配服务器地址: 130 | 131 | 接口参数: 132 | 133 | | # | 参数名 | 类型 | 描述 | 134 | | --- | --- | --- | --- | 135 | | 1 | market | string | 市场标志,沪深为ab | 136 | | 2 | type | string | 接口类别,交易类别为trade | 137 | | 3 | token | string | jvQuant token | 138 | 139 | 接口返回: 140 | 141 | | # | 参数名 | 类型 | 描述 | 142 | | --- | --- | --- | --- | 143 | | 1 | code | string | 请求状态码 | 144 | | 2 | server | string | 分配服务器地址及端口号 | 145 | 146 | 返回示例: 147 | 148 | ## 登录柜台 149 | 150 | 输入交易账户及密码,通过柜台验证后返回授权交易凭证ticket。 151 | 152 | 请妥善保管好交易凭证,在ticket有效期内,您可以免登录进行后续的交易操作。 153 | 154 | 接口地址: 155 | 156 | 接口参数: 157 | 158 | | # | 参数名 | 类型 | 描述 | 159 | | --- | --- | --- | --- | 160 | | 1 | token | string | jvQuant token | 161 | | 2 | acc | string | 12位资金账号 | 162 | | 3 | pass | string | 资金交易密码 | 163 | 164 | 接口返回: 165 | 166 | | # | 参数名 | 类型 | 描述 | 167 | | --- | --- | --- | --- | 168 | | 1 | code | string | 请求状态码 | 169 | | 2 | ticket | string | 登录凭证 | 170 | | 2 | expire | int | ticket有效时间(秒) | 171 | 172 | 返回示例: 173 | 174 | ## 查询持仓信息 175 | 176 | 接口地址: 177 | 178 | 接口参数: 179 | 180 | | # | 参数名 | 类型 | 描述 | 181 | | --- | --- | --- | --- | 182 | | 1 | token | string | jvQuant token | 183 | | 2 | ticket | string | 交易凭证ticket | 184 | 185 | 接口返回: 186 | 187 | | # | 参数名 | 类型 | 描述 | 188 | | --- | --- | --- | --- | 189 | | 1 | message | string | 错误信息 | 190 | | 2 | total | string | 账户总资产 | 191 | | 2 | usable | string | 账户可用资金 | 192 | | 3 | day\_earn | string | 账户当日盈亏 | 193 | | 4 | hold\_earn | string | 账户持仓盈亏 | 194 | | 5 | hold\_list | array | 账户持仓明细 | 195 | | 5.1 | hold\_list\[x\].code | string | 账户持仓证券列表 | 196 | | 5.2 | hold\_list\[x\].name | string | 持仓证券名 | 197 | | 5.3 | hold\_list\[x\].hold\_vol | string | 持仓数量 | 198 | | 5.4 | hold\_list\[x\].hold\_vol | string | 持仓数量 | 199 | | 5.5 | hold\_list\[x\].usable\_vol | string | 可用数量 | 200 | | 5.6 | hold\_list\[x\].usable\_vol | string | 可用数量 | 201 | | 5.7 | hold\_list\[x\].day\_earn | string | 当日盈亏 | 202 | | 5.8 | hold\_list\[x\].hold\_earn | string | 持仓盈亏 | 203 | 204 | 返回示例: 205 | 206 | ## 查询交易信息 207 | 208 | 接口地址: 209 | 210 | 接口参数: 211 | 212 | | # | 参数名 | 类型 | 描述 | 213 | | --- | --- | --- | --- | 214 | | 1 | token | string | jvQuant token | 215 | | 2 | ticket | string | 交易凭证ticket | 216 | 217 | 接口返回: 218 | 219 | | # | 参数名 | 类型 | 描述 | 220 | | --- |-------------------------|--------| --- | 221 | | 1 | message | string | 错误信息 | 222 | | 2 | list | array | 交易明细列表 | 223 | | 2.1 | list\[x\].order\_id | string | 委托编号 | 224 | | 2.2 | list\[x\].day | string | 委托日期 | 225 | | 2.3 | list\[x\].time | string | 委托时间 | 226 | | 2.4 | list\[x\].code | string | 委托证券代码 | 227 | | 2.5 | list\[x\].name | string | 委托证券名 | 228 | | 2.6 | list\[x\].type | string | 委托类型 | 229 | | 2.7 | list\[x\].status | string | 委托状态 | 230 | | 2.8 | list\[x\].order\_price | string | 委托价格 | 231 | | 2.9 | list\[x\].order\_volume | string | 委托数量 | 232 | | 2.10 | list\[x\].deal\_price | string | 成交价格 | 233 | | 2.11 | list\[x\].deal\_volume | string | 成交数量 | 234 | 235 | 返回示例: 236 | 237 | ## 委托报单 238 | 239 | 接口地址: 240 | 241 | 接口参数: 242 | 243 | | # | 参数名 | 类型 | 描述 | 244 | | --- | --- | --- | --- | 245 | | 1 | trade | string | 买入(buy)或卖出(sale) | 246 | | 2 | token | string | jvQuant token | 247 | | 3 | ticket | string | 交易凭证ticket | 248 | | 4 | code | string | 证券代码 | 249 | | 5 | name | string | 证券名称 | 250 | | 6 | price | float | 委托价格 | 251 | | 7 | volume | int | 委托数量 | 252 | 253 | 接口返回: 254 | 255 | | # | 参数名 | 类型 | 描述 | 256 | | --- | --- | --- | --- | 257 | | 1 | message | string | 错误信息 | 258 | | 2 | order\_id | string | 委托编号 | 259 | 260 | 返回示例: 261 | 262 | ## 撤销报单 263 | 264 | 接口地址: 265 | 266 | 接口参数: 267 | 268 | | # | 参数名 | 类型 | 描述 | 269 | | --- | --- | --- | --- | 270 | | 1 | token | string | jvQuant token | 271 | | 2 | ticket | string | 交易凭证ticket | 272 | | 3 | order\_id | string | 委托编号 | 273 | 274 | 接口返回: 275 | 276 | | # | 参数名 | 类型 | 描述 | 277 | | --- | --- | --- | --- | 278 | | 1 | code | string | 返回状态码 | 279 | | 2 | message | string | 错误信息 | 280 | 281 | 返回示例: 282 | 283 | [交易测试](http://jvquant.com/trade.html) 284 | 285 | [官方文档地址](http://jvquant.com/wiki.html) http://jvquant.com/wiki.html 286 | --------------------------------------------------------------------------------