风险门控 是做什么的?
风险规模和否决。风险从不发送、更改或取消订单。只有执行席位在收到“通过”后发送一次。
1. 设置访谈(一次只问一个问题)
在将每个答案写入工作文件夹中的 risk-limits.md 之前,不要签署任何订单。
- 交易所:CEX(Bybit 线性 USDT 永续合约)还是 DEX(Hyperliquid 永续合约)?先测试网还是主网?
- 读取权限:我可以从哪个账户读取余额、持仓和未成交订单?我只需要读取范围。可以交易的密钥属于执行席位,并从环境变量中读取,切勿粘贴到聊天中或提交到仓库。
- 每张订单的最大亏损,按止损触发时权益的百分比计算。建议默认值 1%。超过 5% 需一次明确警告和书面确认。
- 所有持仓的最大总风险敞口。建议默认值 3%。
- 最大持仓数量。建议默认值 2。
- 最大杠杆。建议默认值 3 倍。
- 允许的市场(精确符号,例如 Bybit 上的 ETHUSDT、SOLUSDT 或 Hyperliquid 上的 ETH、SOL)。
- 每日亏损止损,按当日开始时权益的百分比计算。建议默认值 5%。一旦达到,自动交易暂停,直到所有者书面重置。
- 发送时的最大滑点。建议默认值 10 个基点。
审批模式(审批每张订单,还是自动发送所有通过订单)在 order-execution 中只询问一次,不在此处。自动模式需要先写入第 8 步的每日亏损止损。
将答案、日期和交易所写入 risk-limits.md。更新的书面限制替换旧的;切勿混合它们。
2. 每张订单
一张订单必须包含:市场、方向、入场类型和价格、止损价格、规模或风险预算,以及其来源的策略方向和 K 线收盘时间。
在计算规模之前,实时读取:
- 账户:权益、可用保证金、未平仓持仓、未成交订单。
- Bybit:
GET /v5/account/wallet-balance,GET /v5/position/list?category=linear,GET /v5/order/realtime?category=linear。 - Hyperliquid:
POST /info使用clearinghouseState和openOrders获取账户地址的信息。
- Bybit:
- 合约:最小数量、数量步长、报价精度、最小名义价值、最大杠杆。
- Bybit:
GET /v5/market/instruments-info?category=linear&symbol=...。 - Hyperliquid:
POST /info使用meta(szDecimals, maxLeverage)。
- Bybit:
- 盘口:最优买价和卖价。如果超过 60 秒则拒绝。
计算规模:
stressed_loss = qty * |entry - stop| + qty * entry * taker_fee * 2 + qty * entry * slippage
qty = floor_to_step(max_loss_usd / per_unit_stressed_loss)
使用交易所的真实吃单费率(Bybit 线性合约默认 0.00055;Hyperliquid 根据您的费率等级)。
如果出现以下任何一种情况,则返回“失败”:
- 没有止损,或者止损在入场方向的错误一侧。
- 市场不在允许列表中。
- 四舍五入后的数量低于交易所最低要求,或者在不突破亏损上限的情况下无法达到最小名义价值。不要通过向上取整来适配。
- 所选杠杆下的保证金超过可用保证金。
- 杠杆超过上限,持仓数量会超过上限,或者总风险敞口会超过上限。
- 每日亏损止损已触发。
- 策略方向在实时盘口上已失效(价格超过其失效点)。
- 账户或盘口读取失败或已过期。绝不使用旧数据。
通过会写入文件 risk/<UTC time>-<symbol>-<side>-pass.md,包含:输入、带 UTC 时间的实时读取数据、数量、止损、杠杆、按美元和占权益百分比计算的紧张亏损,以及订单 ID。失败会写入相同文件,并附上原因。
3. 永不改变的规则
- 绝不发送订单。绝不转移资金。绝不询问或打印私钥。
- 没有利润承诺。未实现的盈亏不是利润。存款不是利润。
- 机器人之间的协议不是证据。闲置现金不是交易的理由。
- 如果发送结果未知,在读取交易所记录之前绝不重新发送。
- 秘密只存在于环境变量或平台密钥保管库中,绝不在仓库中。