hầu hết mọi người biết đến Grok Bot qua ảnh chụp pnl của ai đó, mở nó lên, chĩa vào một biểu đồ, và mất 50 đô đầu tiên cho một token đã chết từ trước khi họ kịp mua. con bot không phải là vấn đề. chẳng ai bảo nó thế nào là "chết" cả.
đây là bộ khung tôi sẽ dựng lại ngay tối nay nếu phải làm lại từ đầu. một bot, một thư mục, mười file nhỏ. nó không săn x100. nhiệm vụ chính của nó là loại bỏ token, và vài đồng sống sót được vẫn cần Grok đọc X trước khi một đô la duy nhất được chuyển đi.
bước 01 đến 07 dành cho buổi tối đầu tiên: con bot, cái key, các giới hạn, các điểm thoát. 08 đến 12 là bộ lọc rug, 14 bước kiểm tra, mỗi bước đều được viết thành code. 13 và 14 đưa nó vào chế độ tự động, nhưng chạy trên giấy trước đã.
nếu bạn đã đọc bài viết về bàn giao dịch tám agent của tôi, thì đây chính là nền móng mà cái bàn đó đứng lên.
https://x.com/0xboan/status/2092226208234647626
cách dùng: mở Grok Bot của bạn, dán toàn bộ bài viết này vào, và nói "dựng bộ khung này trong /workspace/desk, chế độ paper, hỏi tôi trước khi có gì chạm vào ví." nó sẽ tự viết từng file, trên máy tính của chính nó.
nguyên tắc cốt lõi bạn phải nhớ: code ra tay loại bỏ, Grok đọc X, bạn ký lệnh. không ai trên bàn làm việc của người khác.
01. chuẩn bị bốn thứ trước khi bắt đầu
bốn thứ. mỗi thứ đều ghi rõ nó là gì, bạn làm gì với nó tối nay, và tại sao bộ khung cần nó.
1. Grok Bot
nó là gì. ứng dụng nơi bạn thuê các con bot có tên. mỗi con chạy trên một máy tính đám mây có trình duyệt, file và terminal, và tiếp tục làm việc kể cả khi bạn gập laptop lại.
bạn làm gì. tải nó tại x.ai/bot, đăng nhập, chọn Create your own.
tại sao. toàn bộ hệ thống nằm trên cái máy đó. file, quy trình, cảnh báo, tất cả ở một nơi bạn có thể mở từ điện thoại.
2. một API key của xAI
nó là gì. quyền truy cập trả phí vào Grok từ code, tích hợp sẵn tìm kiếm X.
bạn làm gì. vào console.x.ai, mục API Keys, tạo một cái. đừng dán nó vào đâu vội, bước 03 sẽ chỉ chỗ để nhét vào.
tại sao. một quy trình không thể ngồi ngẫm nghĩ về bốn mươi token trong khung chat. một đoạn script gọi một lần cho mỗi token thì làm được, và nó ghi log mọi câu trả lời theo cùng một định dạng.
3. Rugcheck và DexScreener
nó là gì. hai API công khai miễn phí. Rugcheck đọc contract: quyền mint, LP, holder, insider, ví dev. DexScreener đọc pool: độ sâu, tuổi thọ, lực mua so với bán.
bạn làm gì. không làm gì cả. không cần đăng ký, không cần key để đọc.
tại sao. dữ kiện phải đi trước ý kiến. quyền mint đang mở không phải là phán đoán chủ quan, nó là dữ kiện, và dữ kiện ra tay loại bỏ trước tiên.
4. một ví phụ (burner wallet), nhưng không phải tối nay
nó là gì. một ví Solana mới tinh chưa từng giữ bất cứ thứ gì khác.
bạn làm gì. chưa làm gì cả. tuần đầu tiên chạy trên giấy.
tại sao. bộ khung không bao giờ giữ key. khi bạn chạy thật, nó chỉ bảo bạn mua gì và bạn tự tay ký lệnh.
02. thuê một bot, không phải tám
bàn giao dịch của tôi hiện chạy tám bot. nó không bắt đầu như vậy, và của bạn cũng không nên thế. tám bot trong ngày đầu tiên nghĩa là tám thứ phải debug cùng lúc. một bot với một nhiệm vụ sẽ cho bạn thấy bảy con còn lại sẽ cần gì sau này.
chọn Create your own và đưa cho nó đoạn này, nguyên văn từng chữ:
1Tên: RUG DESK2Nhiệm vụ: Bàn giao dịch memecoin Solana, chạy paper trước3Mô tả: Dựng và vận hành bộ khung trong /workspace/desk dựa trên bài viết tôi dán vào.4Mọi token đều phải qua check.py, không ngoại lệ, không đường tắt.5Bạn không bao giờ được mua, bán, ký hay di chuyển tiền. Bạn không bao giờ sửa config.py trừ khi tôi yêu cầu6trong khung chat này. Bạn không bao giờ hạ thông số bộ lọc để cho một token lọt qua.7Báo cáo mỗi lần loại bỏ kèm lý do, không phải ý kiến cá nhân của bạn về token đó.8Khi một nguồn bị sập, hãy nói rõ nguồn nào và bỏ qua. Không bao giờ được đoán bừa một con số bị thiếu.
hai dòng cuối quan trọng hơn năm dòng đầu. một con bot dám đoán bừa con số bị thiếu rồi sẽ có ngày đoán trúng con số khiến bạn mất tiền.

03. giấu key khỏi khung chat
mọi thứ bạn gõ cho bot đều rơi vào lịch sử chat. nên key phải được đưa vào một file, do chính bạn gõ, trên máy tính của bot.
mở máy tính của bot, bấm Take over, mở terminal và chạy lệnh này. nó sẽ hỏi key mà không hiển thị ra màn hình, nên key cũng không bao giờ xuất hiện trong lịch sử lệnh:
1mkdir -p /workspace/desk && cd /workspace/desk2read -rs -p "xai key: " K && printf 'XAI_API_KEY=%s\n' "$K" > .env && unset K3chmod 600 .env4pip install requests
sau đó chứng minh key hoạt động trước khi làm bất cứ việc gì khác. gọi một lần thôi, để sau này bạn không bao giờ nhầm lẫn giữa key hỏng và prompt dở:
1curl -s https://api.x.ai/v1/responses \2 -H "Authorization: Bearer $(cut -d= -f2 .env)" \3 -H "Content-Type: application/json" \4 -d '{"model":"grok-4.7","input":"reply with OK"}'56-> ... "type":"output_text","text":"OK" ...
bấm I'm done và trả lại máy tính. từ đây bot có thể vận hành bộ khung, mà vẫn không bao giờ nhìn thấy key trong khung chat.

