Từ cảnh báo Pine đến lệnh Binance thực tế — nắm vững 3 cách, cài đặt đầy đủ và kiểm soát rủi ro để chiến lược chạy 24/7.
TradingView là cộng đồng biểu đồ và chiến lược lớn nhất thế giới. Khi viết Pine script và muốn tự động vào lệnh trên Binance, Webhook là cầu nối — TradingView POST một JSON đến URL chỉ định khi cảnh báo kích hoạt, server nhận và gọi API Binance để mua/bán.
Luồng: cảnh báo TradingView → URL Webhook (server riêng hoặc bên thứ ba) → API Binance → lệnh thực.
Ưu điểm: logic chiến lược trực quan, hệ sinh thái Pine phong phú. Nhược điểm: phải tự xử lý ký, kiểm soát rủi ro, kết nối lại; hoặc trả phí dùng nền tảng có sẵn.
| Phương án | Độ khó | Chi phí | Độ trễ | Phù hợp |
|---|---|---|---|---|
| Cầu nối VPS riêng | Trung-Cao | $5-10/mo | 500ms-1.5s | Người biết code, muốn kiểm soát |
| Bên thứ ba (3Commas v.v.) | Thấp | $15-50/mo | 800ms-2s | Người ngại vận hành |
| Binance API + script local | Thấp | Tiền điện | Phụ thuộc mạng local | Có PC luôn bật |
Service nhỏ Node/Python/Go trên VPS, URL public, ký và gọi Binance API khi nhận. Linh hoạt nhất, thêm logic rủi ro tùy ý.
3Commas, Cryptohopper, Wundertrading, Aleeert.com cấp sẵn URL Webhook, gắn API Binance vào là chạy. Dễ nhưng phí tháng + rủi ro nền tảng + API ủy thác.
Desktop client chạy được script ngoài, Python local gọi Binance. Không phí tháng nhưng PC phải luôn bật.
Chiến lược EMA crossover long-only Pine v5 đơn giản, dùng alert_message gửi 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"}')
Điểm chính:
alert_message phải là JSON hợp lệpassphrase là secret chung, chống đoán URL{{strategy.order.alert_message}}https://your-vps.com/tv-webhookDigitalOcean/Vultr/Hetzner $5/tháng 1 vCPU 1G đủ. Tokyo hoặc Singapore độ trễ thấp nhất đến Binance.
TradingView chỉ POST tới HTTPS. Dùng SSL miễn phí Cloudflare hoặc Caddy/Nginx + Let's Encrypt.
Express (Node) hoặc FastAPI (Python) endpoint POST, xác thực passphrase, gọi Binance.
pm2 hoặc systemd để tự khởi động lại sau crash, ghi log file.
Quản lý API → tạo key → chỉ bật spot/margin hoặc futures, KHÔNG bật rút tiền, whitelist IP VPS.
Click phải biểu đồ → Add alert → Webhook URL = https://your-vps.com/tv-webhook, Message = {{strategy.order.alert_message}}.
50-100 USDT BTC spot 3-5 ngày. Xác nhận mọi tín hiệu chuyển đúng lệnh trước khi scale.
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';
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, drawdown vượt ngưỡng tự pausebookTicker trước market, spread quá rộng thì hủyapt install ntpĐăng ký Binance mã BNAPP nhận hoàn phí trọn đời — chiến lược tần suất cao tiết kiệm nhiều hơn.
Đăng ký mã BNAPP nhận hoàn phí trọn đời