先針對要測試的AI模型,給予 Prompt (制定其執行規則和範圍):
- 這是一份針對量化交易 AI 的提示詞(Prompt):
角色定義 (ROLE DEFINITION)
你是 Alpha-Q,一個由 Gemini 2.5 Pro 驅動的菁英自主量化交易智能體。你的首要目標不僅是追求「高回報」,而是「高風險調整後回報」(最大化夏普比率 Sharpe Ratio)。你正在參加 Alpha Arena 基準測試。
你的生存取決於嚴格的本金保全。
關鍵約束(鐵律) (CRITICAL CONSTRAINTS)
本金保全至上: 「錯失交易」優於「虧損」。如果訊號模稜兩可,行動必須是 HOLD(持倉觀望)。
費用意識: 每筆交易都會產生 0.05% 的吃單(Taker)費用 + 預估 0.02% 的滑點。你的預期利潤必須超過 0.2% 才能考慮建倉。
不要為了微薄利潤進行剝頭皮交易(Scalping);你會因此失血過多。
禁止「接刀」(No "Knife Catching"): 不要僅僅因為價格快速下跌(RSI 超賣)就買入。
你是趨勢追隨者,不是均值回歸的賭徒。在逆勢進場前,等待確認訊號(「更高的低點」或特定的 K 線反轉型態)。
強制止損: 每筆交易都必須設定計算好的止損(SL)位。
絕不在沒有出場計畫的情況下進場。
回撤限制: 如果當前總回撤(Drawdown)接近 8%,進入「生存模式」(將部位規模減少 50%)。
比賽會在回撤達 -10% 時將你淘汰。
決策框架(思維鏈) (DECISION FRAMEWORK)
在生成 JSON 輸出之前,你必須執行逐步推理過程:
步驟 1:市場體制識別 (Market Regime Identification)
分析輸入數據(OHLCV)。
確定當前體制:[上漲趨勢 / 下跌趨勢 / 震盪整理 / 高波動混亂]。
規則: 如果是「高波動混亂」或低成交量的「震盪整理」 -> 行動:HOLD。
步驟 2:訊號共振檢查(至少需要 2 個確認) (Signal Confluence Check)
不要依賴單一指標。
共振範例:「價格在 EMA 200 之上」(趨勢)且「RSI 背離」(動能)且「成交量激增」(驗證)。
如果共振計數 < 2 -> 行動:HOLD。
步驟 3:風險/回報計算 (Risk/Reward Calculation)
計算到失效點(止損 Stop Loss)的距離。
計算到目標點(止盈 Take Profit)的距離。
如果(回報 / 風險)< 1.5 -> 行動:HOLD。
輸出格式 (OUTPUT FORMAT)
你必須嚴格輸出僅一個 JSON 物件。不要包含任何對話填充詞。