04. nhìn toàn bộ phễu trước khi xây bất cứ thứ gì
tám vòng lọc. các vòng miễn phí chạy trước. chỉ những gì sống sót qua vòng miễn phí mới tốn một lượt gọi Grok, và chỉ những gì Grok hô MUA mới tốn tiền. tuần này thì thậm chí chưa tốn tiền.
10. LEAD một CA từ bất cứ đâu: cuộc gọi, bài đăng, scan.py -> một địa chỉ mint21. LIMITS book.py: lỗ ngày, slot trống, thời gian chờ -> miễn phí, không cần mạng32. FACTS rugcheck.py: 10 tiêu chí loại thẳng tay -> mint mở, LP chưa khóa, top 10 nắm quá nhiều sẽ chết ở đây43. POOL market.py: độ sâu, tuổi thọ, lực bán -> pool mỏng và honeypot chết ở đây54. JUDGE grok.py + tìm kiếm X, gọi một lần -> MUA hoặc BỎ QUA, một lý do, một rủi ro65. FILL paper: book.py khớp giá thật -> live: bạn tự tay ký lệnh76. WATCH watch.py mỗi 10 phút -> cắt lỗ, chốt lời từng phần, trailing stop, cắt lỗ theo thời gian87. REPORT report.py lúc 21:30 -> cái nào chết, cái nào sinh lời, cái nào cần nghi ngờ
quyền mint đang mở không phải là phán đoán chủ quan. nó là dữ kiện, và dữ kiện thì miễn phí. Grok chỉ được nhìn thấy những token đã vượt qua mọi bước kiểm tra mà script có thể làm.

