TradingView + OKX Webhook 量化交易 SOP

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
提醒: 建議先在模擬環境中測試完整流程,確認無誤後再進行實盤交易。量化交易涉及資金風險,請謹慎操作並做好風險控制。

留言

這個網誌中的熱門文章

MAC n8n 無法連上 http://localhost:5678/