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

平台的几个基本对象:账号与计费、交易所账户、运行策略的托管者、策略库和实盘。

实盘怎样计费、如何充值,以及如何用子账号把部分实盘交给他人管理。账号的其它设置(推送、二次验证、API接口等)在账号设置页面。

实盘计费

  • 实盘按小时计费,每个实盘每小时 0.05 USD,不足一小时按一小时计费。
  • 创建实盘即开始计费,启动时需要预付第一个小时,账户余额不足时实盘无法启动。实盘「停止」/「重启」不会重复计费。
  • 实盘运行中账户余额耗尽时,平台会停止该实盘;租用的策略到期时,使用该策略的实盘同样会被停止。
  • 一键租用托管者的服务器费用单独计费,与实盘计费无关,见一键租用托管者。

查询账单与余额预警

  • 在充值页面可以查看余额、充值记录和所有计费的账单明细。
  • 在账号设置的额度预警中设置预警阈值:可用余额低于该值时会收到邮件和微信通知(24小时内最多通知一次,充值或修改设置后重新计算);设置为0表示关闭。

充值
在充值页面选择充值方式和金额。使用USDT充值时务必注意:

  • 转账网络必须与充值页面选择的网络一致,目前支持TRC20、ERC20、BSC。ERC20与BSC的地址都以0x开头,格式相同,最容易选错。
  • 充值资产选择USDT。
  • 转账地址与充值页面显示的地址一致。

子账号用来把部分实盘交给他人查看和操作,而不交出主账号。

创建子账号
在账号设置页面打开子账号页签,在操作权限中选择该子账号可以访问的实盘,填写子账号的用户名和登录密码后创建。创建后的子账号显示在同一页面,可以修改、锁定/解锁、删除。

子账号设置

子账号的权限
子账号只能看到授权给它的实盘。对这些实盘可以修改参数、停止、重启,但不能修改实盘配置的交易所对象。

常见用途

  • 量化团队分工管理多个实盘。
  • 出租策略时,让租用方协助调试实盘。

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

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

**交易所对象**
配置好的交易所在策略代码中就是交易所对象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条件单会直接报错,不会下单。

托管者是运行策略的程序:实盘策略运行在托管者上,而不是运行在发明者量化交易平台网站上。托管者负责与平台通信、启动和停止策略进程、回传日志;策略访问交易所的网络请求也都从托管者所在的机器发出。托管者运行在你自己的服务器(或一键租用的服务器)上,平台网站出现网络故障也不影响托管者上正在运行的实盘。

支持的系统
托管者只发布64位版本:Linux(x86_64、ARM64)、macOS(Intel、Apple Silicon)、Windows(x64、ARM64,另有界面版)。不支持32位系统。

数据目录
托管者的数据都在工作目录(默认为启动目录,可用-w指定)下的logs目录中:

  • logs/storage/<实盘ID>/<实盘ID>.db3:实盘数据库(SQLite),保存日志、收益、图表、状态栏和_G()数据,可以用SQLite管理软件打开。
  • logs/storage/<实盘ID>/stdout.log、stderr.log:策略进程的标准输出和标准错误。
  • logs/docker.log:托管者自身的运行日志。
  • logs/docker.pid:托管者的身份信息,保留它,重启后平台会沿用原来的托管者ID。

网络代理
托管者不会读取系统代理设置或HTTP_PROXY等环境变量。需要通过代理访问交易所时:

  • 在策略中用exchange.SetProxy给交易所对象设置代理;
  • 或使用在网络层接管流量的透明代理(例如 Clash 的 TUN 模式),托管者无需任何配置。

本章内容:部署托管者(手动部署、一键租用、操作注意事项)、命令行参数、实盘数据迁移、托管者监控。

托管者管理页面列出当前账号下的托管者,可以切换列表或详细信息展示,查看托管者的IP地址、版本、编译时间等信息。点击部署托管者进入托管者部署页面,有两种方式:一键租用托管者、手动部署托管者。

托管者部署页面

在托管者部署页面点击一键租用托管者标签,根据配置、服务器机房地区等需求选择需要部署的服务器。

点击「立即购买」并输入当前发明者量化交易平台的账号密码进行验证,验证通过后将自动进行托管者程序部署。整个部署过程需要几分钟时间,系统会自动安装常用的Python库。