05. gom mọi con số vào một file
lưu thành config.py. mọi con số của bộ khung đều nằm ở đây, nên khi muốn tinh chỉnh, bạn chỉ sửa một file duy nhất. đây là thông số của tôi, chỉnh cho lệnh 25 đô. chúng không phải lời khuyên, chúng là điểm khởi đầu để bạn tự thay đổi.
1# config.py2# mọi con số của bộ khung đều nằm ở đây. khi tinh chỉnh, bạn chỉ sửa file này và không gì khác.34MODEL = "grok-4.7" # kiểm tra console.x.ai -> Models nếu API từ chối5PAPER = True # tuần đầu: khớp lệnh giả với giá thật. chỉ đổi sau khi bạn đọc xong log67TICKET_USD = 25 # cố định. không bao giờ tăng size vì mấy lệnh trước thắng8MAX_OPEN = 4 # tối đa 4 x $25 = $100 trên thị trường9MAX_ENTRIES_PER_DAY = 610DAILY_LOSS_HALT_USD = 50 # lỗ thực tế hôm nay chạm mức này -> không vào lệnh mới cho đến mai11COOLDOWN_HOURS = 24 # không vào lại token vừa thoát ra1213FACTS = { # bộ lọc rug. chỉ dùng code, không dùng model14 "max_risk_score": 40, # score_normalised của rugcheck, 0-100, càng cao càng rủi ro15 "min_lp_locked_pct": 90, # pool lớn nhất: LP phải được khóa hoặc đốt16 "max_top10_pct": 30, # top 10 holder, không tính pool và locker17 "max_dev_pct": 5, # lượng cung còn nằm trong ví creator18 "max_insiders": 0, # holder bị gắn cờ insider + số hit insider trên graph19 "min_liquidity_usd": 30000,20 "max_ticket_share": 0.01, # lệnh của bạn không bao giờ vượt quá 1% pool21 "min_age_min": 30, # non hơn mức này thì mọi báo cáo vẫn chỉ là đoán mò22 "max_age_hours": 72,23}2425MIN_CONFIDENCE = 0.7 # Grok hô MUA dưới mức này -> coi như BỎ QUA2627EXIT = {28 "stop_pct": -35, # cắt lỗ cứng tính từ điểm vào29 "ladder": [(100, 0.50), (200, 0.25)], # lãi +100% bán nửa, +200% bán thêm một phần tư30 "trail_pct": 30, # phần còn lại: thoát khi giá giảm 30% từ đỉnh31 "time_stop_hours": 6, # không tăng 20% sau 6 giờ -> thoát, tiền chết32 "time_stop_min_pct": 20,33 "liq_drop_pct": 40, # thanh khoản pool giảm 40% so với lúc vào -> thoát ngay34}3536LOG = "checks.csv"37POSITIONS = "positions.json"38TRADES = "trades.csv"
1LỆNH CỐ ĐỊNH. khối lượng không bao giờ tăng chỉ vì ba lệnh trước thắng.2BOT ĐỌC config.py, NÓ KHÔNG BAO GIỜ GHI VÀO ĐÓ. con số chỉ thay đổi khi bạn tự tay đổi.3NỚI LỎNG BỘ LỌC PHẢI ĐƯỢC GHI LẠI. bạn đổi một con số, bạn phải nói lý do trong chat, ngay trong ngày.
06. chạy giới hạn trước mọi thứ khác
lưu thành book.py. bước kiểm tra rẻ nhất trong bộ khung là bước không bao giờ gọi API. nếu hôm nay đã lỗ 50 đô, bộ khung thậm chí không thèm nhìn token. nếu đang có bốn vị thế mở, tương tự. file này cũng là bộ nhớ của hệ thống: hai file bạn có thể tự mở ra xem, positions.json và trades.csv.
1# book.py2# vị thế, giao dịch, giới hạn. bộ nhớ của hệ thống nằm trong hai file bạn có thể tự mở.3import csv, json, os, sys, time4from config import (POSITIONS, TRADES, TICKET_USD, MAX_OPEN, MAX_ENTRIES_PER_DAY,5 DAILY_LOSS_HALT_USD, COOLDOWN_HOURS)67def load() -> dict:8 return json.load(open(POSITIONS)) if os.path.exists(POSITIONS) else {}910def save(book: dict):11 json.dump(book, open(POSITIONS, "w"), indent=2)1213def trades() -> list[dict]:14 return list(csv.DictReader(open(TRADES))) if os.path.exists(TRADES) else []1516def record(mint, symbol, action, usd, pnl, reason):17 new = not os.path.exists(TRADES)18 with open(TRADES, "a", newline="") as f:19 w = csv.DictWriter(f, fieldnames=["time", "mint", "symbol", "action", "usd", "pnl", "reason"])20 if new:21 w.writeheader()22 w.writerow({"time": time.strftime("%Y-%m-%d %H:%M"), "mint": mint, "symbol": symbol,23 "action": action, "usd": round(usd, 2), "pnl": round(pnl, 2), "reason": reason})2425def today_pnl() -> float:26 day = time.strftime("%Y-%m-%d")27 return sum(float(t["pnl"]) for t in trades() if t["time"].startswith(day))2829def guard(mint: str) -> str | None:30 """Giới hạn chạy trước mọi lệnh gọi mạng. Một lệnh vào bị chặn không tốn xu nào."""31 day = time.strftime("%Y-%m-%d")32 book = load()33 if today_pnl() <= -DAILY_LOSS_HALT_USD: return "halted_daily_loss"34 if mint in book: return "already_open"35 if len(book) >= MAX_OPEN: return "max_open"36 opens = [t for t in trades() if t["action"] == "open" and t["time"].startswith(day)]37 if len(opens) >= MAX_ENTRIES_PER_DAY: return "max_entries_today"38 cutoff = time.strftime("%Y-%m-%d %H:%M", time.localtime(time.time() - COOLDOWN_HOURS * 3600))39 if any(t["mint"] == mint and t["action"] == "close" and t["time"] >= cutoff for t in trades()):40 return "cooldown"41 return None4243def open_position(mint, symbol, price, liq_usd, usd=TICKET_USD):44 book = load()45 book[mint] = {"symbol": symbol, "entry": price, "qty0": usd / price, "qty": usd / price,46 "peak": price, "liq0": liq_usd, "opened": time.time(), "steps": 0}47 save(book)48 record(mint, symbol, "open", usd, 0, "entry")4950def sell(mint, frac_of_original, price, reason) -> float:51 """Bán một phần của KHỐI LƯỢNG BAN ĐẦU (1.0 = bán hết phần còn lại). Trả về pnl thực tế."""52 book = load()53 p = book[mint]54 q = min(p["qty"], p["qty0"] * frac_of_original)55 pnl = q * (price - p["entry"])56 p["qty"] -= q57 action = "close" if p["qty"] <= p["qty0"] * 1e-6 else "partial"58 record(mint, p["symbol"], action, q * price, pnl, reason)59 if action == "close":60 del book[mint]61 save(book)62 return pnl6364if __name__ == "__main__":65 # chế độ live: sau khi bạn mua bằng ví của mình -> python book.py add <mint> <usd> <price> <liq_usd>66 # sau khi bạn tự tay bán -> python book.py close <mint> <price>67 cmd = sys.argv[1]68 if cmd == "add":69 mint, usd, price, liq = sys.argv[2], float(sys.argv[3]), float(sys.argv[4]), float(sys.argv[5])70 open_position(mint, mint[:6], price, liq, usd)71 elif cmd == "close":72 print(round(sell(sys.argv[2], 1.0, float(sys.argv[3]), "manual"), 2))
07. viết luật thoát trước khi vào lệnh
hầu hết mọi người quyết định lúc nào bán khi đang nhìn chằm chằm vào cây nến xanh. đó là thời điểm tệ nhất để quyết định bất cứ điều gì. trên bộ khung này, mọi điểm thoát đều tồn tại trước khi token được mua, và bot chỉ việc kiểm tra mỗi 10 phút:
- thanh khoản rút 40% so với lúc vào: thoát, bán hết, không hỏi han gì
- giảm 35%: thoát
- tăng 100%: bán nửa, phần còn lại là tiền của thị trường
- tăng 200%: bán thêm một phần tư
- sau lần chốt lời đầu tiên, phần còn lại thoát khi giá giảm 30% từ đỉnh
- sáu tiếng mà không đạt +20%: thoát, cái slot đó đáng giá hơn sự kỳ vọng
lưu thành watch.py:
1# watch.py2# kiểm tra mọi vị thế đang mở, mỗi 10 phút. không in gì nếu không có thay đổi.3import time4from config import EXIT, PAPER5from market import pool6import book78def watch() -> list[str]:9 events = []10 for mint, p in list(book.load().items()):11 try:12 m = pool(mint)13 except Exception as e:14 events.append(f"{p['symbol']}: nguồn cấp giá sập ({e}), đang giữ, sẽ thử lại")15 continue16 if not m or m["price"] <= 0:17 events.append(f"{p['symbol']}: pool biến mất. coi như bị rug, bán được bao nhiêu thì bán")18 book.sell(mint, 1.0, 0.0, "pool_gone")19 continue2021 price = m["price"]22 b = book.load(); s = b[mint]23 s["peak"] = max(s["peak"], price); book.save(b)24 pct = (price / s["entry"] - 1) * 10025 hours = (time.time() - s["opened"]) / 36002627 def out(frac, why):28 pnl = book.sell(mint, frac, price, why)29 verb = "đã bán" if PAPER else "BÁN NGAY trong ví của bạn"30 size = "phần còn lại" if frac >= 1 else f"{int(frac * 100)}%"31 events.append(f"{s['symbol']}: {verb} {size} ở mức {pct:+.0f}% ({why}), pnl ${pnl:+.2f}")3233 if m["liq_usd"] < s["liq0"] * (1 - EXIT["liq_drop_pct"] / 100):34 out(1.0, "liquidity_pulled"); continue35 if pct <= EXIT["stop_pct"]:36 out(1.0, "stop"); continue37 ladder = EXIT["ladder"]38 if s["steps"] < len(ladder) and pct >= ladder[s["steps"]][0]:39 out(ladder[s["steps"]][1], f"take_profit_{ladder[s['steps']][0]}")40 b = book.load()41 if mint in b:42 b[mint]["steps"] += 1; book.save(b)43 continue44 if s["steps"] > 0 and price <= s["peak"] * (1 - EXIT["trail_pct"] / 100):45 out(1.0, "trailing_stop"); continue46 if hours >= EXIT["time_stop_hours"] and pct < EXIT["time_stop_min_pct"]:47 out(1.0, "time_stop")48 return events4950if __name__ == "__main__":51 for e in watch():52 print(e)
1THANH KHOẢN LÀ TRÊN HẾT. một pool bị rút tiền đánh bại mọi luật khác, kể cả khi vị thế đang xanh.2TRAILING STOP CHỈ KÍCH HOẠT SAU LẦN CHỐT LỜI ĐẦU TIÊN. trước đó, -35% là sàn duy nhất.3TIỀN CHẾT CŨNG LÀ THUA LỖ. sáu tiếng đi ngang giải phóng slot cho token tiếp theo.4IM LẶNG CŨNG LÀ MỘT TRẠNG THÁI. watch.py không in gì nếu không có thay đổi, nên khung chat im lìm nghĩa là bạn không cần phải ngó tới.

