Files
Hermes-Skills/trading/okx-auto-position/scripts/format_signal.py
T
Hermes Skills Manager 6770bc9b9d Initial commit: Hermes Agent skills collection
- Trading skills (OKX, dividend, lottery, quantitative)
- Creative skills (ASCII art, diagrams, video)
- Development skills (GitHub, debugging, TDD)
- Research skills (arXiv, blog monitoring)
- Productivity skills (email, documents, notes)
- MCP integration skills
- Custom user skills
2026-07-05 02:31:15 -04:00

109 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
格式化交易信号推送消息。
用法: python3 format_signal.py --symbol HYPE --side long --leverage 10 --trader "麻吉大哥" --trader-pos "3,900 HYPE" --trader-value "$275,703" --trader-entry 71.1826 --trader-pnl -1910 --signal-type A
输出: 完整的含📐性价比区块的推送消息(可直接push_to_qq.sh
"""
import argparse
import json
import sys
from pathlib import Path
# Add parent to path
sys.path.insert(0, str(Path(__file__).parent))
def main():
parser = argparse.ArgumentParser(description='格式化交易信号推送消息')
parser.add_argument('--symbol', required=True, help='币种 (如 HYPE)')
parser.add_argument('--side', required=True, help='方向 (long/short)')
parser.add_argument('--leverage', type=int, default=10, help='杠杆')
parser.add_argument('--trader', required=True, help='交易员名称')
parser.add_argument('--trader-pos', required=True, help='交易员仓位 (如 "3,900 HYPE")')
parser.add_argument('--trader-value', required=True, help='交易员仓位价值 (如 "$275,703")')
parser.add_argument('--trader-entry', type=float, required=True, help='交易员入场价')
parser.add_argument('--trader-pnl', type=float, default=0, help='交易员浮盈(负=浮亏)')
parser.add_argument('--signal-type', default='A', help='信号类型 (A加仓/B减仓/C新开仓)')
parser.add_argument('--json', action='store_true', help='输出JSON而非格式化文本')
args = parser.parse_args()
# Import and run advisor
from okx_position_advisor import load_credentials, create_exchange, get_account_info, recommend_position, format_recommendation
creds = load_credentials()
exchange = create_exchange(creds)
acct_info = get_account_info(exchange)
symbol = args.symbol
if '/' not in symbol:
symbol = f"{symbol}/USDT"
try:
rec = recommend_position(symbol, args.side, args.leverage, exchange, acct_info)
except ZeroDivisionError:
print(f"⚠️ 余额不足(可用0 USDT),无法开仓 {args.symbol}")
sys.exit(0)
except Exception as e:
print(f"❌ 错误: {e}", file=sys.stderr)
sys.exit(1)
if 'error' in rec:
print(f"❌ 错误: {rec['error']}", file=sys.stderr)
sys.exit(1)
# Handle zero balance gracefully
if rec.get('contracts', 0) == 0:
print(f"⚠️ 余额不足,无法开仓 {args.symbol}")
sys.exit(0)
# Format output
side_cn = '做多' if args.side == 'long' else '做空'
emoji = '🟩' if args.side == 'long' else '🟥'
signal_label = {'A': 'A类加仓', 'B': 'B类减仓', 'C': 'C类新开仓'}.get(args.signal_type, args.signal_type)
pnl_emoji = '🔥' if args.trader_pnl > 0 else '🔴'
pnl_sign = '+' if args.trader_pnl > 0 else ''
# Cost check from advisor
cc = rec.get('cost_check', {})
rr = cc.get('rr_ratio', rec.get('rr', 0))
profit = cc.get('profit_amount', rec.get('tp_pnl', 0))
fee = cc.get('fee_cost', 0)
fee_pct = cc.get('fee_pct', 0)
net = cc.get('net_profit', 0)
rating_emoji = cc.get('rating_emoji', '⚠️')
rating_text = cc.get('rating_text', '未知')
msg = f"""⚡ 跟单建议 | {args.symbol} {side_cn} {emoji} {args.leverage}x{signal_label}
📊 {args.trader} {args.trader_pos}(价值{args.trader_value})← 信号源,非你的仓位
入场: ${args.trader_entry} | 当前: ${rec['price']}
浮盈: {pnl_sign}{args.trader_pnl:.0f} {pnl_emoji} | 强平距: ${rec.get('liq_price', '?')}
📐 性价比检查(基于你的推荐仓位)
• 你的仓位: {rec['contracts']}张(保证金{rec['margin']:.2f} USDT
• 盈亏比: {rr}:1 {'✅' if rr >= 2 else '⚠️' if rr >= 1.5 else '❌'}
• 盈利额: +{profit:.2f} USDT {'✅' if profit >= 10 else '❌ <10U保底'}
• 手续费: {fee:.2f} USDT ({fee_pct:.1f}%) {'✅' if fee_pct < 5 else '❌'}
• 净盈利: {net:.2f} USDT {'✅' if net >= 10 else '❌'}
• 评级: {rating_emoji} {rating_text}
🎯 跟单方案(基于你的账户数据)
• 入场: ${rec['price']}(市价)
• 止损: ${rec['sl_price']}-{rec['sl_pct']:.1f}%-{rec['sl_pnl']:.2f} USDT
• 止盈: ${rec['tp_price']}+{rec['tp_pct']:.1f}%+{rec['tp_pnl']:.2f} USDT
• 仓位: {rec['contracts']}张(保证金{rec['margin']:.2f} USDT
• 强平: ${rec.get('liq_price', '?')}
回复 Y 确认跟单 / N 取消"""
if args.json:
print(json.dumps({'message': msg, 'recommendation': rec}, ensure_ascii=False, indent=2))
else:
print(msg)
if __name__ == '__main__':
main()