点击「立即购买」后租用的服务器由于是通过平台代为租用,仅具有有限的系统权限,不支持远程登录。如果需要使用未预装的第三方Python库,建议使用私有服务器进行手动部署。

通过一键租用托管者功能租用的服务器采用独立计费方式,与实盘计费相互独立。

点击「重新部署」按钮不会删除托管者目录下logs目录中的实盘日志和数据文件。

可以把托管者部署在个人电脑、服务器、树莓派(64位系统)等设备上。托管者只发布64位版本:

  • Linux命令行版:x86_64(amd64)、ARM64(aarch64)
  • macOS命令行版:Intel、Apple Silicon
  • Windows:x64、ARM64,各有命令行版和界面版

在托管者部署页面点击手动部署托管者,按系统下载对应的托管者程序并解压,可执行文件robot即托管者程序。同一页面还显示部署需要的两项信息:

手动部署托管者页面

  1. 通信地址:包含账号UID,形如node.fmz.com/123456。
  2. 密码:UID对应的发明者量化交易平台账号的密码。

Windows界面版
运行robot.exe,在界面上填写通信地址和密码,点击启动。

命令行版

bash
chmod +x robot # Linux/macOS 首次运行前加上执行权限 ./robot -s node.fmz.com/123456 # 启动后提示输入密码,输入时不回显

123456只是示例,实际的通信地址在托管者部署页面查看。不要用-p在命令行里写明文密码,它会留在shell历史和进程列表里;需要无人值守启动时,把地址和密码写进只有自己可读的配置文件robot.conf:

bash
cat > robot.conf <<'EOF' s=node.fmz.com/123456 p=你的密码 EOF chmod 600 robot.conf ./robot -c robot.conf # 启动目录下有robot.conf时,直接 ./robot 也会自动加载

全部参数和配置文件格式见命令行参数。

在后台运行
托管者忽略终端挂断信号:在SSH里前台启动后直接断开连接,托管者会继续运行,运行日志同时写在logs/docker.log。需要开机自启或崩溃后自动拉起时,可以用systemd等服务管理器运行,例如/etc/systemd/system/robot.service:

ini
[Unit] Description=FMZ robot After=network-online.target Wants=network-online.target [Service] WorkingDirectory=/opt/robot ExecStart=/opt/robot/robot -c /opt/robot/robot.conf Restart=on-failure TimeoutStopSec=90 [Install] WantedBy=multi-user.target
bash
sudo systemctl daemon-reload sudo systemctl enable --now robot

systemctl stop robot发送的SIGTERM会让托管者优雅退出:先停止其上的所有实盘、上报状态,再从平台下线。TimeoutStopSec留出足够的时间,避免收尾未完成就被强制结束。

**升级托管者**
策略运行时和交易所连接器由平台按需下发,不需要手动更新。升级托管者程序本身:先停止托管者(见托管者操作注意事项),用新版本替换robot可执行文件,再在同一工作目录启动。工作目录下的logs目录保留了托管者身份和实盘数据,启动后沿用原来的托管者ID。

**用Docker容器隔离策略进程**
Linux和macOS的命令行版可以用-i参数让每个策略进程运行在独立的Docker容器里(需要本机已安装并运行Docker)。这是策略进程的隔离方式,不是托管者本身的Docker镜像,参数见命令行参数。

先停实盘,再停托管者
删除托管者或停止托管者进程前,先确认它上面没有运行中的实盘。

正常停止托管者

  • 命令行版:在终端按一次Ctrl+C,或向进程发送SIGTERM(kill <PID>、systemctl stop)。
  • Windows界面版:点击界面上的停止按钮。

托管者收到停止指令后会优雅退出:先停止其上的所有实盘、上报最终状态,再从平台下线。收尾期间再按一次Ctrl+C会跳过状态上报和下线,直接退出,一般不要这样做。

避免强制结束
不要用kill -9结束托管者进程,也不要直接断电或强制关机。这样托管者来不及下线,平台上的实盘可能仍显示为运行中并继续计费;出现这种情况,需要先删除已离线的托管者,才能停止这些实盘。重启服务器前先停止托管者;用systemd等服务管理器运行时,系统关机会自动发送SIGTERM。

命令行版托管者程序robot的启动方式:

bash
./robot -s node.fmz.com/123456 # 启动后交互输入密码(不回显) ./robot node.fmz.com/123456 # 简写:robot 地址 [密码] ./robot -c robot.conf # 从配置文件读取参数 ./robot -v # 查看版本

参数

参数说明
-s 地址与平台通信的地址,形如node.fmz.com/123456(123456为账号UID),可带ws://或wss://前缀。在托管者部署页面查看。
-p 密码账号密码。不建议使用:明文密码会留在shell历史和进程列表中。不给时启动后交互输入,或写在配置文件里。
-n 名称托管者名称,显示在平台的托管者页面上。
-w 目录工作目录。logs(实盘数据、托管者日志、身份文件)都在这个目录下。
-c 文件配置文件,格式见下文。
-u 用户仅Linux/macOS:以该系统用户运行策略进程,托管者本身需要以root运行。使用-i时忽略。
-I IP指定本机出口IP,托管者与平台的连接以及策略访问交易所的连接都绑定这个地址,见下文。
-i 镜像仅Linux/macOS:用该Docker镜像为每个策略进程创建独立容器运行,需要本机已安装并运行Docker。
-e 路径配合-i:容器内的可执行文件路径。
-f JSON配合-i:Docker容器设置,可以直接写JSON,也可以写@文件路径从文件读取。
-H 地址配合-i:容器回连宿主机的地址。
-vv输出详细日志(托管者与平台的交互消息等),默认不输出,以免日志膨胀。
-d DNS旧版的自定义DNS参数,仍可接受但会被忽略,托管者一律使用系统的DNS解析。
-v、-V、--version打印版本和编译信息后退出。
-h、--help打印用法。
--ctl-stdin从标准输入读取控制指令(没有-p时第一行为密码),收到stop或输入结束时优雅退出。供把托管者封装成服务的程序使用。

取值型参数也可以写成-参数=值,例如-n=server01。参数写错时打印用法并退出。

配置文件 robot.conf
每行一个键=值,键是参数名去掉-(s p n w u I d i e f H vv),#开头的行是注释:

ini
# robot.conf s=node.fmz.com/123456 p=你的密码 n=server01 vv=true
  • 用-c指定配置文件;没有-c也没有给出通信地址时,如果启动目录下有robot.conf,会自动加载。
  • 同一项命令行和配置文件都给了时,以命令行为准。
  • 键区分大小写:I是出口IP,i是Docker镜像。
  • 配置文件路径和-f @文件都相对启动目录解析(在-w切换目录之前)。
  • 配置文件里有密码,记得设置只有自己可读(chmod 600 robot.conf)。

指定出口IP(-I)
服务器有多个IP地址,而交易所API KEY绑定了其中某个IP的白名单时,用-I指定出口IP,例如./robot -s node.fmz.com/123456 -I 192.168.1.100。指定后托管者与平台的连接、策略访问交易所的连接都从该地址发出。使用-i容器隔离时,容器的网络里可能没有这个地址,此时需要让容器使用宿主机网络。

Windows界面版没有IP设置,需要指定出口IP时请使用命令行版。界面版只接受-s、-p、-n三个启动参数,用于预填界面,同时给出-s和-p时自动启动。

每个实盘的数据都在托管者工作目录下的logs/storage/<实盘ID>/目录里(数据库<实盘ID>.db3、stdout.log、stderr.log等)。平台显示的实盘日志、收益、图表都是从运行该实盘的托管者上读取的。

把单个实盘迁移到另一台机器的托管者

  1. 停止该实盘。
  2. 把整个logs/storage/<实盘ID>/目录复制到新托管者工作目录下的相同位置,目录名保持为实盘ID。
  3. 在实盘配置中把托管者改为新托管者,再启动实盘。

这样实盘原有的日志、收益等数据不会因为换了机器而丢失。

整体迁移托管者

  1. 停止旧托管者上的实盘,再停止旧托管者。
  2. 把旧托管者工作目录下的整个logs目录复制到新机器的工作目录。
  3. 在新机器上启动托管者。

logs/docker.pid保存了托管者的身份,旧托管者已离线时,新机器上的托管者会沿用原来的托管者ID,实盘配置无需修改。不要让两台机器同时使用同一份logs目录运行托管者。