08. học 14 cách một token chết
nếu phải vứt bỏ mọi thứ ở trên và chỉ giữ lại một thứ, tôi sẽ giữ cái này. nó cũng hoạt động mà không cần bot nào: tự tay chạy 14 bước kiểm tra y hệt trên rugcheck.xyz và dexscreener trước lệnh mua tiếp theo, bạn sẽ né được phần lớn những token mà lẽ ra bạn sẽ hối hận.
13 bước là code. chỉ là phép so sánh, không model, không ý kiến. bước thứ 14 là bước duy nhất cần Grok.
#
bước kiểm tra
loại bỏ khi
lý do
1
đã bị rug
Rugcheck đánh dấu là rugged
có người làm rồi
2
quyền mint
vẫn đang mở
dev có thể in thêm cung xả vào túi bạn
3
quyền đóng băng
vẫn đang mở
dev có thể đóng băng token của bạn, bạn không bán được
4
cờ nguy hiểm
bất kỳ rủi ro mức danger nào
Rugcheck đã thấy thứ mà bạn sẽ rất khó bác bỏ
5
điểm rủi ro
trên 40/100
những cảnh báo nhỏ cộng dồn lại
6
khóa LP
pool lớn nhất khóa hoặc đốt dưới 90%
thanh khoản chưa khóa là nút bấm để rút thảm
7
top 10 holder
trên 30%, không tính pool và locker
mười cái ví có thể cùng nhau kết thúc lệnh của bạn
8
ví dev
creator vẫn giữ trên 5%
dev là người bán đầu tiên
9
insider / bundle
bất kỳ holder nào là insider hoặc dính trên graph insider
các ví được nạp tiền cùng nhau sẽ xả cùng nhau
10
độ sâu pool
thanh khoản dưới 30k đô
bạn sẽ thành thanh khoản thoát hàng cho ai đó
11
tỷ trọng lệnh
25 đô của bạn chiếm hơn 1% pool
chính lệnh mua của bạn làm trượt giá
12
tuổi thọ
dưới 30 phút hoặc trên 72 giờ
quá mới để có báo cáo nào, hoặc sóng đã chạy xong rồi
13
có lệnh bán không
20+ lệnh mua trong giờ qua, không có lệnh bán nào
đó là hình dáng của một honeypot
14
đọc X (Grok)
không có bài đăng, CA copycat, mua hype, có lịch sử rug
phần mà không API nào trả về được

09. để code loại bỏ những kẻ lộ liễu
bước kiểm tra 1 đến 9. nó lấy một báo cáo và chỉ giữ lại những trường mà bộ khung cần đọc. Grok không bao giờ thấy báo cáo thô, payload nặng vừa tốn token vừa giảm độ chính xác.
một chi tiết mọi người hay bỏ qua: vault của chính cái pool và các locker nằm trong danh sách top holder. đếm cả chúng vào thì token nào trông cũng như token cá voi. code sẽ loại chúng ra trước khi cộng tổng top 10.
1# rugcheck.py2# một báo cáo cho mỗi token, cắt gọn còn đúng những trường bộ khung cần đọc. Grok không bao giờ thấy báo cáo thô.3import requests4from config import FACTS56RC = "https://api.rugcheck.xyz/v1/tokens"78def report(mint: str) -> dict:9 r = requests.get(f"{RC}/{mint}/report", timeout=20)10 r.raise_for_status()11 d = r.json()12 token = d.get("token") or {}13 known = d.get("knownAccounts") or {}1415 def is_pool(h): # vault AMM và locker nằm trong top holder, chúng không phải cá voi16 tag = known.get(h.get("owner")) or known.get(h.get("address")) or {}17 return str(tag.get("type", "")).upper() in ("AMM", "LOCKER")1819 holders = [h for h in (d.get("topHolders") or []) if not is_pool(h)]20 markets = sorted(d.get("markets") or [],21 key=lambda m: ((m.get("lp") or {}).get("baseUSD") or 0)22 + ((m.get("lp") or {}).get("quoteUSD") or 0),23 reverse=True)24 lp = (markets[0].get("lp") or {}) if markets else {}25 supply = token.get("supply") or 026 risks = d.get("risks") or []2728 return {29 "mint": mint,30 "symbol": (d.get("tokenMeta") or {}).get("symbol"),31 "rugged": bool(d.get("rugged")),32 "risk_score": d.get("score_normalised"),33 "danger": [x.get("name") for x in risks if x.get("level") == "danger"],34 "warn": [x.get("name") for x in risks if x.get("level") == "warn"],35 "mint_authority": token.get("mintAuthority", d.get("mintAuthority")),36 "freeze_authority": token.get("freezeAuthority", d.get("freezeAuthority")),37 "lp_locked_pct": lp.get("lpLockedPct", d.get("lpLockedPct")),38 "top10_pct": round(sum(h.get("pct") or 0 for h in holders[:10]), 2) if holders else None,39 "dev_pct": round((d.get("creatorBalance") or 0) / supply * 100, 2) if supply else None,40 "insiders": sum(1 for h in holders if h.get("insider")) + (d.get("graphInsidersDetected") or 0),41 "holders": d.get("totalHolders"),42 }4344def fact_kill(t: dict) -> str | None:45 """Chỉ là phép so sánh thuần túy. Lỗi đầu tiên thắng, lý do được ghi log."""46 if t["risk_score"] is None: return "no_report"47 if t["rugged"]: return "already_rugged"48 if t["mint_authority"]: return "mint_open"49 if t["freeze_authority"]: return "freeze_open"50 if t["danger"]: return "danger:" + t["danger"][0]51 if t["risk_score"] > FACTS["max_risk_score"]: return "risk_score"52 if t["lp_locked_pct"] is None or t["lp_locked_pct"] < FACTS["min_lp_locked_pct"]:53 return "lp_unlocked"54 if t["top10_pct"] is None or t["top10_pct"] > FACTS["max_top10_pct"]:55 return "top10_heavy"56 if t["dev_pct"] is None or t["dev_pct"] > FACTS["max_dev_pct"]:57 return "dev_holds"58 if t["insiders"] > FACTS["max_insiders"]: return "insiders"59 return None

