输入/搜索内容
入门
欢迎使用发明者量化交易平台
快速开始
密钥安全性
平台基础
账号与计费
实盘计费与充值
子账号
交易所
通用协议
本地凭据文件
交易所特殊说明
证券与期货
加密货币
托管者
策略库
实盘
编写策略
开发工具
回测系统
进阶专题
数据与研究
对外接口

交易所页面用来管理已配置的交易所账户。在发明者量化交易平台中,「交易所」指一个可供策略程序操作的账户:它包含资金账户的密钥配置,以及与该交易所通信的协议和接口封装。

在交易所管理页面点击「添加交易所」进入交易所添加页面,按需选择交易所并填写配置。密钥等加密字段在浏览器端加密后才保存到平台,平台不记录明文,见密钥安全性。

**交易所对象**
配置好的交易所在策略代码中就是交易所对象exchange。配置回测或实盘时可以添加多个交易所,在代码中对应交易所对象数组exchanges。

使用交易所对象
在策略代码中通过交易所对象读取账户和行情、下单、撤单,以JavaScript为例:

javascript
function main() { let account = exchange.GetAccount() // 查询账户信息 let ticker = exchange.GetTicker() // 获取ticker行情 let id = exchange.Buy(1000, 1) // 价格为1000,下单量为1 if (id) { exchange.CancelOrder(id) // 下单成功才有订单Id,订单未成交时可以撤单 } }

本章其余内容:

对于发明者量化交易平台尚未封装对接的交易所API接口,可通过编写通用协议插件程序进行接入。

通用协议配置截图

该通用协议可用于接入任何提供API接口的交易所,支持以下两种协议:

FIX协议插件程序与REST协议插件程序的区别仅在于插件程序与交易所接口的交互方式不同。协议插件程序与发明者量化托管者程序的交互方式、数据格式等细节处理完全相同,具体实现可参考上述链接中的示例。

配置交易所时,所有带掩码的加密输入框(Secret Key、私钥、密码等)都可以不填写内容本身,而填写一个凭据文件路径file:///文件名.txt。实盘运行时,托管者从本机读取该文件的内容作为这一项的值。这样私钥只存在于托管者所在的机器上,平台上保存的只是一个路径。

路径规则

  • 路径相对于本实盘的目录logs/storage/<实盘ID>/解析(logs位于托管者的工作目录下)。例如实盘ID为123456时,file:///rsaKey.txt对应logs/storage/123456/rsaKey.txt。
  • 可以有子目录,例如file:///keys/rsaKey.txt。
  • 只认.txt后缀;其它后缀不会当作文件读取,而是把这串文字原样作为配置值。
  • 路径不能是绝对路径,不能包含..,解析后也不能跳出实盘目录(指向目录外的符号链接同样不行)。
  • 凭据文件按实盘目录读取,多个实盘使用同一个交易所配置时,每个实盘的目录里都要放一份。
  • 文件读不到时实盘启动失败,报错中包含read key file;路径不合法时报错为key file path must be relative and cannot contain '..'或key file path escapes the robot directory。

示例:使用 RSA 密钥
以支持RSA KEY验证的交易所为例:

  1. 生成RSA公钥和私钥,例如用openssl生成PKCS#8格式的密钥对。
  2. 在交易所创建RSA KEY,上传第1步生成的公钥。
  3. 在平台配置交易所:Access Key填写交易所创建的RSA KEY,Secret Key填写file:///rsaKey.txt。
  4. 创建实盘,得到实盘ID(例如123456)。
  5. 把第1步生成的私钥保存为logs/storage/123456/rsaKey.txt,然后启动(或重启)实盘。

详细过程可以参考视频讲解。

个别交易所的配置方法,以及与通用接口行为不同的地方。没有列出的交易所按语法手册中的通用说明使用;各交易所exchange.IO()支持的切换功能见exchange.IO。

富途证券

支持富途牛牛的实盘交易和模拟交易,需要在托管者所在的机器上运行FutuOpenD。配置交易所对象、运行FutuOpenD等操作参看富途证券配置说明文档。

使用FutuOpenD接入模拟交易时,有些股票代码不支持,因而无法交易(富途牛牛手机App上可以模拟交易)。

  • 接口调用频率
    GetOrder、GetOrders、GetPositions、GetAccount默认使用缓存数据,不限制调用频率;FutuOpenD收到新数据时会自动更新缓存。
    调用exchange.IO("refresh", true)可以禁用缓存,禁用后的调用频率为每30秒内最多10次查询,超过会报错。

  • 股票代码
    格式为代码.市场,例如600519.SH。市场后缀:

    • HK:港股
    • US:美股
    • SH:沪市
    • SZ:深市
    • SG:新加坡期货
    • JP:日本期货

    在策略中用exchange.SetContractType()设置股票代码,例如:

    javascript
    function main() { var info = exchange.SetContractType("600519.SH") // 设置为股票600519.SH(贵州茅台),账户切换到A股市场 Log(info) Log(exchange.GetAccount()) // 当前股票是茅台,GetAccount返回A股市场的账户资产 Log(exchange.GetTicker()) // 获取茅台的当前行情 }
    python
    def main(): info = exchange.SetContractType("600519.SH") Log(info) Log(exchange.GetAccount()) Log(exchange.GetTicker())
    rust
    fn main() { let info = exchange.SetContractType("600519.SH"); // 设置为股票600519.SH(贵州茅台),账户切换到A股市场 Log!(info); Log!(exchange.GetAccount()); // 当前股票是茅台,GetAccount返回A股市场的账户资产 Log!(exchange.GetTicker(None)); // 获取茅台的当前行情 }

    设置交易方向的exchange.SetDirection、下单的exchange.Buy/exchange.Sell、撤单的exchange.CancelOrder、查询订单的exchange.GetOrder等函数,用法与期货市场相同。

  • 账户信息
    富途用TrdMarket区分香港市场、美国市场、大陆市场等。以下摘自Futu API文档:

    mylang
    const ( TrdMarket_TrdMarket_Unknown TrdMarket = 0 // 未知市场 TrdMarket_TrdMarket_HK TrdMarket = 1 // 香港市场 TrdMarket_TrdMarket_US TrdMarket = 2 // 美国市场 TrdMarket_TrdMarket_CN TrdMarket = 3 // 大陆市场 TrdMarket_TrdMarket_HKCC TrdMarket = 4 // 香港A股通市场 TrdMarket_TrdMarket_Futures TrdMarket = 5 // 期货市场 )

    exchange.GetAccount()返回的数据:

    json
    { "Info": [{ "Header": { ... // 省略 "TrdMarket": 1 // Info原始数据中的市场ID,表示香港市场的账户资产 }, "Funds": { // 该市场的账户资产信息 ... } }, ...], "Stocks": 0, "FrozenStocks": 0, "Balance": 1000000, // 当前市场的资产 "FrozenBalance": 0 }
  • FutuOpenD按登录的IP地址区分地区,非大陆IP登录的账户获取行情时有所限制,具体查阅FutuOpenD(富途)官方文档。

盈透证券(Interactive Brokers)

  • 配置交易所
    需要在托管者所在的机器上运行「IB Gateway」或「TWS(Trader Workstation)」。以TWS为例:登录后点击右上角的配置按钮,选择「配置」→「API」→「设置」,不要勾选「只读API」,勾选「启用ActiveX和套接字客户端」,并记下「套接字端口」(TWS默认实盘7496、模拟盘7497;IB Gateway默认实盘4001、模拟盘4002)。
    然后在平台的交易所添加页面选择盈透证券(Interactive Brokers):

    • 服务器地址:TWS或IB Gateway的地址和端口,例如localhost:7496。
    • 行情类型:实时数据、冻结数据、延迟数据、延迟冻结数据之一。没有订阅实时行情的账户可以选择延迟数据。运行中也可以用exchange.IO("marketDataType", n)切换(n为1到4,顺序同上)。
  • 合约代码
    用exchange.SetContractType()设置,格式为代码.货币[.类型[.交易所]],类型缺省为股票STK,交易所缺省为SMART:

    • 美股:AAPL.US、TSLA.US(US表示美元计价)。
    • 港股:代码.HK(HK表示港币计价)。
    • 期货(FUT):代码-到期月份[-乘数].货币.FUT.交易所,到期月份写成YYYYMM,交易所为IB的交易所代码。
    • 期权(OPT)与期货期权(FOP):代码-到期-C或P-行权价×100[-乘数].货币.OPT或FOP.交易所,行权价乘以100后写成整数。
    • 纯数字:直接作为IB的合约ID(conId)。
  • 其它说明

    • 托管者以实盘ID作为连接TWS的客户端号(clientId),实盘重启后客户端号不变,仍可撤销、修改此前挂出的订单。TWS只允许订单的原始客户端号(或主客户端)修改、撤销订单。
    • 持仓、订单的Symbol是简写形式(如Z74.SGD),exchange.GetPositions()、exchange.GetOrders()传入简写或下单时用的完整代码(如Z74.SGD.STK.SGX)都可以。
    • 订单被网关拒绝时,订单Info中的Reject字段记录拒单原因。
    • exchange.IO("debug", true)开启后,与TWS收发的每一帧按TWS API日志的格式输出到日志,便于与网关日志对照排查。

  • Futures_Binance
    支持币安的中文交易对:

    javascript
    function main() { let ticker = exchange.GetTicker("币安人生_USDT.swap") Log("ticker:", ticker) // {"Info":{...},"Symbol":"币安人生_USDT.swap","Open":0.29622,"High":0.31661, ...} }

    币安期货的exchange.IO()切换功能(双向持仓、逐仓/全仓、统一账户、STP模式等)见exchange.IO。

  • Futures_HuobiDM
    使用exchange.IO("base", "https://xxx.xxx.xxx")或exchange.SetBase("https://xxx.xxx.xxx")切换交易所接口的基地址。

    火币期货的exchange.IO()切换功能(signHost、逐仓/全仓、单向/双向持仓、统一账户等)见exchange.IO。

    条件单不支持OCO类型(ORDER_CONDITION_TYPE_OCO);多资产保证金模式下同样可以使用条件单。

  • Huobi
    支持火币的中文交易对:

    javascript
    function main() { let ticker = exchange.GetTicker("币安人生_USDT") Log("ticker:", ticker) // {"Info":{...},"Symbol":"币安人生_USDT","Open":0.29622,"High":0.31661, ...} }
  • Bitfinex
    现货市价买单的下单量是交易币数,不是金额。

  • AscendEx
    现货市价买单的下单量是交易币数,不是金额。

  • Futures_Hyperliquid
    参考Hyperliquid 使用指南。

    Hyperliquid期货的exchange.IO()切换功能(逐仓/全仓、主网/测试网、vaultAddress、walletAddress、expiresAfter等)见exchange.IO。

  • Futures_Lighter
    测试环境可以在配置交易所对象时勾选,也可以用exchange.SetBase()修改REST API端点切换到测试环境。

    Futures_Lighter的exchange.IO()切换功能(逐仓/全仓、订单过期时间等)见exchange.IO。

    exchange.GetTickers()返回的Buy、Sell是各品种的最新成交价(交易所没有批量盘口接口);需要买一、卖一价时用exchange.GetTicker()或exchange.GetDepth()。

  • Futures_edgeX
    edgeX的永续合约都以USDC计价,交易对写作BTC_USDC等,完整代码形如BTC_USDC.swap;写成BTC_USDT、BTC_USD会提示合约不存在。

  • Poloniex
    现货条件单只支持止损(ORDER_CONDITION_TYPE_SL):买单在价格涨到触发价时触发,卖单在价格跌到触发价时触发。止盈(ORDER_CONDITION_TYPE_TP)和OCO条件单会直接报错,不会下单。