使用文档
本文档介绍如何将 TradingView Pine Script 策略通过 Waka Bot 连接到 MT5 自动下单,以及如何配置警报 Message、EA 参数和风控规则。
快速上手
从零到自动下单,完成以下 5 步即可:
-
注册账号
前往 api.yunwaka.com/register,用邀请码注册后进入后台。
-
生成 EA 参数
登录后台 → 点击「生成新 EA」→ 复制
InpServerBaseUrl、InpEaId、InpEaToken三个参数。 -
在 MT5 中加载 EA
下载
TVMT5_ServerBridge.ex5,放入 MT5 的MQL5/Experts/目录,在目标图表上加载,填入上一步的三个参数,允许实盘交易。 -
在 TradingView 创建警报
在策略图表上右键 → 「添加警报」→ Webhook URL 填写后台提供的地址,Message 填写下方的完整 JSON 格式。
-
验证执行
触发一次策略信号,在后台「信号日志」查看执行状态,确认 MT5 已收到订单。
MT5 终端不需要 24 小时开机。EA 会在 MT5 运行时持续轮询,MT5 关闭期间信号会在队列中等待,重新连接后自动补执行(队列有效期内)。
警报 Message 格式
在 TradingView 创建策略警报时,将以下 JSON 粘贴到「Message」输入框,TradingView 会在警报触发时自动替换 {{ }} 中的占位符。
{
"action": "{{strategy.order.action}}",
"market_position": "{{strategy.market_position}}",
"prev_market_position": "{{strategy.prev_market_position}}",
"symbol": "{{ticker}}",
"volume": "{{strategy.order.contracts}}",
"price": "{{strategy.order.price}}",
"comment": "TVMT5_AUTO",
"time": "{{time}}"
}
不要修改 {{ }} 内的变量名——它们是 TradingView 内置变量,系统自动填充。你只能修改 "comment" 等固定字段的值。
字段说明
| 字段 | 来源 | 说明 |
|---|---|---|
| action | TradingView 自动填入 | 订单方向。策略开多时为 buy,开空为 sell。关闭多单也会发 sell,系统根据 market_position 区分。 |
| market_position | TradingView 自动填入 | 执行本次订单后的持仓方向:long(持多)/ short(持空)/ flat(空仓)。 |
| prev_market_position | TradingView 自动填入 | 执行本次订单前的持仓方向。配合 market_position 可判断是否为反向开仓(如 short → long)。 |
| symbol | TradingView 自动填入 | 当前图表品种名称,如 EURUSD、XAUUSD、NAS100。 |
| volume | TradingView 自动填入 | 合约手数,对应策略 strategy.entry(qty=...) 中的 qty 值。若策略未指定则使用默认合约数。 |
| price | TradingView 自动填入 | 限价单价格。市价单时此字段为 0,系统自动忽略。 |
| comment 可修改 | 固定值 | MT5 订单备注,显示在持仓和历史记录中。可改为你的策略名称,最长 31 个字符。 |
| time | TradingView 自动填入 | 当前 K 线开盘时间(Unix 毫秒)。服务端用它自动构造幂等键(action-symbol-time),防止网络重试时重复下单,无需修改。 |
如何在 TradingView 填写警报
- 在已加载策略的图表上,点击「警报」图标(或按
Alt+A) - 「条件」选择你的策略名称,「触发」选择「订单成交」
- 展开「通知」→ 勾选「Webhook URL」→ 粘贴后台提供的 Webhook 地址
- 在「Message」文本框清空内容,粘贴上方完整 JSON
- 点击保存,警报即生效
TradingView 免费账户无法使用 Webhook。需要 Essential 及以上订阅方可发送 Webhook 通知。
Pine Script 基础用法
绝大多数策略不需要任何改动,只要警报 Message 使用上方的 JSON 模板即可。系统通过 {{strategy.order.action}} 自动识别开多/开空/平仓。
一个最简单的均线交叉策略示例:
//@version=5
strategy("MA Cross", overlay=true, default_qty_type=strategy.fixed, default_qty_value=0.1)
fast = ta.ema(close, 9)
slow = ta.ema(close, 21)
if ta.crossover(fast, slow)
strategy.entry("Long", strategy.long)
if ta.crossunder(fast, slow)
strategy.entry("Short", strategy.short)
为上方策略设置警报,选择「订单成交」触发,粘贴标准 JSON Message,即可自动在 MT5 执行对应的买卖订单。
手数控制
手数由以下优先级决定(高优先级覆盖低优先级):
- EA 固定手数覆盖(
InpOverrideLot = true):无论信号带什么手数,一律使用 EA 设置的固定值。 - 信号 volume 字段:来自
{{strategy.order.contracts}},即策略strategy.entry(qty=...)的值。 - 策略默认合约数:策略头部
default_qty_value参数,未显式传 qty 时使用。
方式一:在 Pine Script 中指定手数
// 每次固定 0.1 手
strategy.entry("Long", strategy.long, qty=0.1)
// 根据账户净值动态计算(以 1% 风险为例)
risk_pct = 0.01
stop_dist = math.abs(close - ta.lowest(low, 20))
lot_size = math.round(strategy.equity * risk_pct / (stop_dist * 100000) * 100) / 100
strategy.entry("Long", strategy.long, qty=lot_size)
方式二:在 EA 中统一覆盖手数
在 MT5 EA 设置中开启 InpOverrideLot = true,填写 InpFixedLot,则所有信号统一使用此手数,策略不需要传手数。适合固定仓位的简单策略。
常见策略示例
开多单 buy
strategy.entry("Long", strategy.long, qty=0.1)
// → action: "buy", market_position: "long"
开空单 sell
strategy.entry("Short", strategy.short, qty=0.1)
// → action: "sell", market_position: "short"
平多单(做空反转)
// 平掉多单,同时开空——MT5 收到 sell 指令
strategy.entry("Short", strategy.short, qty=0.1)
// → action: "sell", prev_market_position: "long", market_position: "short"
只平仓、不反向开仓
// 平多,不开空
strategy.close("Long")
// → action: "sell", prev_market_position: "long", market_position: "flat"
// 平空,不开多
strategy.close("Short")
// → action: "buy", prev_market_position: "short", market_position: "flat"
系统通过 market_position 字段识别是否为纯平仓操作(flat),不会在 MT5 端开反向仓。无需改写 JSON,警报模板已包含此字段。
自定义订单备注
修改 Message JSON 中的 "comment" 字段值即可,不影响其他字段:
{
"action": "{{strategy.order.action}}",
"market_position": "{{strategy.market_position}}",
"prev_market_position": "{{strategy.prev_market_position}}",
"symbol": "{{ticker}}",
"volume": "{{strategy.order.contracts}}",
"price": "{{strategy.order.price}}",
"comment": "MA_Cross_v2",
"time": "{{time}}"
}
EA 参数说明
| 参数 | 说明 |
|---|---|
| InpServerBaseUrl | Waka Bot 云端地址,固定填写 https://api.yunwaka.com,不要修改。 |
| InpEaId | EA 唯一标识符,从后台「生成新 EA」处获取,格式如 ea_xxxxxxxxxxxxxxxx。 |
| InpEaToken | EA 鉴权 Token,与 InpEaId 配对使用,请妥善保管,勿外泄。 |
| InpPollIntervalMs | 轮询间隔(毫秒),默认 500ms。降低可减少延迟,但会增加请求频次。 |
| InpOverrideLot | 是否启用固定手数覆盖。true 时忽略信号中的 volume,统一使用 InpFixedLot。 |
| InpFixedLot | 固定下单手数,仅在 InpOverrideLot = true 时生效,默认 0.01。 |
每个 EA 实例(InpEaId)对应后台一组参数,不要在多个 MT5 账户上同时运行同一组参数,否则任务会被随机分发到两个 EA,导致执行混乱。
风控设置
在后台「策略风控」页面可以为每个策略独立配置以下限制,超出限制的信号会被自动拦截,不会到达 MT5。
| 设置项 | 说明 |
|---|---|
| 最大手数 | 单笔信号的最大 volume 值。设为 0 表示不限制。超出时信号被拦截,不下单。 |
| 每日信号上限 | 每自然日内最多处理的信号条数。设为 0 表示不限制。适合防止策略失控刷单。 |
| 允许品种 | 白名单品种列表(如 EURUSD,XAUUSD)。留空表示不限制。不在白名单内的品种信号直接拦截。 |
| 启用/暂停 | 一键暂停该策略的所有信号,不删除配置,随时可恢复。 |
action 值一览
系统支持以下 action 值。TradingView 策略警报只会产生 buy 和 sell;其余类型可通过直接调用 Webhook 手动触发。
| action | 来源 | 说明 |
|---|---|---|
| buy | TradingView / 手动 | 市价开多,或反向平空后开多。 |
| sell | TradingView / 手动 | 市价开空,或反向平多后开空。 |
| buy_limit | TradingView / 手动 | 挂买入限价单,需同时传 price 字段。 |
| sell_limit | TradingView / 手动 | 挂卖出限价单,需同时传 price 字段。 |
| close | 手动 | 平指定品种的所有持仓,需传 symbol 字段。 |
| close_all | 手动 | 平该策略下的所有持仓,无需传 symbol。 |
常见问题
警报触发了但 MT5 没有下单?
- 确认 MT5 终端处于运行状态,且 EA 已加载并显示笑脸图标(表示实盘已允许)。
- 在后台「信号日志」查看该信号的状态和错误原因,常见原因:品种被风控拦截、EA Token 不匹配、MT5 连接断开。
- 确认 MT5 中该品种允许自动交易(右键品种 → 属性 → 交易)。
Message 里的手数和 MT5 下的手数不一致?
检查 EA 参数 InpOverrideLot 是否为 true。若启用了固定手数覆盖,EA 会忽略信号中的 volume,使用 InpFixedLot 值。
收到重复信号导致重复下单?
系统内置幂等键防护:相同 idempotency_key 的信号只会执行一次。若仍有重复,检查 Pine Script 是否在同一根 K 线发出多次警报(calc_on_every_tick = true 容易触发此问题)。
如何测试 Webhook 是否连通?
curl -X POST "https://api.yunwaka.com/webhook/<你的strategy_id>?secret=<你的secret>" \
-H "Content-Type: application/json" \
-d '{
"action": "buy",
"symbol": "EURUSD",
"volume": "0.01",
"comment": "test",
"idempotency_key": "manual-test-001"
}'
返回 {"ok": true, ...} 表示连通正常。Webhook URL 和 secret 从后台「我的后台」EA 参数卡片中获取。
多个策略能同时运行吗?
可以。每次在后台「生成新 EA」都会产生一组独立的参数(InpEaId + InpEaToken + Webhook URL),在 MT5 不同图表上分别加载,策略之间完全隔离、互不干扰。