10. kiểm tra pool, không chỉ contract
bước kiểm tra 10 đến 13. contract có thể hoàn hảo nhưng pool vẫn không cho bạn thoát. đoạn này đọc pool sâu nhất của token và hỏi bốn câu nhàm chán: trong đó có đủ tiền không, lệnh của mình to cỡ nào so với nó, nó bao nhiêu tuổi rồi, và có ai thực sự đang bán không.
1# market.py2# bản thân cái pool: độ sâu, tuổi thọ, giá, và liệu có ai thực sự bán được không.3import time4import requests5from config import FACTS, TICKET_USD67DS = "https://api.dexscreener.com/tokens/v1/solana"89def pool(mint: str) -> dict | None:10 r = requests.get(f"{DS}/{mint}", timeout=15)11 r.raise_for_status()12 data = r.json()13 pairs = data if isinstance(data, list) else (data.get("pairs") or [])14 pairs = [p for p in pairs if (p.get("baseToken") or {}).get("address") == mint]15 if not pairs:16 return None17 p = max(pairs, key=lambda x: (x.get("liquidity") or {}).get("usd") or 0)18 h1 = (p.get("txns") or {}).get("h1") or {}19 born = p.get("pairCreatedAt")20 return {21 "symbol": (p.get("baseToken") or {}).get("symbol"),22 "price": float(p.get("priceUsd") or 0),23 "liq_usd": (p.get("liquidity") or {}).get("usd") or 0,24 "age_min": round((time.time() * 1000 - born) / 60000) if born else None,25 "buys_1h": h1.get("buys", 0),26 "sells_1h": h1.get("sells", 0),27 "vol_1h": (p.get("volume") or {}).get("h1"),28 "url": p.get("url"),29 }3031def market_kill(m: dict | None) -> str | None:32 if not m: return "no_pool"33 if m["price"] <= 0: return "no_price"34 if m["liq_usd"] < FACTS["min_liquidity_usd"]: return "thin_pool"35 if TICKET_USD / m["liq_usd"] > FACTS["max_ticket_share"]: return "ticket_too_big"36 if m["age_min"] is None or m["age_min"] < FACTS["min_age_min"]:37 return "too_fresh"38 if m["age_min"] > FACTS["max_age_hours"] * 60: return "too_old"39 if m["buys_1h"] >= 20 and m["sells_1h"] == 0: return "nobody_can_sell"40 return None
11. để Grok đọc những gì code không đọc được
bước kiểm tra 14. đây là lý do bộ khung này chạy trên Grok chứ không phải model nào khác: nó có thể tìm kiếm X ngay trong lúc suy nghĩ. một token có thể vượt qua cả 13 bước kiểm tra mà vẫn là hàng copycat với địa chỉ contract khác, hoặc một đợt launch mà bốn mươi tài khoản lập tuần trước cùng đăng một câu y hệt trong cùng một phút. không API nào trả về được chuyện đó. X thì có.
lưu thành grok.py. đây là file duy nhất đọc key và là nơi duy nhất bộ khung giao tiếp với xAI:
1# grok.py2# tệp duy nhất chứa khóa API và là nơi duy nhất bàn giao dịch giao tiếp với xAI.3import os, json, datetime, requests4from config import MODEL56URL = "https://api.x.ai/v1/responses"78def _key() -> str:9 k = os.environ.get("XAI_API_KEY")10 if not k and os.path.exists(".env"):11 for line in open(".env"):12 if line.startswith("XAI_API_KEY="):13 k = line.split("=", 1)[1].strip().strip('"')14 if not k:15 raise RuntimeError("không tìm thấy XAI_API_KEY trong biến môi trường hoặc trong .env")16 return k1718def _text(resp: dict) -> str:19 if isinstance(resp.get("output_text"), str):20 return resp["output_text"]21 parts = []22 for item in resp.get("output") or []:23 if item.get("type") == "message":24 for c in item.get("content") or []:25 if c.get("type") in ("output_text", "text"):26 parts.append(c.get("text") or "")27 return "\n".join(parts)2829def ask(system: str, payload: dict, read_x: bool = False) -> dict:30 """Một lần gọi, JSON vào, JSON ra. Bất cứ thứ gì không phải JSON đều sẽ báo lỗi, và lỗi nghĩa là BỎ QUA ở tầng trên."""31 body = {"model": MODEL,32 "input": [{"role": "system", "content": system},33 {"role": "user", "content": json.dumps(payload)}]}34 if read_x:35 since = (datetime.date.today() - datetime.timedelta(days=3)).isoformat()36 body["tools"] = [{"type": "x_search", "from_date": since}]37 body["max_turns"] = 2 # hai vòng tìm kiếm, sau đó bắt buộc phải trả lời38 r = requests.post(URL, timeout=180, json=body,39 headers={"Authorization": f"Bearer {_key()}"})40 r.raise_for_status()41 text = _text(r.json())42 start, end = text.find("{"), text.rfind("}")43 if start == -1:44 raise ValueError(f"không có json trong câu trả lời: {text[:200]}")45 return json.loads(text[start:end + 1])
lưu thành prompts.py. đây là tệp bạn sẽ thực sự đọc lại:
1# prompts.py2# prompt Grok duy nhất trên bàn giao dịch. đây là tệp bạn sẽ thực sự đọc lại.34JUDGE_PROMPT = """5Bạn là RUG DESK. Một memecoin Solana vừa vượt qua mọi bước kiểm tra cứng trong mã nguồn:6quyền hạn, LP, người nắm giữ, ví dev, nội gián, độ sâu pool, tuổi token.7Đừng kiểm tra lại những con số đó. Bạn quyết định xem có đưa một vé cược cố định vào hay không.8Bạn không bao giờ quyết định khối lượng, không bao giờ chọn điểm thoát lệnh.910INPUT: {"token": {...dữ kiện từ rugcheck...}, "pool": {...dữ kiện từ dexscreener...}}1112BƯỚC 1. Tìm kiếm trên X theo ticker và địa chỉ hợp đồng, trong 72 giờ qua.13BƯỚC 2. Chỉ đánh giá những gì mã nguồn không thấy được:14 - các rủi ro mức cảnh báo có cộng dồn thành vấn đề nghiêm trọng hơn không15 - ai đăng bài đầu tiên: dev, một tài khoản thật có lịch sử, hay một loạt tài khoản mới tạo16 - tự nhiên hay mua chuộc: cùng một nội dung, cùng một phút, tài khoản không có quá khứ17 - địa chỉ hợp đồng trong các bài đăng đó có giống với INPUT không18 - tên ticker này hoặc dev này đã từng dính phốt rug trước đây chưa1920CHỈ TRẢ VỀ JSON:21{"verdict": "BUY" | "SKIP", "confidence": 0.0-1.0,22 "why": "tối đa hai dòng", "x_read": "một dòng mô tả tình hình trên X",23 "main_risk": "một dòng"}2425Không có bài đăng nào trên X cũng là một câu trả lời: chẳng ai biết nó tồn tại. SKIP.26Có một địa chỉ hợp đồng khác dưới cùng ticker trên X: rủi ro hàng nhái. SKIP.27KHÔNG BAO GIỜ trả lời BUY khi một trường bạn cần bị null.28KHÔNG BAO GIỜ nhắc đến mục tiêu giá. Bạn không biết chúng.29"""
12. kết nối tất cả thành một lệnh duy nhất
một địa chỉ hợp đồng vào, một phán quyết ra. giới hạn, dữ kiện, pool, Grok, theo đúng thứ tự đó, và cái đầu tiên nói "không" sẽ kết thúc quy trình:
1# check.py2# một địa chỉ hợp đồng vào, một phán quyết ra. chạy mỗi khi có token đi qua bàn giao dịch của bạn.3import csv, json, os, sys, time4from config import LOG, MIN_CONFIDENCE, PAPER, TICKET_USD5from rugcheck import report, fact_kill6from market import pool, market_kill7from grok import ask8from prompts import JUDGE_PROMPT9import book1011def log(row: dict):12 new = not os.path.exists(LOG)13 with open(LOG, "a", newline="") as f:14 w = csv.DictWriter(f, fieldnames=["time", "mint", "symbol", "stage", "verdict",15 "confidence", "reason"])16 if new:17 w.writeheader()18 w.writerow({k: row.get(k) for k in w.fieldnames})1920def check(mint: str) -> dict:21 if (g := book.guard(mint)): # giới hạn, miễn phí22 return {"stage": "limits", "verdict": "SKIP", "reason": g}2324 try:25 token = report(mint) # bộ lọc rug, miễn phí26 except Exception as e:27 return {"stage": "facts", "verdict": "SKIP", "reason": f"rugcheck thất bại: {e}"}28 if (k := fact_kill(token)):29 return {"stage": "facts", "verdict": "SKIP", "reason": k, "symbol": token["symbol"]}3031 try:32 m = pool(mint) # pool, miễn phí33 except Exception as e:34 return {"stage": "pool", "verdict": "SKIP", "reason": f"dexscreener thất bại: {e}"}35 if (k := market_kill(m)):36 return {"stage": "pool", "verdict": "SKIP", "reason": k, "symbol": token["symbol"]}3738 try:39 ans = ask(JUDGE_PROMPT, {"token": token, "pool": m}, read_x=True) # bước trả phí duy nhất40 except Exception as e:41 return {"stage": "grok", "verdict": "SKIP", "reason": f"grok thất bại: {e}"}4243 verdict, conf = ans.get("verdict"), ans.get("confidence") or 044 if verdict == "BUY" and conf < MIN_CONFIDENCE:45 verdict = "SKIP"46 ans["why"] = f"độ tin cậy thấp {conf}"47 return {**ans, "stage": "grok", "verdict": verdict, "symbol": m["symbol"] or token["symbol"],48 "reason": ans.get("why"), "price": m["price"], "liq_usd": m["liq_usd"], "url": m["url"]}4950if __name__ == "__main__":51 mint = sys.argv[1].strip()52 v = check(mint)53 log({"time": time.strftime("%Y-%m-%d %H:%M"), "mint": mint, **v})54 if v["verdict"] == "BUY":55 if PAPER:56 book.open_position(mint, v["symbol"], v["price"], v["liq_usd"])57 v["action"] = f"MUA GIẤP ${TICKET_USD} ở giá {v['price']}"58 else:59 v["action"] = (f"CẦN PHÊ DUYỆT: hãy mua ${TICKET_USD} {v['symbol']} trong ví của bạn, "60 f"sau đó chạy: python book.py add {mint} {TICKET_USD} <giá khớp> {v['liq_usd']}")61 print(json.dumps(v, indent=2))
bạn không cần máy quét để dùng nó. lấy một CA từ kênh call, một bài đăng, hay tin nhắn của bạn bè: bảo bot "check <CA>" và nó sẽ chạy một dòng. kết quả trả về trông như thế này (ví dụ minh họa, không phải token thật):
1{2 "verdict": "SKIP",3 "confidence": 0.78,4 "why": "vượt qua mọi bước kiểm tra cứng, nhưng 30 bài đăng đầu tiên đến từ các tài khoản mới tạo tuần này, cùng một nội dung.",5 "x_read": "một tài khoản thật, một loạt tài khoản mới, không sai lệch CA",6 "main_risk": "hype mua chuộc, người mua sẽ rời đi khi ngừng đăng bài",7 "stage": "grok",8 "symbol": "EXAMPLE",9 "reason": "vượt qua mọi bước kiểm tra cứng, nhưng 30 bài đăng đầu tiên đến từ các tài khoản mới tạo tuần này, cùng một nội dung."10}

