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
This commit is contained in:
Hermes Skills Manager
2026-07-05 02:31:15 -04:00
commit 6770bc9b9d
908 changed files with 239614 additions and 0 deletions
@@ -0,0 +1,108 @@
#!/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()