从图表交易
broker 账户不只是读取您的账簿:打开 trading 后,图表会向它发送订单,从订单线上移动和撤销订单,并从持仓线上平仓。目前接受订单的 broker 有三个:
- Interactive Brokers (Gateway),通过您自己运行的 IB Gateway 或 TWS。即本页。
- Binance 和 Binance USDⓈ-M Futures,支持实盘账户及其测试环境(Spot Demo Mode、期货 testnet)。实盘账户在开启实盘交易后接受订单。
- Paper trading,由应用自身运行的模拟账户。见 模拟交易。
其他 broker 都会回答它们不接受来自 OpenTraderWorld 的订单,并保持 只读。
实验性
从图表交易是实验性功能:目前支持 Interactive Brokers、Binance 和 Binance USDⓈ-M Futures。它已在模拟交易场所和各 broker 自己的测试环境中经过大量测试,但仍可能存在缺陷。请在 broker 处核对每一笔订单,从小额开始,交易风险自负。
实盘账户
Interactive Brokers、Binance 和 Binance USDⓈ-M Futures 的等级为 E4:实盘账户在您为其开启实盘交易并设置好限额后接受订单。模拟账户和测试环境无需这些。
撤单永远不会被阻止,无论是哪个账户。
设置
1. Gateway
运行登录到模拟或实盘账户的 IB Gateway(或 TWS),并在其 API 设置中:
- 勾选 Enable ActiveX and Socket Clients;
- 取消勾选 Read-Only API,否则 IB 自己会拒绝所有订单;
- 使用 Docker Engine(Linux)时,取消勾选 Allow connections from localhost only,并把
172.28.53.10加入 Trusted IPs。
client id 由应用选择(3100 至 3115),因此多个会话可以共用一个 Gateway。
2. 账户
在 设置 → Brokers 中点击 添加账户,选择 Interactive Brokers (Gateway) 并填写:
| 设置 | 值 |
|---|---|
| Gateway host | 应用运行在 Docker 中时为 host.docker.internal,否则为 127.0.0.1 |
| Gateway port | 4002 模拟 Gateway,4001 实盘 Gateway,7497 模拟 TWS,7496 实盘 TWS |
无需提供密钥:Gateway 已经登录。测试连接 会检查它是否应答。
3. 交易开关
每个账户行在模块标签旁有一个 Trading 标签。它是刻意分开的:
- 所有模块 不包含它。读取账簿和发送订单是两种不同的权限。
- 每次打开都会要求输入密码。 关闭则不需要。
- 模拟交易账户是例外:不需要密码,因为不涉及真钱。
4. 图表
当三个条件同时满足时,图表才能交易:
- 在图表的 Broker book 中选择了一个账户;
- 该账户已打开交易;
- 图表数据来自同一个 broker:IBKR 账户交易的是由 Interactive Brokers 连接器提供数据的图表。
缺少其中一项时,订单面板会说明缺的是哪一项以及如何解决。期货需要 合约月份:连续合约会被拒绝,所以请打开 MNQZ6 而不是连续合约图表。
交易锁
订单的可选第二因素。开启交易锁后,登录后的第一笔订单会要求输入一次身份验证器中的代码,之后在该浏览器中所有交易账户都保持开放,直到退出登录。
- 它保护下单、改单和平仓。撤单,无论一笔还是全部,从不需要验证。
- 它覆盖除 模拟账户 以外的所有交易账户。
- 在设置好双因素认证后,于 设置 → 安全 → 交易锁 中开启。详情、错误代码和重置方法:账户安全。
交易锁开启时移除双因素认证会关闭所有账户的交易
在设置中或通过 disable-totp 移除双因素认证,会关闭交易锁。若交易锁原本开启,还会关闭 所有 账户的交易,包括模拟账户。之后请逐个账户重新打开。
发送订单
下单面板
订单面板的 Ticket 标签页发送一笔订单、一组括号订单或一个 OCO。它只提供账户的 broker 所接受的内容:broker 未声明的类型、有效期或选项不会显示(见各 broker 支持的内容)。
- 类型:
- Market、Limit、Stop、Stop limit。
- Trailing stop:按一定距离(百分比或价格数额)跟随市场、且绝不回退的 stop。broker 支持 Start at 时,可让它先等待某个价格再开始跟随。
- MIT(market if touched)和 LIT(limit if touched):stop 的镜像,当市场从 limit 一侧到达该价格时触发(低于市场的买入、高于市场的卖出),然后是市价单或限价单。
- OCO:同一方向的一个 limit 和一个 stop,先成交的一方撤销另一方。两个价格必须不同。
- 出场: Take profit 和 Stop loss 开关会添加相同数量的反向订单。打开时按入场价预填 0.5%(take profit)或 0.25%(stop loss)。Exits time in force 可选 GTC(默认)或 Day。broker 支持 reduce-only 订单时,出场单以 reduce-only 发送。OCO 不可用,不附带出场单的 broker 也不可用。在 Interactive Brokers,入场单会等到出场单被接受后才发出,因此括号订单整体发出。
- 有效期: Day、GTC、带未来日期和时间的 GTD、IOC、FOK(立即全部成交,否则撤销)。
- 价格: 可输入价格,或输入相对 bid、ask 或最新价的距离(出场单相对入场价),已知 tick 时以 tick 计。
- 规模: 以 单位 计(股、合约)、以资金的 金额 计(除以入场价值),或以到 stop loss 为止的 风险 资金计(除以入场价到 stop loss 的距离,必须开启 stop loss)。期货按其点值计算;合约和股数向下取整为整数单位。
- 选项,每项仅在 broker 支持时显示:
- Reduce only:只会缩减持仓,绝不开仓或反向。
- Post only:只挂在订单簿上的 limit;会被拒绝而不是立即成交。
- Iceberg:订单簿上显示的数量,其余隐藏。
- Trigger on:stop 或触发单所监视的价格(最新价、mark、bid/ask、mid)。
- Close position:触发时平掉整个持仓的 stop 或 MIT,无论其数量多少。
- Outside RTH:在常规交易时段之外也会触发和成交。
- Adaptive algo:broker 为了更好的价格来执行市价单或限价单,可选耐心、普通或紧急。
发出之前,应用会检查:
- 每个价格和数量都大于零,且每个选项都适合该类型(limit 上的 post-only、小于订单数量的 iceberg、小于 100 的 trailing 百分比);
- broker 接受所要求的类型、有效期和每个选项:不接受的会被拒绝,并指明是哪一项;
- 不在合约 tick 上的价格会被拒绝,并给出两个最接近的有效价格(
… is not on MNQZ6's 0.25 tick: use … or …); - 该品种能在 broker 处解析。绝不猜测。
只要下单面板中有一条腿被拒绝,整个下单都会被撤销。
应用跟踪的订单
每笔订单在发送 之前 就以其自己的 id 存储,broker 的回复也随之存储。因此:
- 每个账户的订单 id 永远只发送一次。 图表为每笔订单分配新 id;重新发送的下单(比如在说明保证金之后)会使用新 id。已用过的 id 会被拒绝,重启后也一样。
- 没有回复不等于被拒绝。 broker 未及时确认的订单(Gateway 为 10 秒)会按其 id 到 broker 处查找。若仍找不到,则标记为 未知,并且 绝不重发:该品种上的新订单会等待,直到查询给出结论。若 5 分钟后仍未解决,您会收到通知(图表通知渠道),提醒您到 broker 处检查该订单。
- broker 从未收到的订单(多次查询后仍找不到)会等待您处理。Orders 标签页会显示 broker 从未收到这笔订单,并提供 重新发送(以新 id 发送,经过新下单的所有检查)和 忽略(不发送任何内容)。您也会收到通知。
- 重启不会遗忘任何东西。 应用停止前刚发出的订单会在启动时查找,应用自己关联的订单(Binance USDⓈ-M 括号订单)会被接续。
随后应用会把自己的视图与 broker 的比对:启动几秒后,并按周期进行(有订单在外时每分钟一次,否则每 10 分钟一次,实时流报告漏掉事件时立即进行)。以 broker 为准:无人查看期间已成交或已撤销的订单会采用 broker 的状态,在别处(TWS、交易所网站)下的订单会被标记为外部订单。持仓发生变化却没有成交可解释的情况称为 漂移:它会写入审计日志并发出通知。
各 broker 支持的内容
| Interactive Brokers | Binance 现货 | Binance USDⓈ-M | Paper | |
|---|---|---|---|---|
| 类型 | 全部 | 全部 | 全部 | 全部 |
| 有效期 | Day、GTC、GTD、IOC、FOK | GTC、IOC、FOK | GTC、GTD、IOC、FOK | Day、GTC、GTD、IOC、FOK |
| 出场、OCO | 由 IB 关联 | 订单列表(OTO、OTOCO、OCO) | 由应用关联 | 由应用关联 |
| Trailing stop | 数额或 %,从市场价起 | %,步长 0.01%,起始价 | %(0.1 到 20),起始价 | 数额或 %,起始价 |
| Reduce only | 是 | 是 | ||
| Post only | 是(limit maker) | 是(GTX) | 是 | |
| Iceberg | 是,整数单位 | 是,GTC limit | ||
| Trigger on | 最新价、bid/ask、mid | 最新价、mark | ||
| Close position | 是 | |||
| Outside RTH | 是 | |||
| Adaptive algo | 是 |
- Binance 现货 对 limit 入场单会扣住出场单(OTO、OTOCO),对 market 入场单则在其成交后才下出场单;stop 入场单不带出场单。OCO 的 limit 一半以 limit maker 发出。卖出的出场单数量等于所买数量:手续费若以该币种本身扣除,会少于该数量,Binance 便会拒绝该出场单。
- Binance USDⓈ-M 自身不附带任何东西:应用把出场单作为 reduce-only 订单与其入场单一同发送,并通过每 5 秒读取一次来关联它们以及 OCO 对。重启后,应用根据其存储的订单接续这些关联。对冲模式会被遵循:每笔订单标明其多头或空头一侧,同一品种双向持有时一次平一侧。
- Interactive Brokers 的 trailing stop 从下单那一刻起就开始跟随(没有起始价),并以整数单位显示 iceberg。
Binance
- API 密钥。 下单需要已启用交易(现货为“Enable Spot & Margin Trading”,USDⓈ-M 为“Enable Futures”)且关闭提现的密钥。在实盘账户上,会话的第一笔订单之前,应用会读取密钥的权限,在交易未启用、提现已开启或密钥未限制为受信任 IP 时拒绝发送。随后它会在 Binance 的测试路由上对订单做一次试运行。
- 发送前的检查。 每笔订单都要符合 Binance 公布的该品种过滤器:tick、数量步长与限制、市价单数量、订单最小和最大金额、当前参考价周围的价格带(期货为 mark price),以及每个品种的挂单数量上限。被拒绝的订单会指明是哪个过滤器,以及可通过的最接近的值。不会替您更改任何内容。
- 下单频率。 当会超出账户的下单限制时,订单会被拒绝,并给出需要等待的秒数。订单绝不会被排队。
- 修改期货 stop。 Binance 无法原地修改条件单。应用先下修改后的 stop,再撤销旧的,因此始终有一个 stop 在生效。该订单会获得新 id(
….r1)。 - 应用消失时(USDⓈ-M)。 只要在某个期货品种上有挂单,应用就会让 Binance 的自动撤单倒计时保持就绪(120 秒,每 30 秒刷新一次)。若它停止刷新,Binance 会撤销该品种上的所有未成交订单,包括在别处下的订单。
- 持仓。 期货持仓显示在 Binance 设置的杠杆和保证金模式(全仓或逐仓)。应用只读取它们。
- 账户标签页(现货)。 现金为 USDT 余额;可用资金为其空闲部分。Equity 是 Binance 自己对现货钱包的 USDT 估值,仅限实盘(Spot Demo Mode 不提供)。
Interactive Brokers
- 合约不接受的数量(低于其最小值,或不在其数量步长上,例如 0.5 手期货)会在发送之前被拒绝,并给出有效的数量。
- 在订单成交之后才到达的撤单不算错误:订单显示为已成交。
- 当 IB 报告其丢失了服务器(1100)时,新订单和修改会被拒绝;撤单仍可通过。
- 在实盘账户上,每次 Gateway 连接的第一笔订单会先以 what-if 形式发送给 IB。IB 拒绝它,或表示账户无法承担,会以 IB 给出的理由拒绝该下单。
下单面板可以停靠在图表的下方、上方、左侧或右侧,或布局的行与列之间。拖动其内侧边缘调整大小(方向键也可以,Shift 步长更大);大小按停靠位置分别保存。
快捷栏
快捷买卖栏(工具栏开关)显示卖出、数量和买入,以及 bid 和 ask。单击会立即发送市价单,不需要确认。 可拖到任意位置,它会吸附到最近的边缘。
价格轴上的 +
将鼠标移到价格轴上并点击 +:菜单提供在该价格买入或卖出,根据价格位于市场哪一侧选择 limit 或 stop。订单以 Day 立即发出,或通过 在下单面板中打开… 打开。
图表上
- 挂单 显示为线。拖动线的标签即可移动订单(吸附到 tick);被拒绝的移动会把线放回原处。它的 ✕ 撤销该订单及其出场单。
- 双击 订单线,或使用 Orders 标签页,可在下单面板中打开它并修改价格、数量或有效期。方向和类型不能修改。在 TWS 中下的订单也会显示,若为 market、limit、stop 或 stop-limit 订单,可同样编辑。
- 持仓 显示在平均价位置,带一个 ✕ 用于按市价平仓。平仓会发送一笔市价单,数量为 broker 当前持有的数量,然后 撤销该持仓的出场单:其品种上、位于平仓一侧、被 broker 关联到入场单或标记为 reduce-only 的挂单。该品种上的其他订单保留。
- 用出场单保护(Positions 标签页中的盾牌)会在该持仓的图表上打开 Ticket,生成一个位于另一侧、数量为所持数量的 OCO:一个 take profit 和一个 stop loss,一方撤销另一方,broker 支持时为 reduce-only。该持仓必须在该账户的某个图表上处于打开状态。
- 括号订单: 鼠标悬停在括号订单中的某笔订单上时,会画出其连线,绿色虚线连到 take profit,红色虚线连到 stop loss。
- 成交: 开启 入场和出场标记 后,账户在该品种上的成交会以标记显示在其价格和 K 线上(买入朝上,卖出朝下),最多回溯 30 天。默认关闭。
图表设置 → Trading 控制它们的显示方式:
| 选项 | |
|---|---|
| 持仓 | 线上的盈亏(无、百分比、金额)、线(全宽、短线、仅价格轴标签)、显示方向、显示数量 |
| 订单 | 线、显示方向、显示数量 |
| 成交 | 入场和出场标记、买入标记和卖出标记的颜色 |
订单面板
在 Ticket 旁边,按 broker 筛选:
| 标签页 | 显示 |
|---|---|
| Positions | 代码、方向、数量、平均价、市价、P&L、开仓时间和入场费用(来自最近 7 天的成交),带平仓按钮 |
| Orders | 类型、数量、limit、stop 和状态,带编辑和撤销。其 全部撤销 撤销本浏览器中列出的订单 |
| Account | broker 提供的数字,见下文 |
| Logs | 发送给 broker 的最近 200 次调用,来自审计日志 |
账户数字
Equity、现金、浮动盈亏、已实现、初始保证金、维持保证金、可用资金、超额流动性、购买力、持仓价值,以账户基础货币计,Gateway 可访问的每个账户一行。Interactive Brokers 的数字来自 IB 本身(NetLiquidation、TotalCashValue、UnrealizedPnL、当日 RealizedPnL、InitMarginReq、MaintMarginReq、AvailableFunds、ExcessLiquidity、BuyingPower、GrossPositionValue)。broker 未提供的数字不会显示:IB 不提供佣金总额,因此该行不存在。
实时更新
订单、成交和持仓按 broker 的上报到达,页面上所有交易账户共用一个数据流:Interactive Brokers 用 Gateway 自己的消息,Binance 用 Binance 的 user data stream(现货为 WebSocket API,USDⓈ-M 为账户的 listen key,两者都使用账户已有的密钥)。对冲模式的期货持仓会整体重新读取,而不是原地更新。账簿还会每 30 秒重新读取一次,并在持仓变动一秒后读取。数据流中断时,页面改为每 4 秒读取一次账簿。断开的 Gateway 会在下一次调用时重新连接;其间挂单仍留在 IB。
风险限额与紧急开关
您自己设定的限额,在任何订单发出前检查,适用于每个交易账户(包括 paper)。每一项在您设置之前都是关闭的,在账户的 设置 → Brokers → 风险限额 中设置:
| 限额 | 拒绝 |
|---|---|
| 单笔订单上限(数量) | 超过该数量(单位数)的订单 |
| 单笔订单金额上限(账户货币) | 价值超过该金额的订单,以账户货币计(数量 × 价格 × 期货的点值) |
| 持仓上限(数量) | 会使该品种持仓超过该数量(单位数)的订单 |
| 持仓金额上限(账户货币) | 会使持仓价值超过该金额的订单,以账户货币计(持仓数量 × 价格 × 期货的点值) |
| 价格区间(%) | 偏离图表最新价超过该百分比的 limit 或 stop 订单 |
| 每分钟订单数 | 最近一分钟内超过该数量的订单 |
| 同时挂单数 | 超过该数量的活动订单 |
| 每周期亏损限额(账户货币) | 账户自周期开始(小时、日或周,见下文)亏损达到该金额后的任何订单:账户被暂停 |
| 重复订单窗口(秒) | 在该秒数内再次发送的相同订单(方向、类型、数量、价格),直到您确认 |
- 违反限额的订单会被拒绝,并注明限额与数值。订单绝不会被缩小以符合限额。
- 降低风险始终放行:reduce-only 订单、平仓,或只会减少持仓的订单,可通过所有限额和所有暂停。
- 修改限额需要输入您的密码。
暂停
暂停会拒绝新订单,直到结束;撤销以及减少持仓的订单仍可发出,期间无法修改活动订单(请改为撤销)。
- 紧急开关:设置 → Brokers 和图表订单面板中的按钮会撤销所有交易账户的全部活动订单(包括在其他地方下的订单,每次撤销都记入审计日志),然后暂停所有账户。它需要确认,从不要求密码。
- 亏损限额:账户达到亏损限额时会自行暂停(每次下单前以及在对账周期中检查),并向您发送通知。
- 持仓偏差:当持仓发生变动却没有成交可以解释(应用未看到的订单、被更正的成交)时,账户会暂停,直到您确认,并向您发送通知。请先到券商处核对账户;确认始终需要您的密码,无论下面选择哪种策略。
在 设置 → Brokers → 风险与紧急开关 中,您为所有账户选择暂停如何结束:
- 之后:下一小时、下一日或下一周(周一)的开始,按规则中的 时区;或 仅在解除时。在您保存之前时区为 UTC,表单默认填入浏览器的时区;
- 用我的密码提前解除:暂停可以从同一位置或图表横幅提前解除。只在解除时才结束的暂停,始终需要用密码解除。
保存规则需要输入您的密码。
亏损周期遵循同样的选择(当暂停仅在解除时结束,则为一天)。亏损按账户在周期开始时的 equity 计算,以 broker 给出的为准;周期内的存款或取款也计入其中。不提供 equity 的 broker(Binance Spot Demo Mode)无法受亏损限额约束:设置了亏损限额时,其订单会被拒绝。
实盘交易
每个 broker 的下单通道都有一个等级,显示在 设置 → Brokers 的账户上:E2(已在模拟交易场所测试)、E3(已在 broker 自己的测试环境中测试多日)、E4(已通过一次实盘演练和一笔最小规模的实盘订单)。低于 E4 时,交易真实资金的账户会被连接器本身拒绝。
达到 E4 后,实盘账户仍不接受任何订单,直到您在其上开启实盘交易:
- 需要已开启交易开关,并已设置账户的单笔订单规模或金额限额、持仓规模或金额限额和亏损限额;
- 是否开启交易锁由您决定。开启后,开启实盘交易以及每次登录后的第一笔订单都会要求输入身份验证器中的代码。未开启时,账户会显示提醒,其订单无需代码即可发出;
- 账户会显示等级、应用停止时 broker 是否会撤销您的订单(Binance USDⓈ-M:是;现货和 Interactive Brokers:否,订单继续有效)以及已设置哪些限额;
- 关闭时不需要任何验证;关闭交易也会将其关闭,之后需要重新开启。
测试环境、演示账户和模拟账户从不需要它。
审计日志与订单指标
每一次下单、修改、撤销、全部撤销和平仓都会写入 仅追加的审计日志:时间、账户、broker、操作、请求、broker 的回复或错误,以及延迟。数据库拒绝修改或删除任何一行。因交易关闭或锁定已关闭而在到达 broker 之前被拒绝的调用不会记录;其他任何拒绝都会记录。对账发现的内容(漏掉的成交或撤销、外部订单、回复丢失后才确定的订单、持仓漂移)也会记录,标为 reconcile,且不计入订单指标。
在 设置 → Brokers 中,每个交易账户显示其 订单指标(调用次数、已下单、被拒、延迟 p50 / p99、最后一笔订单)以及 撤销所有订单 按钮。与 紧急开关 不同,它只针对该账户,也不会暂停任何东西:
- 它会要求确认,然后在 broker 处撤销该账户的 所有挂单,包括在 OpenTraderWorld 之外下的订单。在 Interactive Brokers,这是 Gateway 各账户的所有订单,包括在 TWS 中手动下的订单;
- 它报告撤销了多少笔。在 Interactive Brokers,它会先最多等待 10 秒,直到没有挂单;
- 在交易关闭和交易锁未开时同样有效。