2. python程式如下: (因我手上只有 Gemini API,故以Gemini 2.5 pro模型,binance交易所的測試虛擬幣環境為主)
本例python檔名: testbinance.py
import time
import json
import logging
import sys
import requests
import csv
import os
# Windows 編碼修正
sys.stdout.reconfigure(encoding='utf-8')
import ccxt
import pandas as pd
import ta
import google.generativeai as genai
# Windows 系統編碼修正 (防止控制台輸出亂碼)
sys.stdout.reconfigure(encoding='utf-8')
# ================= 配置區域 =================
# Line Messaging API 設定
LINE_CHANNEL_ACCESS_TOKEN = 'Your_LINE_CHANNEL_ACCESS_TOKEN'
LINE_USER_ID = 'Your_LINE_USER_ID'
SYMBOL = 'BTC/USDT'
AMOUNT_USDT = 100
CSV_FILENAME = 'trade_history.csv'
# ===========================================
# ==========================================
# CONFIG 設定
# ==========================================
CONFIG = {
"GEMINI_API_KEY": "Your_GEMINI_API_KEY",
"MODEL_NAME": "gemini-2.5-pro",
# ⚠️ 請務必填入從 https://testnet.binance.vision/ (GitHub登入) 申請的新鑰匙
"TESTNET_API_KEY": "Your_TESTNET_API_KEYZ",
"TESTNET_SECRET": "Your_TESTNET_SECRET",
"SYMBOL": "BTC/USDT",
"TIMEFRAME": "15m",
"CHECK_INTERVAL": 60,
}
# 日誌設定
logger = logging.getLogger("GeminiSpotBot")
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler("gemini_spot.log", encoding='utf-8')
file_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(message)s'))
logger.addHandler(file_handler)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(message)s'))
logger.addHandler(stream_handler)
# ==========================================
# Gemini 模型
# ==========================================
def init_gemini_model():
genai.configure(api_key=CONFIG["GEMINI_API_KEY"])
system_instruction = """
You are a Crypto Spot Trading Bot (Long Only).
RULES:
1. Market: Binance Spot Testnet.
2. Strategy: Buy Low, Sell High.
3. Action 'SELL' -> Sell BTC for USDT.
4. Action 'BUY' -> Buy BTC with USDT.
5. Output JSON only.
"""
model = genai.GenerativeModel(
model_name=CONFIG["MODEL_NAME"],
system_instruction=system_instruction,
generation_config={"temperature": 0.1, "response_mime_type": "application/json"}
)
return model
gemini_model = None
def ask_gemini(market_data, account_state):
global gemini_model
prompt = f"""
STATE: {account_state}
DATA: Price={market_data['price']}, EMA200={market_data['ema']}, RSI={market_data['rsi']:.1f}
TASK: Decide action (BUY / SELL / HOLD). Return JSON.
SCHEMA: {{"thought_process": "str", "action": "BUY/SELL/HOLD", "trade_amount_usdt": float}}
"""
try:
response = gemini_model.generate_content(prompt)
return json.loads(response.text)
except Exception as e:
logger.error(f"[API ERROR] Gemini: {e}")
return {"action": "HOLD"}
def send_line_message(msg):
"""
使用 Line Messaging API (Push Message) 發送通知
"""
if not LINE_CHANNEL_ACCESS_TOKEN or not LINE_USER_ID:
print("❌ Line Token 或 User ID 未設定,跳過通知")
return
url = 'https://api.line.me/v2/bot/message/push'
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {LINE_CHANNEL_ACCESS_TOKEN}'
}
data = {
'to': LINE_USER_ID,
'messages': [
{
'type': 'text',
'text': msg
}
]
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code != 200:
print(f"❌ Line 通知發送失敗: {response.text}")
else:
print("✅ Line 通知發送成功")
except Exception as e:
print(f"❌ Line 請求錯誤: {e}")
# ==========================================
# 現貨執行引擎 (Spot Execution Engine)
# ==========================================
class SpotExecutionEngine:
def __init__(self, api_key, secret, symbol):
self.symbol = symbol
# 初始化
self.exchange = ccxt.binance({
'apiKey': api_key,
'secret': secret,
'enableRateLimit': True,
'options': {
'defaultType': 'spot',
'adjustForTimeDifference': True
}
})
# 強制指定現貨測試網 URL (這是正確的,不要改)
self.exchange.urls['api']['public'] = 'https://testnet.binance.vision/api/v3'
self.exchange.urls['api']['private'] = 'https://testnet.binance.vision/api/v3'
# === 開機前自我檢查 ===
try:
self.exchange.set_sandbox_mode(True)
print("正在驗證 API Key...")
self.exchange.load_markets()
bal = self.exchange.fetch_balance()
usdt = bal.get('USDT', {}).get('free', 0)
print(f"✅ 驗證成功!帳戶 USDT 餘額: {usdt}")
print("提示: 如果餘額是 0,您可以去 testnet.binance.vision 下方的 Faucet 領取測試幣。")
self.valid = True
except Exception as e:
print("\n" + "="*40)
print("❌ 嚴重錯誤:API Key 驗證失敗")
print(f"錯誤代碼: {e}")
print("="*40)
print("可能原因:")
print("1. 您使用的是【合約 Futures】的 Key,但此程式連線的是【現貨 Spot】。")
print("2. 您使用的是正式網的 Key。")
print("解決方法:")
print("請去 https://testnet.binance.vision/ 用 GitHub 登入申請新 Key。")
print("="*40 + "\n")
self.valid = False
def get_state_str(self):
try:
bal = self.exchange.fetch_balance()
usdt_free = bal.get('USDT', {}).get('free', 0)
base_currency = self.symbol.split('/')[0]
base_free = bal.get(base_currency, {}).get('free', 0)
has_position = base_free > 0.0001
if has_position:
return f"Status: HOLDING {base_currency}. Amt: {base_free:.5f}. Cash: {usdt_free:.2f}"
return f"Status: CASH ONLY. USDT: {usdt_free:.2f}"
except Exception:
return "Error getting state"
def execute(self, decision, current_price):
action = decision.get('action')
bal = self.exchange.fetch_balance()
usdt_free = bal.get('USDT', {}).get('free', 0)
base_currency = self.symbol.split('/')[0]
base_free = bal.get(base_currency, {}).get('free', 0)
if action == "BUY":
if usdt_free < 10:
logger.info("USDT 不足 < 10")
return
amount_usdt = float(decision.get('trade_amount_usdt', usdt_free * 0.95))
if amount_usdt > usdt_free: amount_usdt = usdt_free
amount = amount_usdt / current_price
amount = self.exchange.amount_to_precision(self.symbol, amount)
try:
self.exchange.create_order(self.symbol, 'market', 'buy', amount)
logger.info(f"🚀 [買入] {amount} {base_currency}")
send_line_message(f"🚀 機器人啟動成功\n交易對 買入: {self.symbol}\n餘額: {amount} USDT ")
except Exception as e:
logger.error(f"下單失敗: {e}")
elif action == "SELL":
if base_free * current_price < 10:
logger.info("資產不足 < 10 USD")
return
amount = self.exchange.amount_to_precision(self.symbol, base_free)
try:
self.exchange.create_order(self.symbol, 'market', 'sell', amount)
logger.info(f"💰 [賣出] {amount} {base_currency}")
send_line_message(f"🚀 機器人啟動成功\n交易對 賣出: {self.symbol}\n餘額: {amount} USDT ")
except Exception as e:
logger.error(f"下單失敗: {e}")
# ==========================================
# 數據層
# ==========================================
class SpotMarketDataProvider:
def __init__(self, symbol, timeframe):
self.symbol = symbol
self.timeframe = timeframe
self.exchange = ccxt.binance({'options': {'defaultType': 'spot'}})
self.exchange.urls['api']['public'] = 'https://testnet.binance.vision/api/v3'
self.exchange.urls['api']['private'] = 'https://testnet.binance.vision/api/v3'
def get_snapshot(self):
try:
ohlcv = self.exchange.fetch_ohlcv(self.symbol, self.timeframe, limit=200)
df = pd.DataFrame(ohlcv, columns=['ts', 'open', 'high', 'low', 'close', 'vol'])
df['ema_200'] = ta.trend.ema_indicator(df['close'], window=200)
df['rsi'] = ta.momentum.rsi(df['close'], window=14)
df = df.dropna()
if df.empty: return None
curr = df.iloc[-1]
return {"price": curr['close'], "ema": curr['ema_200'], "rsi": curr['rsi']}
except Exception as e:
logger.error(f"數據錯誤: {e}")
return None
# ==========================================
# 主程式
# ==========================================
def main():
logger.info("=== Alpha-Gemini (Spot Final) Started ===")
try:
global gemini_model
gemini_model = init_gemini_model()
except Exception as e:
logger.error(f"Gemini 初始化失敗: {e}")
return
# 初始化引擎
engine = SpotExecutionEngine(CONFIG['TESTNET_API_KEY'], CONFIG['TESTNET_SECRET'], CONFIG['SYMBOL'])
# 如果 Key 驗證失敗,直接停止程式,不要空轉
if not engine.valid:
print("程式已停止:請更換正確的 API Key。")
return
provider = SpotMarketDataProvider(CONFIG['SYMBOL'], CONFIG['TIMEFRAME'])
while True:
try:
data = provider.get_snapshot()
if not data:
time.sleep(10)
continue
state = engine.get_state_str()
logger.info(f"Price: {data['price']} | {state}")
decision = ask_gemini(data, state)
if decision.get('action') != "HOLD":
logger.info(f"AI Decision: {decision.get('action')} | {decision.get('thought_process')}")
engine.execute(decision, data['price'])
else:
if int(time.time()) % 300 < 10:
logger.info("Holding...")
time.sleep(CONFIG['CHECK_INTERVAL'])
except KeyboardInterrupt:
break
except Exception as e:
logger.error(f"Loop Error: {e}")
time.sleep(10)
if __name__ == "__main__":
main()
dos command 或 Shell command:
python testbinance.py

這段程式碼是一個 AI 加密貨幣自動交易機器人。
簡單來說,它結合了 Google Gemini AI(大腦) 和 Binance 交易所(手腳),在 Binance 現貨測試網(Spot Testnet) 上進行自動買賣比特幣(BTC)。
以下是它具體執行的三個核心步驟與功能解析:
1. 觀察市場 (Market Data Layer)
機器人每隔 60 秒會透過 SpotMarketDataProvider 類別做以下事情:
- 獲取數據: 從 Binance 抓取最新的 BTC/USDT K線圖(15分鐘線)。
- 計算指標: 使用
ta庫計算兩個關鍵技術指標:

EMA 200 (指數移動平均線): 用來判斷長期趨勢(價格在線之上為牛市,之下為熊市)。
圖源:Shutterstock

RSI (相對強弱指標): 用來判斷是否超買或超賣。
圖源: Shutterstock
- 整理資訊: 將當前價格、趨勢狀態和 RSI 數值打包,準備餵給 AI。
2. AI 決策 (The Brain - Gemini)
這是程式的核心。它將整理好的市場數據和當前的帳戶餘額(有沒有持倉、剩下多少錢)發送給 Google Gemini AI。
- 角色設定: 告訴 AI 它是一個「只做多(Long Only)」的現貨交易員。
- 策略邏輯: 要求 AI 根據數據判斷:
- BUY (買入): 當價格低且趨勢好時,建議買入。
- SELL (賣出): 當有獲利或趨勢反轉時,建議賣出變現。
- HOLD (觀望): 市場不明朗時不動。
- 輸出格式: 強制 AI 回傳 JSON 格式,方便程式讀取(包含決策動作、原因、建議金額)。
3. 執行交易 (Execution Layer)
收到 AI 的 JSON 指令後,SpotExecutionEngine 類別會負責執行:
- 安全檢查:
- 程式啟動時會先自我檢查 API Key 是否有效,並且確認連線的是「測試網」而非「正式網」,以免誤用真錢。
- 下單前檢查餘額是否足夠(至少 10 USDT)。
- 下單操作:
- 如果 AI 喊 BUY:將 USDT 換成 BTC。
- 如果 AI 喊 SELL:將手上的 BTC 全部賣成 USDT。
- 日誌記錄: 將所有的決策、錯誤和交易結果寫入
gemini_spot.log檔案,方便事後查詢。
總結
這是一個 「趨勢跟蹤 + AI 輔助判斷」 的自動交易系統。 它不會使用您的真實資金(因為強制連線到 Testnet),是一個用來測試 AI 交易策略是否有效的實驗性工具。
程式執行流程圖:
- 啟動 -> 2. 檢查 API Key -> 3. 抓取 K 線數據 -> 4. 計算 EMA/RSI -> 5. 詢問 Gemini AI -> 6. AI 回傳 JSON -> 7. Binance 下單 (買/賣) -> 8. 等待 60 秒 -> (回到步驟 3)
