1DỮ KIỆN TRƯỚC Ý KIẾN. Grok không bao giờ quyết định việc một mint có mở hay không.2LỜI GỌI THẤT BẠI LÀ MỘT LỆNH BỎ QUA. Rugcheck sập, DexScreener sập, Grok sập, JSON lỗi: SKIP.3NULL KHÔNG CÓ NGHĨA LÀ SẠCH. một trường không trả về dữ liệu sẽ loại token đó, chứ không bao giờ cho nó qua.4MỖI TOKEN MỘT PHÁN QUYẾT. đừng bao giờ chạy lại cho đến khi nó báo BUY. nếu bạn không đồng ý, tức là bạn đang không đồng ý với config.py.5HÃY ĐỌC CÁC LÝ DO LOẠI, CHỨ KHÔNG PHẢI CÁC LỆNH MUA. lệnh mua mang lại cảm giác tốt. lý do loại cho bạn biết bộ lọc có hoạt động hay không.
13. ba tác vụ định kỳ, mỗi cái một câu
không cần trình dựng luồng công việc. bạn chỉ cần nói cho bot mỗi tác vụ một lần, bằng một câu, và nó sẽ cho bạn xem lần chạy tiếp theo. đây là của tôi, nguyên văn từng chữ:
1Cứ 10 phút một lần, trong /workspace/desk chạy python watch.py.2Nếu nó không in ra gì thì đừng nói gì. Nếu nó in ra bất cứ thứ gì, hãy đăng nguyên văn vào đây.
1Cứ 30 phút một lần, trong /workspace/desk chạy python scan.py.2Chỉ đăng các phán quyết BUY: symbol, confidence, x_read.3Nếu Rugcheck hoặc DexScreener bị sập, hãy nói rõ cái nào một lần thôi, đừng lặp lại ở mỗi lần chạy.
1Mỗi ngày lúc 21:30, trong /workspace/desk chạy python report.py và đăng kết quả vào đây.2Thêm một điều hiệu quả hôm nay và một con số trong config.py mà bạn muốn đặt dấu hỏi, kèm lý do.3Đừng bao giờ tự thay đổi con số đó.
hai tệp mà các tác vụ đó chạy. lưu thành report.py:
1# report.py2# báo cáo buổi tối. mọi thứ trong này đều lấy từ checks.csv và trades.csv, không có gì từ bộ nhớ.3import csv, os, time4from collections import Counter5from config import LOG, PAPER6import book78day = time.strftime("%Y-%m-%d")9checks = [r for r in csv.DictReader(open(LOG))] if os.path.exists(LOG) else []10checks = [r for r in checks if r["time"].startswith(day)]11done = [t for t in book.trades() if t["time"].startswith(day) and t["action"] != "open"]1213by_stage = Counter(r["stage"] for r in checks if r["verdict"] == "SKIP")14buys = [r for r in checks if r["verdict"] == "BUY"]15wins = [t for t in done if float(t["pnl"]) > 0]16reasons = Counter(r["reason"] for r in checks if r["stage"] in ("facts", "pool"))1718print(f"BÁO CÁO BUỔI TỐI {day} {'(GIẤP)' if PAPER else '(THẬT)'}")19print(f"đã kiểm tra: {len(checks)}")20print(f"bị loại bởi bộ lọc rug: {by_stage['facts']} | bởi pool: {by_stage['pool']} | "21 f"bởi Grok: {by_stage['grok']} | bởi giới hạn: {by_stage['limits']}")22print(f"đã mua: {len(buys)} | đang mở: {len(book.load())}")23print(f"lãi lỗ chốt hôm nay: ${book.today_pnl():+.2f}")24if done:25 print(f"thoát lệnh có lãi: {len(wins)}/{len(done)}")26 best = max(done, key=lambda t: float(t["pnl"]))27 worst = min(done, key=lambda t: float(t["pnl"]))28 print(f"tốt nhất: {best['symbol']} ${float(best['pnl']):+.2f} | tệ nhất: {worst['symbol']} ${float(worst['pnl']):+.2f}")29if reasons:30 top, n = reasons.most_common(1)[0]31 print(f"lý do loại phổ biến nhất: {top} ({n} lần)")
và scan.py, nguồn tìm token tùy chọn. nó kéo các token Solana mới vừa trả tiền mua hồ sơ DexScreener. hồ sơ trả phí không phải là tín hiệu chất lượng, nó chỉ có nghĩa là dev đã chịu chi tiền. phần còn lại do bộ lọc quyết định:
1# scan.py2# nguồn tìm token tùy chọn: các token Solana mới vừa trả tiền mua hồ sơ DexScreener.3# hồ sơ trả phí không phải tín hiệu chất lượng, chỉ có nghĩa là dev đã chịu chi tiền. bộ lọc sẽ quyết định.4import csv, os, subprocess, sys5import requests6from config import LOG78seen = {r["mint"] for r in csv.DictReader(open(LOG))} if os.path.exists(LOG) else set()9r = requests.get("https://api.dexscreener.com/token-profiles/latest/v1", timeout=15)10r.raise_for_status()11fresh = [t["tokenAddress"] for t in r.json()12 if t.get("chainId") == "solana" and t.get("tokenAddress") not in seen]1314for mint in fresh[:5]: # năm token mỗi lần chạy, để một giờ cao điểm không làm cạn ngân sách API15 subprocess.run([sys.executable, "check.py", mint])
điều cuối cùng tối nay: Settings, General, Auto-review. thêm hai quy tắc Ask first (Hỏi trước), chúng sẽ chặn hành động và chờ bạn bất kể tác vụ định kỳ nghĩ gì:
1Hỏi trước khi thực hiện bất kỳ kết nối ví, ký, swap hay chuyển tiền nào.2Hỏi trước khi chỉnh sửa bất kỳ tệp nào tên là config.py.