在托管者管理页面,托管者列表或托管者详情的操作项中可以开启托管者监控。开启后,托管者异常离线时,平台会向账号绑定的邮箱发送通知。

策略库页面保存当前账号下的所有策略,策略可以用多种编程语言或可视化方式编写。

  • 分组:策略和实盘一样可以分组管理,见分组。
  • 导入与导出:一个完整的策略除了源码,还包括参数、交互、描述、笔记、手册、模板引用等,迁移策略要导出、导入完整策略,见完整策略的导入与导出。
  • 分享与出租:生成「复制码」分享策略,生成「注册码」出租策略,见策略分享与出租。

迁移策略不能只复制源码:参数设计、交互设计、模板引用等都不在源码里。在策略编辑页面使用「导出策略」和「导入策略」可以完整地迁移一个策略。

策略导入导出截图

  • 导出策略
    导出为一个xml文件,所有编程语言的策略都一样。导出时可以勾选要包含的内容:策略名称、源码、笔记、描述、手册、模板引用、策略参数、交互控件、回测设置。

  • 导入策略
    在策略编辑页面点击「导入策略」,选择用「导出策略」得到的xml文件,再勾选要导入的内容。导入后点击「保存」保存策略。

在策略库页面,点击策略右侧的「操作项」按钮后,弹出菜单中包含分享和出租操作选项。

重要提示:创建和分发策略注册码时,请务必仔细确认是「注册码」还是「复制码」,以免误将策略泄露。

策略分享

  • 公开分享
    点击「分享」按钮后会弹出对话框,可以选择「公开分享」。策略将完整地分享到平台的策略广场,任何用户都可以复制该策略。

  • 内部分享
    点击「分享」按钮后会弹出对话框,可以选择「内部分享」。选择分享有效期、分享次数后会生成该策略的复制页面地址和复制码。可以分发给指定的FMZ平台用户,需要该策略的用户只需使用复制页面地址链接,登录复制页面后输入复制码即可获取该策略,获取后策略会自动出现在策略库中。

策略出租

  • 公开出售
    点击「出租」按钮后会弹出对话框,可以选择「公开出售」。策略即可申请上架(需要通过审核)。

  • 内部出售
    点击「出租」按钮后会弹出对话框,可以选择「内部出售」。选择使用天数、最大并发数、注册码数量后,系统会生成该策略的注册页面地址和注册码。您可以将其分发给指定的FMZ平台用户,需要该策略的用户只需访问注册页面地址链接,登录注册页面后输入注册码即可获取策略的使用权。策略也会出现在策略库中,但用户只有回测和实盘使用权限,无法查看策略源码等信息。并发实盘个数设置为0时表示不限制并发数量,允许无限制地创建实盘。

「实盘」区别于「回测」,指真正与交易所交互(获取行情、查询持仓、下单撤单等)的策略程序实例。连接交易所生产环境的是实盘,连接交易所模拟环境(很多交易所提供测试环境)的同样是实盘。

创建实盘
在实盘创建页面选择运行策略、托管主机和交易所后创建,需要事先准备好三样东西:

实盘按小时计费,账户余额不足时无法启动,见实盘计费与充值。

实盘监控
在实盘管理页面,运行中的实盘右侧操作栏可以点击「监控」开启实盘监控。开启后,实盘不是因手动操作而退出时,平台会向账号绑定的邮箱发送通知。

实盘数据库
以实盘ID123456为例,它的数据库文件位于所属托管者工作目录下的logs/storage/123456/123456.db3(SQLite格式),包含以下表:

  • chart:图表数据。
  • cfg:状态栏内容、图表配置等最新状态。
  • kvdb:_G()函数持久化保存的数据。
  • log:实盘日志。
  • profit:收益数据。

同一目录下还有策略进程的标准输出stdout.log和标准错误stderr.log。

本章内容

让他人查看、操作部分实盘可以使用子账号。

在「实盘」页面和「策略库」页面点击右侧的分组管理按钮,可以给实盘、策略分组管理,分组名称可以自定义。
例如给策略分组时,可以把模板类库分为一组、JavaScript语言的策略分为一组、测试用策略分为一组。

  • 策略分组
    策略分组

  • 实盘分组
    实盘分组

