从Pine警报到币安实盘下单,掌握3种主流方案、完整搭建步骤与风控要点,让策略7×24小时自动运行。
TradingView是全球最大的图表与策略社区。当你在Pine脚本里写好策略,想让它自动到币安下单时,Webhook就是中间的桥梁——TradingView在策略触发时把一段JSON消息POST到指定URL,服务器收到后自动调用币安API执行买入或卖出。
整体链路:TradingView警报 → Webhook URL(你的服务器或第三方) → 币安API → 实盘订单。
这种方式的好处:策略逻辑可视化、Pine生态丰富、社区脚本多;缺点是需要自己处理签名、风控、断网重连等问题,或付费用现成平台。
| 方案 | 难度 | 成本 | 延迟 | 适合人群 |
|---|---|---|---|---|
| 自建VPS中转 | 中-高 | $5-10/月VPS | 500ms-1.5s | 会写代码、追求可控 |
| 第三方平台(3Commas等) | 低 | $15-50/月 | 800ms-2s | 不想运维、要图省事 |
| 币安API直连+本地脚本 | 低 | 电费 | 取决于本地网络 | 已有挂机电脑 |
在VPS上跑一个Node.js / Python / Go的小服务,监听一个公网URL,收到TradingView的JSON后签名调用币安API。最灵活,能加任意自定义风控逻辑。
3Commas、Cryptohopper、Wundertrading、Aleeert.com等。它们提供现成的TradingView Webhook URL,把币安API绑进去就能跑。优点开箱即用,缺点是月费、平台跑路风险、API权限托管。
TradingView桌面客户端有"播放声音并执行外部脚本"功能,可以触发本地Python脚本调用币安API。零月费但电脑必须常开,且没有公网webhook灵活。
下面是一个EMA金叉做多、死叉平仓的Pine v5最简策略,配合alert_message把JSON送出去:
//@version=5
strategy("EMA Cross Webhook", overlay=true)
fast = ta.ema(close, 12)
slow = ta.ema(close, 26)
longCond = ta.crossover(fast, slow)
shortCond = ta.crossunder(fast, slow)
if longCond
strategy.entry("L", strategy.long, alert_message='{"passphrase":"YOUR_SECRET","action":"buy","symbol":"BTCUSDT","qty":0.01,"type":"MARKET"}')
if shortCond
strategy.close("L", alert_message='{"passphrase":"YOUR_SECRET","action":"close","symbol":"BTCUSDT"}')
关键点:
alert_message 必须是合法JSON,方便服务器直接解析passphrase 字段是共享密钥,防止有人猜中你的URL乱发请求{{strategy.order.alert_message}}https://your-vps.com/tv-webhookDigitalOcean / Vultr / Hetzner $5/月 1核1G足够。地区选东京或新加坡,到币安服务器延迟最低。
TradingView只能向HTTPS地址发webhook。用Cloudflare免费SSL或Caddy/Nginx+Let's Encrypt。
用Express(Node)或FastAPI(Python)起一个POST端点,校验passphrase,再调用币安API。
用pm2或systemd让服务断电重启自动恢复,并把日志写到文件方便排查。
API管理→创建API→只勾"启用现货&杠杆交易"或"启用合约",不要勾提币,IP白名单填VPS公网IP。
策略图表上右键→添加警报→Webhook URL填 https://your-vps.com/tv-webhook → Message填 {{strategy.order.alert_message}} → 创建。
先用50-100 USDT在BTC现货跑3-5天,确认每条信号都正确转单后再上量。
import express from 'express';
import crypto from 'crypto';
import axios from 'axios';
const app = express();
app.use(express.json());
const KEY = process.env.BN_KEY;
const SECRET = process.env.BN_SECRET;
const PASSPHRASE = process.env.PASSPHRASE;
const BASE = 'https://fapi.binance.com'; // 合约;现货换成 https://api.binance.com
function sign(query){
return crypto.createHmac('sha256', SECRET).update(query).digest('hex');
}
app.post('/tv-webhook', async (req, res) => {
const { passphrase, symbol, action, qty, type='MARKET' } = req.body;
if (passphrase !== PASSPHRASE) return res.status(401).send('bad passphrase');
const side = action === 'buy' ? 'BUY' : 'SELL';
const ts = Date.now();
const query = `symbol=${symbol}&side=${side}&type=${type}&quantity=${qty}×tamp=${ts}`;
const url = `${BASE}/fapi/v1/order?${query}&signature=${sign(query)}`;
try{
const r = await axios.post(url, null, { headers:{'X-MBX-APIKEY':KEY}});
res.json(r.data);
}catch(e){
console.error(e.response?.data || e.message);
res.status(500).send('order failed');
}
});
app.listen(3000, () => console.log('listening 3000'));
/fapi/v2/account查浮亏,跌破阈值自动暂停服务bookTicker,价差超过预期直接放弃apt install ntp用推荐码 BNAPP 注册,享永久手续费返佣