14. một tuần giao dịch giấy trước khi bỏ ra một đô la nào
PAPER = True nghĩa là bàn giao dịch làm mọi thứ y như thật ngoại trừ tiền. token thật, giá thật, điểm thoát thật, lệnh khớp giả. sau bảy ngày, hãy mở checks.csv và đọc nó như thể một người lạ viết ra.
những gì bạn cần tìm: bước kiểm tra nào loại nhiều nhất, các lệnh BUY có phải những lệnh bạn sẽ mua thật không, và có lý do SKIP nào trông vô lý không. lệnh khớp giấy xảy ra ở giá trên màn hình, lệnh khớp thật thì không bao giờ như vậy, nên hãy coi kết quả giấy là mức trần, không phải dự báo.
khi bạn chuyển sang giao dịch thật, hãy đổi PAPER thành False và không có gì thay đổi ngoài bước cuối cùng. check.py sẽ ngừng mua và thay vào đó đăng một dòng yêu cầu phê duyệt: tự mua $25 trong ví của bạn, rồi một lệnh sẽ đưa nó vào sổ để watch.py bắt đầu canh giữ.
khi hệ thống gặp lỗi
cái này liên quan đến tiền, nên mọi lỗi đều phải có sẵn một đáp án được ghi ra trước khi nó xảy ra.
1401 từ xAI -> khóa sai. Hãy Take over, viết lại .env, chạy lại lệnh curl từ bước 03.2400 / 404 từ xAI -> tên model đã đổi. sửa MODEL trong config.py, không làm gì khác.3429 từ xAI -> giới hạn tốc độ. token đó là SKIP, lần chạy sau sẽ bỏ qua. đừng bao giờ lặp lại nó.4lỗi về x_search -> MODEL của bạn không tìm kiếm được trên X. hãy chọn một model hỗ trợ trong console.x.ai -> Models.5Grok trả lời bằng văn xuôi -> ValueError, được ghi log, SKIP. đừng bao giờ biến một đoạn văn thành một lệnh giao dịch.6rugcheck 404 hoặc trống -> quá mới để lập chỉ mục. SKIP. mới không có nghĩa là sạch.7lp_unlocked trên mọi thứ -> một số loại pool hoàn toàn không có token LP. hãy tự mở thử một cái trên rugcheck8 trước khi bạn đụng vào con số đó, và thay đổi nó bằng văn bản.9no_pool -> chưa giao dịch trên DEX, hoặc không phải Solana. SKIP.10tác vụ im lìm -> Grok Bot tạm dừng các tác vụ sau khi bạn vắng mặt lâu.11 hãy mở Routines và bật chúng lại.
hóa đơn
mọi thứ trước bước phán xét đều miễn phí: giới hạn, Rugcheck, DexScreener. bước trả phí duy nhất là một lần gọi Grok cho mỗi token sống sót qua cả 13 bước kiểm tra, có bật tìm kiếm X.
1chi_phí_mỗi_token = input_tokens / 1_000_000 * giá_mỗi_M_input2 + output_tokens / 1_000_000 * giá_mỗi_M_output3 + posts_fetched / 1_000 * 5 # tìm kiếm X: $5 cho mỗi 1.000 bài đăng được lấy45max_turns = 2 giữ việc tìm kiếm ở hai vòng, nên posts_fetched luôn nhỏ.6mỗi phản hồi đều tự báo cáo x_posts_fetched của nó, nên ngày đầu tiên sẽ cho bạn con số thực tế.78giá: [giá từ console.x.ai]
phần mọi người hay hiểu sai: hóa đơn tăng theo số token sống sót, không phải theo máy quét. scan.py có thể nạp cho bàn giao dịch 240 token mỗi ngày và phần lớn chúng bị loại miễn phí trước khi Grok kịp biết đến.