在发明者量化交易平台实盘页面的实盘列表中点击「公开」按钮即可公开展示当前行的实盘。

实盘围观目前支持两种方式:

  • 1、在发明者量化交易平台的实盘围观页面公开展示实盘。点击「公开」按钮后选择公开分享即可。
  • 2、创建实盘围观私有链接。
    点击「公开」按钮后选择内部分享,设置有效期后即可生成私有链接,用于访问该策略实盘的私有围观页面。

推送设置页面中可以开启消息推送功能。

推送设置

  • 移动端(App)
    开启移动端App推送后,实盘程序发出的推送消息将发送至发明者量化移动端App。
  • 邮箱
    开启邮箱推送需先验证邮箱,验证通过后即可接收实盘程序发出的推送消息。
  • WebHook
    开启WebHook推送后,可自定义推送地址,例如设置为:http://abc.com/push.php?data={body}。
    当实盘程序发出推送消息时,平台会向所设置的地址http://abc.com/push.php?data={body}发送一个请求(仅支持GET方法),推送的消息内容将替换到{body}位置。

策略中推送消息

  • JavaScript/TypeScript/Python/Rust语言
    在策略代码中,可使用Log()函数以及其它能在日志区域输出日志信息的函数,例如:exchange.CreateOrder()、exchange.CancelOrder()等。
    为这些函数传入一个附带参数"@"(即在必要参数之外再增加一个附带参数),例如:Log("This is a push message", "@"),即可将这条输出的日志信息进行推送,平台会根据「推送设置」进行消息推送。Rust语言中对应Log!宏,用法相同:Log!("This is a push message", "@");。
  • PINE语言/My语言
    在PINE语言/My语言策略所集成的「交易类库」参数中,可开启交易日志推送,触发交易动作后将自动进行推送。
  • Blockly可视化
    在「工具」一栏中选择消息推送模块,即可实现指定信息的推送。

消息推送存在频率限制,具体规则如下:在实盘的每个20秒周期内,仅保留并推送最后一条消息,其余消息将被过滤,不予推送。

实盘无法启动

  • 没有在线的托管者
    实盘所选的托管者离线时实盘无法启动。在托管者页面确认托管者在线,或换一个在线的托管者。
  • 账户余额不足
    启动实盘需要预付第一个小时的费用,余额不足时无法启动;运行中余额耗尽,实盘会被平台停止。充值后重新启动,见实盘计费与充值。
  • 租用的策略到期或并发数已满
    租用的策略到期后,使用它的实盘会被停止且无法再启动;达到租用的最多并发实盘数后,无法再启动新的实盘。
  • 密钥解密失败
    报错中包含secret key decrypt failed (wrong password)。原因是修改了发明者量化交易平台的账号密码,原先配置的交易所密钥无法再解密。处理方法:
    1. 在「交易所」管理页面重新填写交易所的密钥、密码等信息。
    2. 停止所有托管者,用新密码重新启动托管者。
  • 凭据文件读不到
    交易所配置中使用了file:///xxx.txt凭据文件,而实盘目录里没有该文件,报错中包含read key file;路径不合法时报key file path must be relative and cannot contain '..'或key file path escapes the robot directory。见本地凭据文件。

策略代码导致的错误

  • 静态语法错误

    编辑器中语法错误

    此类错误比较明显,通常在策略编辑页面就能看到错误标记,回测时也能发现。

  • 运行时错误
    最常见的是对函数返回值不做合法性判断就直接使用。

  • 过度占用内存
    在全局变量里保存过多无法被垃圾回收的内容,导致内存占用过大。

  • 未合理使用exchange.Go并发请求
    调用异步的exchange.Go后没有及时wait等待结果,导致并发任务数量过多。

  • 递归调用过深
    递归层数过多,超出调用栈大小。

其它报错

  • 接口业务错误、网络请求错误
    此类报错会显示相关的交易所对象名称、函数名称、错误消息和原因,本身不会导致实盘异常停止。它们通常是起因而不是直接原因,直接原因一般是没有判断接口返回值是否合法就直接使用而引发的程序异常。
  • interrupt错误
    程序正在执行某个操作(例如访问交易所接口)时,用户点击了实盘页面上的停止按钮,停止中断了当前操作而打印的日志。它没有影响,只是一条记录。

更多问题见常见问题汇总。