使用文档

本文档介绍如何将 TradingView Pine Script 策略通过 Waka Bot 连接到 MT5 自动下单,以及如何配置警报 Message、EA 参数和风控规则。

快速上手

从零到自动下单,完成以下 5 步即可:

  1. 注册账号

    前往 api.yunwaka.com/register,用邀请码注册后进入后台。

  2. 生成 EA 参数

    登录后台 → 点击「生成新 EA」→ 复制 InpServerBaseUrlInpEaIdInpEaToken 三个参数。

  3. 在 MT5 中加载 EA

    下载 TVMT5_ServerBridge.ex5,放入 MT5 的 MQL5/Experts/ 目录,在目标图表上加载,填入上一步的三个参数,允许实盘交易。

  4. 在 TradingView 创建警报

    在策略图表上右键 → 「添加警报」→ Webhook URL 填写后台提供的地址,Message 填写下方的完整 JSON 格式。

  5. 验证执行

    触发一次策略信号,在后台「信号日志」查看执行状态,确认 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 自动填入 当前图表品种名称,如 EURUSDXAUUSDNAS100
volume TradingView 自动填入 合约手数,对应策略 strategy.entry(qty=...) 中的 qty 值。若策略未指定则使用默认合约数。
price TradingView 自动填入 限价单价格。市价单时此字段为 0,系统自动忽略。
comment 可修改 固定值 MT5 订单备注,显示在持仓和历史记录中。可改为你的策略名称,最长 31 个字符。
time TradingView 自动填入 当前 K 线开盘时间(Unix 毫秒)。服务端用它自动构造幂等键(action-symbol-time),防止网络重试时重复下单,无需修改。

如何在 TradingView 填写警报

  1. 在已加载策略的图表上,点击「警报」图标(或按 Alt+A
  2. 「条件」选择你的策略名称,「触发」选择「订单成交」
  3. 展开「通知」→ 勾选「Webhook URL」→ 粘贴后台提供的 Webhook 地址
  4. 在「Message」文本框清空内容,粘贴上方完整 JSON
  5. 点击保存,警报即生效
⚠️

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 执行对应的买卖订单。

手数控制

手数由以下优先级决定(高优先级覆盖低优先级):

  1. EA 固定手数覆盖InpOverrideLot = true):无论信号带什么手数,一律使用 EA 设置的固定值。
  2. 信号 volume 字段:来自 {{strategy.order.contracts}},即策略 strategy.entry(qty=...) 的值。
  3. 策略默认合约数:策略头部 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 策略警报只会产生 buysell;其余类型可通过直接调用 Webhook 手动触发。

action 来源 说明
buy TradingView / 手动 市价开多,或反向平空后开多。
sell TradingView / 手动 市价开空,或反向平多后开空。
buy_limit TradingView / 手动 挂买入限价单,需同时传 price 字段。
sell_limit TradingView / 手动 挂卖出限价单,需同时传 price 字段。
close 手动 平指定品种的所有持仓,需传 symbol 字段。
close_all 手动 平该策略下的所有持仓,无需传 symbol。

常见问题

警报触发了但 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 不同图表上分别加载,策略之间完全隔离、互不干扰。