TradingView + OKX Webhook 量化交易 SOP
🔄 TradingView + OKX Webhook 量化交易 SOP
📊 系統架構流程
TradingView
策略信號
→
策略信號
Webhook
觸發
→
觸發
中間伺服器
接收處理
→
接收處理
OKX API
執行交易
執行交易
🛠️ 前置準備
1
OKX 帳戶設置
- 註冊OKX帳戶並完成KYC驗證
- 入金到交易帳戶
- 建立API Key(建議使用子帳戶)
重要: API權限設置為「交易」+「查看」,不要勾選「提現」權限
2
伺服器環境準備
- 雲端伺服器(AWS/GCP/阿里雲等)
- 固定IP位址
- Python 3.8+ 環境
- SSL憑證(HTTPS必須)
3
TradingView Pro 帳戶
- 升級至Pro版本(才有Webhook功能)
- 準備交易策略腳本
⚙️ 詳細實作步驟
1
安裝必要套件
pip install flask requests okx websocket-client python-dotenv
2
建立環境變數檔案 (.env)
# OKX API 設定
OKX_API_KEY=your_api_key_here
OKX_SECRET_KEY=your_secret_key_here
OKX_PASSPHRASE=your_passphrase_here
# 安全設定
WEBHOOK_SECRET=your_webhook_secret_key
SERVER_PORT=5000
# 交易設定
DEFAULT_ORDER_SIZE=0.001
MAX_DAILY_TRADES=50
3
建立主要伺服器程式 (webhook_server.py)
import os
import json
import hmac
import hashlib
import logging
from datetime import datetime
from flask import Flask, request, jsonify
from dotenv import load_dotenv
import okx.Trade as Trade
import okx.Account as Account
# 載入環境變數
load_dotenv()
app = Flask(__name__)
# 設定日誌
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# OKX API 設定
api_key = os.getenv('OKX_API_KEY')
secret_key = os.getenv('OKX_SECRET_KEY')
passphrase = os.getenv('OKX_PASSPHRASE')
# 初始化OKX客戶端
trade_api = Trade.TradeAPI(api_key, secret_key, passphrase, False, '0')
account_api = Account.AccountAPI(api_key, secret_key, passphrase, False, '0')
# 安全驗證函數
def verify_webhook(payload, signature):
secret = os.getenv('WEBHOOK_SECRET').encode('utf-8')
expected_signature = hmac.new(secret, payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(signature, expected_signature)
# 主要webhook接收端點
@app.route('/webhook', methods=['POST'])
def handle_tradingview_webhook():
try:
# 取得請求資料
payload = request.get_data()
signature = request.headers.get('X-Signature', '')
# 驗證簽名(可選)
if not verify_webhook(payload, signature):
logger.warning('Invalid webhook signature')
return jsonify({'error': 'Invalid signature'}), 401
# 解析JSON資料
data = json.loads(payload)
logger.info(f'Received webhook: {data}')
# 執行交易
result = execute_trade(data)
return jsonify({'status': 'success', 'result': result})
except Exception as e:
logger.error(f'Webhook處理錯誤: {str(e)}')
return jsonify({'error': str(e)}), 500
# 執行交易函數
def execute_trade(signal_data):
try:
# 從信號中提取交易資訊
symbol = signal_data.get('symbol', 'BTC-USDT')
action = signal_data.get('action', 'buy') # buy/sell
quantity = signal_data.get('quantity', os.getenv('DEFAULT_ORDER_SIZE'))
price = signal_data.get('price', None) # None表示市價單
# 構建訂單參數
order_params = {
'instId': symbol,
'tdMode': 'cash', # 現貨交易
'side': action,
'ordType': 'market' if price is None else 'limit',
'sz': str(quantity)
}
if price:
order_params['px'] = str(price)
# 發送訂單
result = trade_api.place_order(**order_params)
logger.info(f'訂單結果: {result}')
return result
except Exception as e:
logger.error(f'交易執行錯誤: {str(e)}')
raise
# 健康檢查端點
@app.route('/health', methods=['GET'])
def health_check():
return jsonify({'status': 'healthy', 'timestamp': datetime.now().isoformat()})
if __name__ == '__main__':
port = int(os.getenv('SERVER_PORT', 5000))
app.run(host='0.0.0.0', port=port, debug=False)
4
設定TradingView策略腳本
//@version=5
strategy("Webhook Strategy", overlay=true)
// 策略參數
rsi_length = input(14, "RSI長度")
rsi_overbought = input(70, "RSI超買線")
rsi_oversold = input(30, "RSI超賣線")
// 計算RSI
rsi = ta.rsi(close, rsi_length)
// 交易信號
long_condition = ta.crossover(rsi, rsi_oversold)
short_condition = ta.crossunder(rsi, rsi_overbought)
// 執行交易並發送Webhook
if long_condition
strategy.entry("Long", strategy.long)
alert('{"symbol": "BTC-USDT", "action": "buy", "quantity": "0.001", "price": "' + str.tostring(close) + '", "timestamp": "' + str.tostring(time) + '"}', alert.freq_once_per_bar)
if short_condition
strategy.entry("Short", strategy.short)
alert('{"symbol": "BTC-USDT", "action": "sell", "quantity": "0.001", "price": "' + str.tostring(close) + '", "timestamp": "' + str.tostring(time) + '"}', alert.freq_once_per_bar)
5
在TradingView設定Alert
- 在圖表上右鍵 → 「Add Alert」
- Condition選擇你的策略
- 在「Webhook URL」填入:https://your-server.com/webhook
- Message填入JSON格式的交易信號
| 設定項目 | 內容 |
|---|---|
| Webhook URL | https://your-domain.com/webhook |
| Message | {"symbol": "{{ticker}}", "action": "buy", "quantity": "0.001"} |
| Name | OKX Auto Trade Alert |
🚀 部署與測試
1
伺服器部署
# 1. 上傳程式到伺服器
scp -r webhook_server.py .env requirements.txt user@your-server:/home/user/trading-bot/
# 2. 安裝依賴
pip install -r requirements.txt
# 3. 使用screen或nohup運行
screen -S trading-bot
python webhook_server.py
# 4. 設定開機自動啟動(可選)
# 建立systemd service檔案
2
測試流程
- 健康檢查: 訪問 https://your-server.com/health
- 手動測試: 使用Postman發送測試請求
- TradingView測試: 在Alert中點擊「Test」按鈕
- 小額實測: 使用最小交易量進行實際測試
⚠️ 風險管理與注意事項
重要安全提醒
- 永遠不要將API密鑰暴露在公開代碼中
- 定期更換API密鑰
- 設定合理的交易限額
- 監控異常交易行為
- 備份重要配置和日誌
1
建立監控系統
# 簡單的監控腳本 (monitor.py)
import time
import requests
import smtplib
from email.mime.text import MIMEText
def check_server_health():
try:
response = requests.get('https://your-server.com/health', timeout=10)
return response.status_code == 200
except:
return False
def send_alert_email(message):
# 發送警報郵件的邏輯
pass
# 每分鐘檢查一次
while True:
if not check_server_health():
send_alert_email("Trading bot server is down!")
time.sleep(60)
🔧 常見問題排除
常見錯誤與解決方案
- 連接超時: 檢查伺服器網路和防火牆設定
- API錯誤: 確認API密鑰權限和格式
- Webhook未觸發: 檢查TradingView Alert設定和URL
- 訂單失敗: 檢查帳戶餘額和交易對設定
1
日誌檢查指令
# 查看即時日誌
tail -f /var/log/trading-bot.log
# 查看錯誤日誌
grep ERROR /var/log/trading-bot.log
# 檢查系統資源
htop
df -h
提醒: 建議先在模擬環境中測試完整流程,確認無誤後再進行實盤交易。量化交易涉及資金風險,請謹慎操作並做好風險控制。
留言
張貼留言