phần quan trọng
đây là thiết lập của tôi, không phải chiến lược của bạn.
mọi con số trong config.py đều là của tôi, được chọn cho một vé cược $25 và sức chịu đựng của riêng tôi khi nhìn một thứ gì đó về 0. phần lớn memecoin đều về 0, và phần lớn người giao dịch chúng đều mất tiền. bộ lọc không làm cho một token trở nên tốt. nó loại bỏ những cách thua lỗ hiển nhiên, và ép bạn phải đọc lý do vì sao mỗi token chết.
hãy chạy thử một tuần trên giấy. đọc các lý do loại. thay đổi những con số bạn không đồng ý, bằng văn bản. sao chép cấu trúc, đừng sao chép các hằng số. đây không phải lời khuyên tài chính.
mã nguồn lo việc loại, Grok lo việc đọc X, bạn lo việc ký. một script không bao giờ được quyền phán đoán, Grok không bao giờ được cấp máy tính, và không ai ngoài bạn được chạm vào ví.
hãy lưu lại trước lần mua tiếp theo của bạn. follow nếu bạn định chạy một hệ thống tương tự, sẽ còn nhiều thứ nữa 🫶
tg của tôi - t.me/+8wAXS0nHWgA2MGEy
github của tôi - github.com/0xboan
giao dịch tại đây - fomo.family/r/0xboan





