Merge pull request #181 from gina888666/fix/gmgn-holder-analysis-output-and-style

fix(gmgn-holder-analysis): fix duplicate output and simplify entry cost section
This commit is contained in:
GMGN.AI
2026-07-20 20:51:37 +08:00
committed by GitHub
2 changed files with 6 additions and 33 deletions
+1 -1
View File
@@ -25,7 +25,7 @@ python3 ~/.claude/skills/gmgn-holder-analysis/analyze.py <FILL_IN_TOKEN_ADDRESS>
## Output Rule ## Output Rule
Your reply MUST contain ONLY the raw stdout of the script above, pasted verbatim — no introduction, no summary, no extra commentary before or after. Every line of every section must appear. Do not omit, paraphrase, or reformat any part of the output. After the script finishes, paste the complete stdout verbatim into your reply — every line, every section, nothing omitted or summarized. Do NOT add any introduction, commentary, or summary before or after the output block.
<!-- legacy inline script kept below for reference — DO NOT run this block --> <!-- legacy inline script kept below for reference — DO NOT run this block -->
<!-- <!--
+5 -32
View File
@@ -606,41 +606,14 @@ for rank, (age, ws) in enumerate(sig_clusters, 1):
conclusion = _(f"这批人目前亏着呢({roi:.0f}%),不到割肉的程度,短期不太会卖", conclusion = _(f"这批人目前亏着呢({roi:.0f}%),不到割肉的程度,短期不太会卖",
f"Currently down {roi:.0f}% — unlikely to sell at a loss short-term") f"Currently down {roi:.0f}% — unlikely to sell at a loss short-term")
batch_label = _('批次', 'Batch') batch_label = _('批次', 'Batch')
print(f" {batch_label}{rank}{_('', '(')}{label}{_('', ')')} {len(ws)} {_('个钱包', 'wallets')} {_('持仓', 'hold')} {pct(total_hp):.2f}% {risk_flag}") selling_cnt = len([h for h in ws if is_selling(h)])
holding_cnt = len([h for h in ws if is_buying_only(h)])
sell_str = f" 🚨 {_('出货中','selling')} {selling_cnt}" if selling_cnt else ""
hold_str = f" 📈 {_('加仓中','accumulating')} {holding_cnt}" if holding_cnt else ""
print(f" {batch_label}{rank}{_('', '(')}{label}{_('', ')')} {len(ws)} {_('个钱包', 'wallets')} {_('持仓', 'hold')} {pct(total_hp):.2f}% {risk_flag}{sell_str}{hold_str}")
print(f" {mc_str}") print(f" {mc_str}")
print(f"{conclusion}") print(f"{conclusion}")
print() print()
notable = sorted([h for h in ws if h.get('balance',0)>=1 and h['amount_percentage']>=0.002],
key=lambda h: -h['amount_percentage'])
if not notable:
notable = sorted([h for h in ws if h.get('balance',0)>=1], key=lambda h: -h['amount_percentage'])[:5]
dumping = [h for h in notable if is_selling(h)]
holding_firm = [h for h in notable if is_buying_only(h)]
silent_list = [h for h in notable if not is_active(h)]
if dumping:
print(f" 🚨 {_('出货中的大户', 'Selling whales')}")
for h in dumping[:3]:
did = (h.get('twitter_name') or '') or addr_short(h['address'])
roles = wallet_roles(h)
role_s = "["+"·".join(roles)+"] " if roles else ""
print(f" · {role_s}{did} {pct(h['amount_percentage']):.2f}% {_('浮盈','pnl')}{(h.get('unrealized_pnl') or 0)*100:+.0f}% {_('已卖','sold')} {h.get('sell_tx_count_cur') or 0}x {holding_status(h)}")
print()
if holding_firm:
print(f" 📈 {_('持续加仓/未出货', 'Still accumulating / not sold')}")
for h in holding_firm[:3]:
did = (h.get('twitter_name') or '') or addr_short(h['address'])
roles = wallet_roles(h)
role_s = "["+"·".join(roles)+"] " if roles else ""
print(f" · {role_s}{did} {pct(h['amount_percentage']):.2f}% {_('浮盈','pnl')}{(h.get('unrealized_pnl') or 0)*100:+.0f}% {_('已买','bought')} {h.get('buy_tx_count_cur') or 0}x")
print()
if silent_list:
silent_pct_val = sum(h['amount_percentage'] for h in silent_list)
buy0_cnt = sum(1 for h in silent_list if h.get('buy_tx_count_cur',0)==0)
note_str = (_("零成本空降为主", "mostly zero-cost airdrop") if buy0_cnt>len(silent_list)//2
else _("持仓未动", "holding without activity"))
print(f" 💤 {_('静默持仓', 'Silent holders')} {len(silent_list)} {pct(silent_pct_val):.2f}% → {_('抛压低,', 'low pressure, ')}{note_str}")
print()
print()
sec6 = _("💰 持仓者购买力", "💰 Holder Buying Power") sec6 = _("💰 持仓者购买力", "💰 Holder Buying Power")
print(f"━━ {sec6} {''*(54-len(sec6))}") print(f"━━ {sec6} {''*(54-len(sec6))}")