Files
AI-Trader/trade_client.py
2026-03-04 22:56:14 +08:00

311 lines
9.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
交易指令发送工具
供交易员快速发送交易指令
可由前端界面、命令行或其他系统调用
"""
import requests
import json
from typing import List, Dict
import sys
class TradeInstructionClient:
"""交易指令发送客户端"""
def __init__(self, server_url: str = "http://localhost:8000"):
self.server_url = server_url
self.session = requests.Session()
def send_buy_order(self, symbol: str, volume: float, price: float, sl: float, tp: float) -> Dict:
"""
发送买入订单
Args:
symbol: 交易品种 (e.g., "gold", "eurusd")
volume: 手数 (e.g., 0.01)
price: 买入执行价格 (e.g., 2030.00)
sl: 止损点 (e.g., 5000)
tp: 止盈点 (e.g., 5100)
Returns:
服务响应
"""
instruction = {
"symbol": symbol.lower(),
"action": "b",
"mount": volume,
"price": price,
"sl": sl,
"tp": tp
}
return self.send_instructions([instruction])
def send_sell_order(self, symbol: str, volume: float, price: float, sl: float, tp: float) -> Dict:
"""
发送卖出订单
Args:
symbol: 交易品种
volume: 手数
price: 卖出执行价格
sl: 止损点
tp: 止盈点
Returns:
服务响应
"""
instruction = {
"symbol": symbol.lower(),
"action": "s",
"mount": volume,
"price": price,
"sl": sl,
"tp": tp
}
return self.send_instructions([instruction])
def send_instructions(self, instructions: List[Dict]) -> Dict:
"""
发送多条交易指令
Args:
instructions: 交易指令列表
Returns:
服务响应
"""
try:
response = self.session.post(
f"{self.server_url}/send_trade_instructions",
json=instructions,
timeout=5
)
return response.json()
except Exception as e:
return {
"status": "error",
"message": str(e)
}
def get_pending_trades(self) -> Dict:
"""
获取待执行的交易指令
Returns:
待执行指令列表
"""
try:
response = self.session.get(
f"{self.server_url}/query_pending_trades",
timeout=5
)
return response.json()
except Exception as e:
return {
"status": "error",
"message": str(e)
}
def get_statistics(self, count: int = 10) -> Dict:
"""
获取统计数据
Args:
count: 获取最新N条数据
Returns:
统计数据列表
"""
try:
response = self.session.get(
f"{self.server_url}/query_statistics?count={count}",
timeout=5
)
return response.json()
except Exception as e:
return {
"status": "error",
"message": str(e)
}
def clear_trades(self, symbol: str = None) -> Dict:
"""
清空交易指令
Args:
symbol: 品种名称,不指定则清空所有
Returns:
服务响应
"""
try:
url = f"{self.server_url}/clear_trades"
if symbol:
url += f"?symbol={symbol}"
response = self.session.delete(url, timeout=5)
return response.json()
except Exception as e:
return {
"status": "error",
"message": str(e)
}
def health_check(self) -> bool:
"""
检查服务是否可用
Returns:
True 如果服务可用,False 否则
"""
try:
response = self.session.get(
f"{self.server_url}/health",
timeout=2
)
return response.status_code == 200
except:
return False
# ==================== 命令行工具 ====================
def main():
"""命令行界面"""
client = TradeInstructionClient()
print("=" * 60)
print("交易指令发送工具")
print("=" * 60)
# 检查服务
if not client.health_check():
print("错误: 无法连接到交易服务")
print("请确保服务已启动: python trading_server.py")
return
print("✓ 服务已连接\n")
while True:
print("\n请选择操作:")
print("1. 发送买入订单")
print("2. 发送卖出订单")
print("3. 查看待执行指令")
print("4. 查看统计数据")
print("5. 清空指令")
print("0. 退出")
choice = input("\n请输入选项 (0-5): ").strip()
if choice == "0":
print("再见!")
break
elif choice == "1":
symbol = input("品种 (e.g., gold): ").strip().lower()
try:
volume = float(input("手数 (e.g., 0.01): ").strip())
sl = float(input("止损点 (e.g., 5000): ").strip())
tp = float(input("止盈点 (e.g., 5100): ").strip())
result = client.send_buy_order(symbol, volume, sl, tp)
print(f"\n响应: {json.dumps(result, indent=2, ensure_ascii=False)}")
except ValueError:
print("输入格式错误")
elif choice == "2":
symbol = input("品种 (e.g., eurusd): ").strip().lower()
try:
volume = float(input("手数 (e.g., 0.02): ").strip())
sl = float(input("止损点 (e.g., 1.0950): ").strip())
tp = float(input("止盈点 (e.g., 1.0850): ").strip())
result = client.send_sell_order(symbol, volume, sl, tp)
print(f"\n响应: {json.dumps(result, indent=2, ensure_ascii=False)}")
except ValueError:
print("输入格式错误")
elif choice == "3":
result = client.get_pending_trades()
if "data" in result:
total = result.get("total", 0)
print(f"\n待执行指令总数: {total}")
for symbol, trades in result.get("data", {}).items():
print(f"\n{symbol}: {len(trades)} 条")
for i, trade in enumerate(trades, 1):
print(f" {i}. {trade['action'].upper()} {trade['mount']}手 SL:{trade['sl']} TP:{trade['tp']}")
else:
print(f"\n错误: {result.get('message', 'Unknown error')}")
elif choice == "4":
try:
count = int(input("获取最新N条 (默认10): ").strip() or "10")
result = client.get_statistics(count)
if "data" in result:
data = result.get("data", [])
print(f"\n{len(data)} 条统计数据:\n")
for i, stat in enumerate(data, 1):
print(f"{i}. 时间: {stat.get('timestamp')}")
print(f" TICK数: {stat.get('tickCount')}")
print(f" 价格: {stat.get('bidPrice')} / {stat.get('askPrice')}")
print(f" 余额: {stat.get('balance')}")
print(f" 权益: {stat.get('equity')}")
print(f" 预付款: {stat.get('marginLevel')}%")
print()
else:
print(f"\n错误: {result.get('message', 'Unknown error')}")
except ValueError:
print("输入格式错误")
elif choice == "5":
symbol = input("清空指定品种 (不指定则清空所有): ").strip().lower() or None
result = client.clear_trades(symbol)
print(f"\n响应: {json.dumps(result, indent=2, ensure_ascii=False)}")
else:
print("无效选项")
# ==================== 使用示例 ====================
def example_usage():
"""API使用示例"""
client = TradeInstructionClient()
# 示例 1: 发送单个订单
print("[示例 1] 发送黄金买入订单")
result = client.send_buy_order("gold", 0.01, 5000, 5100)
print(json.dumps(result, indent=2, ensure_ascii=False))
# 示例 2: 发送多个订单
print("\n[示例 2] 发送多个订单")
instructions = [
{"symbol": "gold", "action": "s", "mount": 0.02, "sl": 2035, "tp": 2025},
{"symbol": "eurusd", "action": "b", "mount": 0.05, "sl": 1.0900, "tp": 1.1000}
]
result = client.send_instructions(instructions)
print(json.dumps(result, indent=2, ensure_ascii=False))
# 示例 3: 查看待执行指令
print("\n[示例 3] 查看待执行指令")
result = client.get_pending_trades()
print(json.dumps(result, indent=2, ensure_ascii=False))
# 示例 4: 查看最新统计数据
print("\n[示例 4] 查看最新5条统计数据")
result = client.get_statistics(5)
print(json.dumps(result, indent=2, ensure_ascii=False))
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--example":
# 运行示例: python trade_client.py --example
example_usage()
else:
# 运行交互式工具
main()