คนส่วนใหญ่รู้จัก Grok Bot ผ่านภาพหน้าจอ pnl ของคนอื่น เปิดมันขึ้นมา ชี้ไปที่กราฟ แล้วก็เสียเงิน 50 ดอลลาร์แรกไปกับโทเคนที่ตายไปแล้วตั้งแต่ก่อนที่พวกเขาจะซื้อด้วยซ้ำ ปัญหามันไม่ได้อยู่ที่บอทหรอก แค่ไม่มีใครบอกมันว่า "ตายแล้ว" หน้าตาเป็นยังไง
นี่คือเซ็ตอัปที่ผมจะสร้างใหม่อีกครั้งคืนนี้ถ้าต้องเริ่มนับหนึ่งใหม่ บอทตัวเดียว โฟลเดอร์เดียว ไฟล์เล็กๆ สิบไฟล์ มันไม่ได้วิ่งล่าเหรียญ 100x งานหลักของมันคือการฆ่าโทเคนทิ้ง และไม่กี่ตัวที่รอดมาได้ก็ยังต้องให้ Grok อ่าน X ก่อนที่เงินแม้แต่ดอลลาร์เดียวจะขยับ
ขั้นตอน 01 ถึง 07 คืองานของคืนแรก: ตัวบอท, คีย์, ขีดจำกัด, จุดออก ส่วน 08 ถึง 12 คือฟิลเตอร์กรอง rug, การตรวจสอบ 14 ข้อ ซึ่งทุกข้อถูกเขียนออกมาเป็นโค้ดหมดแล้ว และ 13 กับ 14 จะเอามันขึ้นระบบออโต้ไพล็อต โดยเริ่มจากโหมดกระดาษ (paper) ก่อน
ถ้าคุณเคยอ่านโพสต์ eight-agent desk ของผม นี่คือพื้นดินที่โต๊ะตัวนั้นตั้งอยู่
https://x.com/0xboan/status/2092226208234647626
วิธีใช้งาน: เปิด Grok Bot ของคุณ วางบทความนี้ทั้งบทความลงไป แล้วพิมพ์ว่า "build this desk in /workspace/desk, paper mode, ask me before anything touches a wallet." มันจะเขียนทุกไฟล์ด้วยตัวเอง บนคอมพิวเตอร์ของมันเอง
กฎเหล็กที่คุณต้องจำไว้: โค้ดเป็นคนฆ่า, Grok อ่าน X, คุณเป็นคนเซ็น ไม่มีใครบนโต๊ะทำงานนี้ไปแย่งงานของคนอื่น
01. เตรียมสี่อย่างนี้ก่อนเริ่ม
สี่อย่าง แต่ละอย่างจะบอกว่ามันคืออะไร คืนนี้คุณต้องทำอะไรกับมัน และทำไมโต๊ะทำงานนี้ถึงต้องมีมัน
1. Grok Bot
มันคืออะไร แอปที่คุณใช้จ้างบอทที่มีชื่อเฉพาะตัว แต่ละตัวทำงานอยู่บนคลาวด์คอมพิวเตอร์ที่มีเบราว์เซอร์ มีไฟล์ และมีเทอร์มินัล แถมยังทำงานต่อไปได้แม้คุณจะปิดแล็ปท็อปแล้วก็ตาม
คุณต้องทำอะไร ดาวน์โหลดได้ที่ x.ai/bot ล็อกอิน แล้วเลือก Create your own
ทำไม ระบบทั้งหมดของโต๊ะตัวนี้อยู่ในคอมพิวเตอร์เครื่องนั้น ไฟล์ รูทีน การแจ้งเตือน ทุกอย่างอยู่ในที่เดียวที่คุณเปิดดูจากมือถือได้เลย
2. xAI API key
มันคืออะไร สิทธิ์เข้าถึง Grok แบบเสียเงินผ่านโค้ด พร้อมฟีเจอร์ค้นหา X ในตัว
คุณต้องทำอะไร ไปที่ console.x.ai เลือก API Keys แล้วสร้างขึ้นมาหนึ่งคีย์ อย่าเพิ่งเอาไปวางที่ไหน ขั้นตอนที่ 03 จะบอกว่ามันต้องไปอยู่ตรงไหน
ทำไม รูทีนไม่สามารถนั่งคิดเรื่องโทเคนสี่สิบตัวในหน้าต่างแชทได้ แต่สคริปต์ที่เรียก API ทีละครั้งต่อหนึ่งโทเคนทำได้ และมันยังบันทึกทุกคำตอบในรูปแบบเดียวกันหมด
3. Rugcheck และ DexScreener
มันคืออะไร API สาธารณะฟรีสองตัว Rugcheck เอาไว้อ่านสัญญา: authorities, LP, holders, insiders, กระเป๋า dev ส่วน DexScreener เอาไว้อ่านพูล: ความลึก อายุ จำนวน buy เทียบกับ sell
คุณต้องทำอะไร ไม่ต้องทำอะไรเลย ไม่ต้องสมัคร ไม่ต้องใช้คีย์สำหรับการอ่านข้อมูล
ทำไม ข้อเท็จจริงต้องมาก่อนความคิดเห็น การที่ mint authority ยังเปิดอยู่ไม่ใช่เรื่องของวิจารณญาณ แต่มันคือข้อเท็จจริง และข้อเท็จจริงคือสิ่งที่ใช้ฆ่าทิ้งเป็นอย่างแรก
4. burner wallet แต่ไม่ใช่คืนนี้
มันคืออะไร กระเป๋า Solana ใหม่เอี่ยมที่ไม่เคยเก็บอะไรอื่นมาก่อนเลย
คุณต้องทำอะไร ยังไม่ต้องทำอะไร สัปดาห์แรกเราเล่นบนกระดาษ
ทำไม โต๊ะตัวนี้จะไม่เก็บ private key เด็ดขาด เมื่อคุณเริ่มใช้งานจริง มันจะแค่บอกว่าคุณควรซื้ออะไร แล้วคุณเป็นคนเซ็นเอง
02. จ้างบอทแค่ตัวเดียว ไม่ใช่แปดตัว
ตอนนี้โต๊ะของผมรันบอทแปดตัว แต่มันไม่ได้เริ่มต้นแบบนั้น และของคุณก็ไม่ควรเหมือนกัน การมีบอทแปดตัวในวันแรกหมายถึงคุณต้องดีบั๊กแปดอย่างพร้อมกัน บอทตัวเดียวที่มีงานเดียวจะทำให้คุณเห็นเลยว่าอีกเจ็ดตัวที่เหลือจะต้องใช้อะไรบ้างในตอนหลัง
เลือก Create your own แล้วป้อนคำสั่งนี้ให้มัน แบบคำต่อคำ:
1Name: RUG DESK2Job: Solana memecoin desk, paper first3Description: สร้างและรันโต๊ะทำงานใน /workspace/desk ตามบทความที่ฉันจะวางให้4ทุกโทเคนต้องผ่าน check.py ห้ามมีข้อยกเว้น ห้ามทางลัด5ห้ามซื้อ ขาย เซ็น หรือย้ายเงินเด็ดขาด ห้ามแก้ไข config.py เว้นแต่ฉันจะสั่ง6ในแชทนี้ ห้ามลดตัวเลขฟิลเตอร์เพื่อให้โทเคนใดผ่านเข้าไปได้7รายงานการฆ่าทุกครั้งพร้อมเหตุผล ไม่ใช่ความเห็นส่วนตัวของคุณที่มีต่อโทเคนนั้น8เมื่อแหล่งข้อมูลล่ม ให้บอกว่าอันไหนแล้วข้ามไป ห้ามเดาตัวเลขที่หายไปเด็ดขาด
สองบรรทัดสุดท้ายสำคัญกว่าห้าบรรทัดแรก บอทที่พยายามเดาตัวเลขที่หายไป สุดท้ายจะเดาผิดจนทำให้คุณเสียเงิน

03. เก็บคีย์ให้ออกห่างจากแชท
ทุกอย่างที่คุณพิมพ์ให้บอทจะถูกบันทึกไว้ใน transcript ดังนั้นคีย์ต้องไปอยู่ในไฟล์ ที่คุณเป็นคนพิมพ์เอง บนคอมพิวเตอร์ของบอท
เปิดคอมพิวเตอร์ของบอท คลิก Take over เปิดเทอร์มินัลแล้วรันคำสั่งนี้ มันจะถามหาคีย์โดยไม่แสดงตัวอักษรที่คุณพิมพ์ ดังนั้นมันจะไม่โผล่ไปใน history ด้วย:
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
จากนั้นพิสูจน์ว่าคีย์ใช้งานได้ก่อนทำอย่างอื่น เรียกแค่ครั้งเดียว เพื่อที่คุณจะได้ไม่สับสนระหว่างคีย์พังกับพรอมต์พังในตอนหลัง:
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" ...
คลิก I'm done แล้วคืนคอมพิวเตอร์กลับไป จากจุดนี้เป็นต้นไปบอทจะสามารถรันโต๊ะนี้ได้โดยที่มันไม่เคยเห็นคีย์ในแชทเลย

04. ดูภาพรวมของ funnel ทั้งหมดก่อนลงมือสร้าง
แปดด่าน ด่านฟรีๆ จะรันก่อน เฉพาะตัวที่รอดจากด่านฟรีเท่านั้นที่จะเปลืองการเรียก Grok และเฉพาะตัวที่ Grok บอกว่า BUY เท่านั้นที่จะเปลืองเงิน สัปดาห์นี้ แม้แต่เรื่องนั้นก็ยังไม่เกิด
10. LEAD CA จากที่ไหนก็ได้: จากการเรียก โพสต์ หรือ scan.py -> หนึ่ง mint21. LIMITS book.py: ขาดทุนรายวัน ช่องที่เปิดอยู่ ระยะพัก -> ฟรี ไม่ต้องใช้เน็ตเลย32. FACTS rugcheck.py: ฆ่าทิ้ง 10 ข้อแบบแข็งๆ -> open mint, LP ไม่ล็อก, top 10 ถือเยอะ ตายตรงนี้43. POOL market.py: ความลึก อายุ ยอดขาย -> พูลบางๆ และ honeypot ตายตรงนี้54. JUDGE grok.py + ค้นหา X เรียกครั้งเดียว -> BUY หรือ SKIP เหตุผลเดียว ความเสี่ยงเดียว65. FILL paper: book.py ที่ราคาจริง -> live: คุณเซ็นเอง76. WATCH watch.py ทุก 10 นาที -> stop, ladder, trail, time stop87. REPORT report.py ตอน 21:30 -> อะไรตาย อะไรจ่าย อะไรต้องตั้งคำถาม
การที่ mint authority ยังเปิดอยู่ไม่ใช่เรื่องของวิจารณญาณ มันคือข้อเท็จจริง และข้อเท็จจริงนั้นฟรี Grok จะได้เห็นเฉพาะโทเคนที่ผ่านการตรวจสอบทุกอย่างที่สคริปต์ทำได้มาแล้วเท่านั้น

05. ใส่ตัวเลขทุกอย่างไว้ในไฟล์เดียว
เซฟเป็น config.py ทุกตัวเลขบนโต๊ะตัวนี้จะอยู่ที่นี่ เวลาคุณปรับจูน คุณก็แก้แค่ไฟล์นี้ไฟล์เดียว ไม่ต้องแตะอะไรอื่น นี่คือตัวเลขของผม ปรับมาสำหรับไม้ละ 25 ดอลลาร์ มันไม่ใช่คำแนะนำ แต่มันคือจุดเริ่มต้นที่คุณจะต้องขยับมันเอง
1# config.py2# ทุกตัวเลขบนโต๊ะตัวนี้อยู่ที่นี่ เวลาคุณปรับจูน คุณแก้แค่ไฟล์นี้ไฟล์เดียว ไม่ต้องแตะอะไรอื่น34MODEL = "grok-4.7" # เช็ค console.x.ai -> Models ถ้า API ปฏิเสธ5PAPER = True # สัปดาห์แรก: เติมไม้ปลอมด้วยราคาจริง เปลี่ยนค่านี้ก็ต่อเมื่อคุณอ่าน log จบแล้ว67TICKET_USD = 25 # คงที่ ห้ามคำนวณขนาดจากกำไรครั้งก่อนเด็ดขาด8MAX_OPEN = 4 # 4 x $25 = $100 ในตลาด สูงสุดเท่านี้9MAX_ENTRIES_PER_DAY = 610DAILY_LOSS_HALT_USD = 50 # ขาดทุนจริงวันนี้แตะเลขนี้ -> ห้ามเข้าไม้ใหม่จนถึงพรุ่งนี้11COOLDOWN_HOURS = 24 # ห้ามกลับเข้าไปในโทเคนที่เพิ่งขายออกไป1213FACTS = { # ฟิลเตอร์กรอง rug ใช้โค้ดอย่างเดียว ไม่ใช้โมเดล14 "max_risk_score": 40, # score_normalised ของ rugcheck, 0-100 ยิ่งสูงยิ่งเสี่ยง15 "min_lp_locked_pct": 90, # พูลที่ใหญ่ที่สุด: LP ต้องถูกล็อกหรือเบิร์น16 "max_top10_pct": 30, # ผู้ถือ top 10 ไม่รวมพูลและล็อกเกอร์17 "max_dev_pct": 5, # ซัพพลายที่ยังค้างอยู่ในกระเป๋าผู้สร้าง18 "max_insiders": 0, # ผู้ถือที่ถูกแฟล็กว่าเป็น insider + ผลจากกราฟ insider19 "min_liquidity_usd": 30000,20 "max_ticket_share": 0.01, # ไม้ของคุณต้องไม่เกิน 1% ของพูล21 "min_age_min": 30, # อายุน้อยกว่านี้ ทุกบทวิเคราะห์ก็ยังเป็นการเดาอยู่22 "max_age_hours": 72,23}2425MIN_CONFIDENCE = 0.7 # ถ้า Grok บอก BUY แต่ความมั่นใจต่ำกว่านี้ -> ให้ถือเป็น SKIP2627EXIT = {28 "stop_pct": -35, # hard stop นับจากราคาเข้า29 "ladder": [(100, 0.50), (200, 0.25)], # +100% ขายครึ่งนึง +200% ขายอีกหนึ่งในสี่30 "trail_pct": 30, # ส่วนที่เหลือ: ออกเมื่อราคาร่วง 30% จากจุดสูงสุด31 "time_stop_hours": 6, # ไม่บวก 20% หลังผ่านไป 6 ชั่วโมง -> ออก เงินตาย32 "time_stop_min_pct": 20,33 "liq_drop_pct": 40, # สภาพคล่องของพูลลดลง 40% จากราคาเข้า -> ออกทันที34}3536LOG = "checks.csv"37POSITIONS = "positions.json"38TRADES = "trades.csv"
1ไม้คงที่ ขนาดไม้จะไม่โตขึ้นเพียงเพราะสามครั้งล่าสุดคุณชนะ2บอทอ่าน config.py แต่มันจะไม่เขียนทับ ตัวเลขจะขยับก็ต่อเมื่อคุณเป็นคนขยับมัน3การผ่อนฟิลเตอร์ต้องประกาศเป็นลายลักษณ์อักษร ถ้าคุณเปลี่ยนตัวเลข คุณต้องบอกเหตุผลในแชทภายในวันเดียวกัน
06. รันขีดจำกัดก่อนทำอย่างอื่นเสมอ
เซฟเป็น book.py การตรวจสอบที่ถูกที่สุดบนโต๊ะนี้คืออันที่ไม่ต้องเรียก API เลย ถ้าวันนี้ขาดทุนไปแล้ว 50 ดอลลาร์ โต๊ะตัวนี้จะไม่แม้แต่จะมองโทเคนนั้น ถ้าเปิดสถานะอยู่สี่ตำแหน่ง ก็เช่นเดียวกัน ไฟล์นี้ยังเป็นความทรงจำของโต๊ะด้วย: สองไฟล์ที่คุณเปิดดูเองได้ คือ positions.json และ trades.csv
1# book.py2# สถานะ การเทรด ขีดจำกัด ความทรงจำของโต๊ะอยู่ในสองไฟล์ที่คุณเปิดดูเองได้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 """ขีดจำกัดจะทำงานก่อนการเรียกเครือข่ายใดๆ การบล็อกการเข้าไม้ไม่มีต้นทุน"""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 """ขายเศษส่วนของขนาดเริ่มต้น (1.0 = ทั้งหมดที่เหลือ) คืนค่า pnl ที่รับรู้แล้ว"""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 # โหมด live: หลังจากคุณซื้อในกระเป๋าตัวเอง -> python book.py add <mint> <usd> <price> <liq_usd>66 # หลังจากคุณขายด้วยตัวเอง -> 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. เขียนจุดออกก่อนจุดเข้า
คนส่วนใหญ่มักตัดสินใจว่าจะขายตอนไหนในขณะที่นั่งจ้องแท่งเทียนสีเขียว นั่นคือเวลาที่แย่ที่สุดในการตัดสินใจอะไรก็ตาม บนโต๊ะตัวนี้ ทุกจุดออกจะมีอยู่ก่อนที่เราจะซื้อโทเคน และบอทก็จะแค่เข้ามาเช็คทุกๆ 10 นาที:
- สภาพคล่องถูกดึงออกไป 40% จากราคาเข้า: ออก ออกให้หมด ไม่ต้องถาม
- ติดลบ 35%: ออก
- บวก 100%: ขายออกครึ่งนึง ที่เหลือคือเงินของตลาด
- บวก 200%: ขายออกอีกหนึ่งในสี่
- หลังจากขายทำกำไรครั้งแรก ส่วนที่เหลือจะออกเมื่อราคาร่วง 30% จากจุดสูงสุด
- หกชั่วโมงแล้วยังไม่บวก 20%: ออก ช่องว่างนี้มีค่ามากกว่าความหวัง
เซฟเป็น watch.py:
1# watch.py2# ทุกสถานะที่เปิดอยู่ ทุกๆ 10 นาที ไม่พิมพ์อะไรเลยถ้าไม่มีอะไรเปลี่ยนแปลง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']}: ฟีดราคาล่ม ({e}), ถือไว้ จะลองใหม่")15 continue16 if not m or m["price"] <= 0:17 events.append(f"{p['symbol']}: พูลหายไปแล้ว ให้ถือว่าโดน rug ขายเท่าที่ขายได้")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 = "sold" if PAPER else "SELL NOW in your wallet"30 size = "the rest" if frac >= 1 else f"{int(frac * 100)}%"31 events.append(f"{s['symbol']}: {verb} {size} at {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)
1สภาพคล่องต้องมาก่อน พูลที่ถูกดึงออกชนะทุกกฎเกณฑ์ แม้แต่ในสถานะที่กำลังกำไร2TRAILING STOP จะเริ่มทำงานหลังจากการขายทำกำไรครั้งแรก ก่อนหน้านั้น -35% คือพื้นเดียวที่มี3เงินตายก็คือการขาดทุนเช่นกัน หกชั่วโมงที่ราคาไม่ขยับคือการคืนช่องว่างนั้นให้กับโทเคนตัวถัดไป4ความเงียบก็คือสถานะ watch.py จะไม่พิมพ์อะไรเลยถ้าไม่มีอะไรเปลี่ยนแปลง ดังนั้นแชทที่เงียบแปลว่าคุณไม่ต้องไปดูมัน

08. เรียนรู้ 14 วิธีที่โทเคนจะตาย
ถ้าผมต้องโยนทุกอย่างข้างบนทิ้งไปและเก็บไว้แค่อย่างเดียว ผมจะเก็บสิ่งนี้ และมันยังใช้ได้โดยไม่ต้องมีบอทเลย: ลองทำการตรวจสอบ 14 ข้อนี้ด้วยมือบน rugcheck.xyz และ dexscreener ก่อนที่คุณจะซื้อครั้งต่อไป แล้วคุณจะข้ามโทเคนที่กำลังจะทำให้คุณเสียใจไปได้เกือบหมด
13 ข้อจากการตรวจสอบเหล่านี้คือโค้ด เป็นการเปรียบเทียบล้วนๆ ไม่มีโมเดล ไม่มีความเห็น ข้อที่ 14 เป็นข้อเดียวที่ต้องใช้ Grok
#
การตรวจสอบ
ฆ่าทิ้งเมื่อ
ทำไม
1
โดน rug ไปแล้ว
Rugcheck ทำเครื่องหมายว่า rugged
มีคนทำไปแล้ว
2
mint authority
ยังเปิดอยู่
dev สามารถพิมพ์ซัพพลายใหม่มาใส่กระเป๋าคุณได้
3
freeze authority
ยังเปิดอยู่
dev สามารถอายัดโทเคนของคุณได้ คุณจะขายไม่ได้
4
ธงอันตราย
ความเสี่ยงระดับ danger ใดๆ
Rugcheck เจออะไรบางอย่างที่คุณต้องไปพิสูจน์ว่ามันผิด
5
คะแนนความเสี่ยง
สูงกว่า 40/100
คำเตือนเล็กๆ รวมกันก็กลายเป็นเรื่องใหญ่ได้
6
การล็อก LP
พูลที่ใหญ่ที่สุดล็อกหรือเบิร์นไม่ถึง 90%
สภาพคล่องที่ไม่ได้ล็อกคือปุ่มกดถอนเงิน
7
ผู้ถือ top 10
เกิน 30% ไม่รวมพูลและล็อกเกอร์
สิบกระเป๋าสามารถจบการเทรดของคุณพร้อมกันได้
8
กระเป๋า dev
ผู้สร้างยังถือเกิน 5%
dev คือคนขายคนแรก
9
insider / bundles
มีผู้ถือที่เป็น insider หรือติดในกราฟ insider
กระเป๋าที่ได้รับเงินมาด้วยกันจะขายด้วยกัน
10
ความลึกของพูล
สภาพคล่องต่ำกว่า 3 หมื่นดอลลาร์
คุณจะเป็นทางออกให้คนอื่น
11
สัดส่วนไม้ของคุณ
25 ดอลลาร์ของคุณเกิน 1% ของพูล
การซื้อของคุณเองจะทำให้ราคาขยับ
12
อายุ
น้อยกว่า 30 นาทีหรือมากกว่า 72 ชม.
ใหม่เกินกว่าที่บทวิเคราะห์ไหนจะเชื่อถือได้ หรือรอบมันจบไปแล้ว
13
มียอดขายไหม
buy มากกว่า 20 ครั้งในชั่วโมงที่ผ่านมา แต่ sell เป็นศูนย์
นั่นคือรูปทรงของ honeypot
14
อ่าน X (Grok)
ไม่มีโพสต์, CA ก๊อปปี้คนอื่น, ซื้อกระแส, ประวัติการ rug
ส่วนที่ไม่มี API ไหนส่งกลับมาให้ได้

09. ปล่อยให้โค้ดฆ่าพวกที่เห็นชัดๆ
การตรวจสอบข้อ 1 ถึง 9 มันจะดึงรายงานมาหนึ่งชุดและเก็บไว้เฉพาะฟิลด์ที่โต๊ะตัวนี้อ่าน Grok จะไม่เห็นรายงานดิบๆ เพราะ payload ที่ใหญ่เกินไปจะกิน token และทำลายความแม่นยำ
รายละเอียดหนึ่งที่คนมักพลาด: vault ของพูลเองและล็อกเกอร์จะอยู่ในรายชื่อผู้ถืออันดับต้นๆ ถ้านับพวกนี้รวมไปด้วย ทุกโทเคนก็จะดูเหมือนโทเคนที่วาฬถือ โค้ดจะตัดพวกนี้ออกก่อนนำไปรวมยอด top 10
1# rugcheck.py2# รายงานหนึ่งชุดต่อโทเคน ตัดแต่งเหลือแค่ฟิลด์ที่โต๊ะตัวนี้อ่าน Grok จะไม่เห็นรายงานดิบๆ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): # AMM vault และล็อกเกอร์อยู่ใน top holders พวกมันไม่ใช่วาฬ16 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 """การเปรียบเทียบตรงๆ ข้อแรกที่ตกคือคำตอบ เหตุผลจะถูกบันทึกลง 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. ตรวจสอบพูล ไม่ใช่แค่สัญญา
การตรวจสอบข้อ 10 ถึง 13 สัญญาอาจจะสมบูรณ์แบบแต่พูลก็ยังไม่ยอมให้คุณออกอยู่ดี โค้ดนี้จะอ่านพูลที่ลึกที่สุดของโทเคนนั้นแล้วถามคำถามน่าเบื่อๆ สี่ข้อ: มีเงินในนั้นพอไหม ไม้ของเราใหญ่แค่ไหนเมื่อเทียบกับมัน มันอายุเท่าไหร่แล้ว และมีคนขายจริงๆ ไหม
1# market.py2# ตัวพูลเอง: ความลึก อายุ ราคา และว่ามีคนขายได้จริงไหม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 อ่านในสิ่งที่โค้ดอ่านไม่ได้
การตรวจสอบข้อ 14 นี่คือเหตุผลที่โต๊ะตัวนี้รันบน Grok ไม่ใช่โมเดลอื่น: มันค้นหา X ไปพร้อมกับคิดไปได้ โทเคนอาจผ่านการตรวจสอบทั้ง 13 ข้อแล้วก็จริง แต่ก็ยังเป็นแค่ตัวก๊อปปี้ที่ใช้ address สัญญาต่างกัน หรือเป็นการเปิดตัวที่บัญชีสี่สิบบัญชีซึ่งเพิ่งสร้างเมื่อสัปดาห์ก่อนมาโพสต์ประโยคเดียวกันในนาทีเดียวกัน ไม่มี API ไหนส่งข้อมูลนั้นกลับมาให้ได้ แต่ X ทำได้
เซฟเป็น grok.py มันเป็นไฟล์เดียวที่อ่านคีย์ และเป็นจุดเดียวที่โต๊ะตัวนี้คุยกับ xAI:
1# grok.py2# ไฟล์เดียวที่เก็บคีย์ และเป็นจุดเดียวที่ desk สื่อสารกับ xAI3import 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("ไม่พบ XAI_API_KEY ใน environment หรือใน .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 """เรียกครั้งเดียว รับ JSON เข้า ส่ง JSON ออก อะไรที่ไม่ใช่ JSON จะเกิด error และการเกิด error คือการ SKIP ในขั้นตอนก่อนหน้า"""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 # ค้นสองรอบ แล้วต้องตอบ38 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"ไม่มี json ในคำตอบ: {text[:200]}")45 return json.loads(text[start:end + 1])
บันทึกเป็น prompts.py นี่คือไฟล์ที่คุณจะกลับมาอ่านจริงๆ:
1# prompts.py2# พรอมต์ Grok เพียงตัวเดียวบน desk นี่คือไฟล์ที่คุณจะกลับมาอ่านจริงๆ34JUDGE_PROMPT = """5คุณคือ RUG DESK มี Solana memecoin ตัวหนึ่งเพิ่งผ่านการตรวจสอบแบบเข้มงวดทุกข้อในโค้ดแล้ว:6authorities, LP, holders, dev wallet, insiders, pool depth, age7ห้ามตรวจตัวเลขเหล่านั้นซ้ำ คุณเป็นคนตัดสินใจว่าจะใส่ตั๋วแบนๆ ใบนี้เข้าไปหรือไม่8คุณห้ามกำหนดขนาด และห้ามเลือกจุดออกโดยเด็ดขาด910INPUT: {"token": {...ข้อเท็จจริงจาก rugcheck...}, "pool": {...ข้อเท็จจริงจาก dexscreener...}}1112ขั้นตอนที่ 1 ค้นหา ticker และ contract address บน X ในช่วง 72 ชั่วโมงที่ผ่านมา13ขั้นตอนที่ 2 ตัดสินเฉพาะสิ่งที่โค้ดมองไม่เห็น:14 - ความเสี่ยงระดับ warn รวมกันแล้วกลายเป็นเรื่องที่แย่ลงไหม15 - ใครโพสต์ก่อน: dev, บัญชีจริงที่มีประวัติ หรือคลื่นบัญชีใหม่ที่ผุดขึ้นมาพร้อมกัน16 - ออร์แกนิกหรือซื้อโพสต์: ถ้อยคำเหมือนกัน นาทีเดียวกัน บัญชีที่ไม่มีอดีต17 - contract address ในโพสต์เหล่านั้นตรงกับที่อยู่ใน INPUT หรือไม่18 - ชื่อ ticker นี้หรือ dev คนนี้เคยเกี่ยวข้องกับ rug มาก่อนไหม1920ส่งคืนเฉพาะ JSON:21{"verdict": "BUY" | "SKIP", "confidence": 0.0-1.0,22 "why": "สูงสุดสองบรรทัด", "x_read": "หนึ่งบรรทัดว่า X ดูเป็นอย่างไร",23 "main_risk": "หนึ่งบรรทัด"}2425ถ้าไม่มีโพสต์บน X เลย นั่นคือคำตอบ: ไม่มีใครรู้ว่ามันมีอยู่ SKIP26ถ้ามี contract address อื่นภายใต้ ticker เดียวกันบน X: เสี่ยงเป็นของลอก SKIP27ห้ามตอบ BUY เมื่อฟิลด์ที่คุณต้องการเป็น null28ห้ามพูดถึงราคาเป้าหมาย คุณไม่รู้เรื่องนั้น29"""
12. รวบทุกอย่างเข้าด้วยกันด้วยคำสั่งเดียว
ป้อน contract address เข้ามาหนึ่งอัน ได้คำตัดสินออกมาหนึ่งอัน ขีดจำกัด ข้อเท็จจริง pool Grok ตามลำดับนี้ และตัวแรกที่บอกว่าไม่ผ่านก็จบเกม:
1# check.py2# ป้อน contract address เข้ามาหนึ่งอัน ได้คำตัดสินออกมาหนึ่งอัน ทำงานทุกครั้งที่โทเค็นวิ่งผ่าน desk ของคุณ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)): # limits, ฟรี22 return {"stage": "limits", "verdict": "SKIP", "reason": g}2324 try:25 token = report(mint) # กรอง rug, ฟรี26 except Exception as e:27 return {"stage": "facts", "verdict": "SKIP", "reason": f"rugcheck ล้มเหลว: {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, ฟรี33 except Exception as e:34 return {"stage": "pool", "verdict": "SKIP", "reason": f"dexscreener ล้มเหลว: {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) # ขั้นตอนเดียวที่ต้องจ่ายเงิน40 except Exception as e:41 return {"stage": "grok", "verdict": "SKIP", "reason": f"grok ล้มเหลว: {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"ความมั่นใจต่ำ {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"PAPER BUY ${TICKET_USD} ที่ {v['price']}"58 else:59 v["action"] = (f"ต้องอนุมัติ: ซื้อ {v['symbol']} จำนวน ${TICKET_USD} ในกระเป๋าของคุณเอง "60 f"แล้วรัน: python book.py add {mint} {TICKET_USD} <fill price> {v['liq_usd']}")61 print(json.dumps(v, indent=2))
คุณไม่ต้องใช้ scanner ก็ใช้งานมันได้ แค่เอา CA จาก call channel, โพสต์, หรือข้อความเพื่อน บอกบอทว่า "check <CA>" แล้วมันจะรันแค่บรรทัดเดียว สิ่งที่ได้กลับมามีหน้าตาแบบนี้ (ตัวอย่างโครงสร้าง ไม่ใช่โทเค็นจริง):
1{2 "verdict": "SKIP",3 "confidence": 0.78,4 "why": "ผ่านการตรวจสอบแบบเข้มงวดทุกข้อ แต่ 30 โพสต์แรกมาจากบัญชีที่สร้างสัปดาห์นี้ ถ้อยคำเหมือนกันหมด",5 "x_read": "บัญชีจริงหนึ่งบัญชี คลื่นบัญชีใหม่เพียบ ไม่พบ CA ผิดไปจากเดิม",6 "main_risk": "ปั่นกระแสด้วยเงิน คนซื้อจะหนีทันทีที่หยุดโพสต์",7 "stage": "grok",8 "symbol": "EXAMPLE",9 "reason": "ผ่านการตรวจสอบแบบเข้มงวดทุกข้อ แต่ 30 โพสต์แรกมาจากบัญชีที่สร้างสัปดาห์นี้ ถ้อยคำเหมือนกันหมด"10}

1ข้อเท็จจริงมาก่อนความคิดเห็น Grok ไม่เคยตัดสินใจว่า mint เปิดอยู่หรือไม่2การเรียก API ที่ล้มเหลวคือการ SKIP Rugcheck ล่ม, DexScreener ล่ม, Grok ล่ม, JSON พัง: SKIP ทั้งหมด3NULL ไม่ได้แปลว่าสะอาด ฟิลด์ไหนไม่ส่งค่ากลับมาจะฆ่าโทเค็นนั้นทิ้ง ไม่เคยทำให้มันผ่าน4หนึ่งคำตัดสินต่อหนึ่งโทเค็น ห้ามรันซ้ำจนกว่ามันจะบอก BUY ถ้าคุณไม่เห็นด้วย แปลว่าคุณไม่เห็นด้วยกับ config.py5อ่านเหตุผลที่ถูกตัดทิ้ง อย่าอ่านแค่ตอนซื้อ ตอนซื้อมันรู้สึกดี แต่เหตุผลที่ถูกตัดต่างหากที่บอกคุณว่าตัวกรองทำงานได้จริงไหม
13. สามรูทีน รูทีนละประโยค
ไม่ต้องใช้ workflow builder คุณแค่บอกรูทีนแต่ละตัวให้บอทฟังครั้งเดียวด้วยประโยคเดียว แล้วมันจะแสดงรอบการทำงานถัดไปให้คุณดู นี่คือของผม แบบคำต่อคำ:
1ทุก 10 นาที ใน /workspace/desk ให้รัน python watch.py2ถ้ามันไม่พิมพ์อะไรออกมา ก็ไม่ต้องพูดอะไร ถ้ามันพิมพ์อะไรออกมา ให้โพสต์ที่นี่แบบคำต่อคำ
1ทุก 30 นาที ใน /workspace/desk ให้รัน python scan.py2โพสต์เฉพาะคำตัดสิน BUY: symbol, confidence, x_read3ถ้า Rugcheck หรือ DexScreener ล่ม ให้บอกว่าตัวไหนล่มแค่ครั้งเดียว ไม่ต้องบอกทุกรอบ
1ทุกวันเวลา 21:30 ใน /workspace/desk ให้รัน python report.py แล้วโพสต์ผลลัพธ์ที่นี่2เพิ่มสิ่งที่เวิร์กในวันนี้หนึ่งอย่าง และตัวเลขใน config.py ที่คุณตั้งคำถามอีกหนึ่งตัว พร้อมเหตุผล3ห้ามเปลี่ยนตัวเลขนั้นด้วยตัวเองเด็ดขาด
นี่คือสองไฟล์ที่รูทีนเหล่านั้นเรียกใช้ บันทึกเป็น report.py:
1# report.py2# รายงานช่วงเย็น ทุกอย่างในนี้ได้มาจาก checks.csv และ trades.csv ไม่มีอะไรมาจากความจำ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"รายงานช่วงเย็น {day} {'(PAPER)' if PAPER else '(LIVE)'}")19print(f"ตรวจสอบแล้ว: {len(checks)}")20print(f"ถูกตัดโดยตัวกรอง rug: {by_stage['facts']} | โดย pool: {by_stage['pool']} | "21 f"โดย Grok: {by_stage['grok']} | โดย limits: {by_stage['limits']}")22print(f"ซื้อแล้ว: {len(buys)} | เปิดอยู่ตอนนี้: {len(book.load())}")23print(f"pnl ที่รับรู้วันนี้: ${book.today_pnl():+.2f}")24if done:25 print(f"ออกทำกำไร: {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"ดีที่สุด: {best['symbol']} ${float(best['pnl']):+.2f} | แย่ที่สุด: {worst['symbol']} ${float(worst['pnl']):+.2f}")29if reasons:30 top, n = reasons.most_common(1)[0]31 print(f"สาเหตุที่ถูกตัดบ่อยสุด: {top} ({n} ครั้ง)")
และ scan.py ซึ่งเป็นแหล่งหา lead แบบเสริม มันจะดึงโทเค็น Solana ใหม่เอี่ยมที่เพิ่งจ่ายเงินซื้อโปรไฟล์ DexScreener โปรไฟล์แบบจ่ายเงินไม่ใช่สัญญาณบอกคุณภาพ มันแค่บอกว่า dev ยอมควักกระเป๋า ส่วนที่เหลือปล่อยให้ตัวกรองจัดการ:
1# scan.py2# แหล่งหา lead แบบเสริม: โทเค็น Solana ใหม่เอี่ยมที่เพิ่งจ่ายเงินซื้อโปรไฟล์ DexScreener3# โปรไฟล์แบบจ่ายเงินไม่ใช่สัญญาณบอกคุณภาพ มันแค่บอกว่า dev ยอมควักกระเป๋า ตัวกรองจะเป็นคนตัดสิน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]: # ห้าตัวต่อรอบ เพื่อไม่ให้ชั่วโมงที่ยุ่งจัดๆ มาสูบงบ API จนหมด15 subprocess.run([sys.executable, "check.py", mint])
เรื่องสุดท้ายสำหรับคืนนี้: Settings, General, Auto-review เพิ่มกฎ Ask first สองข้อ กฎพวกนี้จะหยุดการทำงานและรอคุณเสมอ ไม่ว่ารูทีนไหนจะคิดยังไงก็ตาม:
1ถามก่อนทุกครั้งที่จะเชื่อมต่อกระเป๋า เซ็นชื่อ สวอป หรือโอน2ถามก่อนทุกครั้งที่จะแก้ไขไฟล์ชื่อ config.py


14. เล่นกระดาษหนึ่งสัปดาห์ ก่อนใช้เงินจริงแม้แต่ดอลลาร์เดียว
PAPER = True หมายถึง desk ทำทุกอย่างเหมือนจริง ยกเว้นเรื่องเงิน โทเค็นจริง ราคาจริง จุดออกจริง แต่ fill เป็นของปลอม พอครบเจ็ดวัน ให้เปิด checks.csv แล้วอ่านมันเหมือนคนแปลกหน้าที่เขียนขึ้นมา
สิ่งที่คุณต้องมองหา: การตรวจสอบข้อไหนตัดทิ้งเยอะที่สุด, คำสั่ง BUY ที่ได้มานั้นเป็นของที่คุณจะซื้อจริงไหม, และมีเหตุผล SKIP ไหนที่ดูผิดเพี้ยนไปบ้าง การ fill แบบ paper เกิดขึ้นที่ราคาบนหน้าจอ แต่การ fill แบบ live ไม่มีทางเกิดขึ้นแบบนั้น ดังนั้นให้ถือว่าผลแบบ paper เป็นเพดานสูงสุด ไม่ใช่การคาดการณ์ล่วงหน้า
พอถึงเวลาเล่นจริง แค่พลิก PAPER เป็น False แล้วทุกอย่างจะเหมือนเดิม ยกเว้นขั้นตอนสุดท้าย check.py จะหยุดซื้อแล้วโพสต์บรรทัดขออนุมัติแทน: ให้คุณซื้อ $25 ด้วยตัวเองในกระเป๋าของคุณ จากนั้นใช้คำสั่งเดียวโยนมันเข้า book เพื่อให้ watch.py เริ่มเฝ้าระวังมัน
ตอนที่มันพัง
ระบบนี้แตะเรื่องเงิน ดังนั้นทุกความล้มเหลวต้องมีคำตอบเขียนไว้ก่อนที่มันจะเกิด
1401 จาก xAI -> คีย์ผิด เข้าควบคุมเอง เขียน .env ใหม่ แล้วรัน curl จากขั้นตอน 03 อีกครั้ง2400 / 404 จาก xAI -> ชื่อโมเดลเปลี่ยน แก้ MODEL ใน config.py แค่นั้นพอ3429 จาก xAI -> ติด rate limit โทเค็นนั้นคือ SKIP รอบถัดไปจะไปต่อ ห้ามวนลูปมันเด็ดขาด4error เรื่อง x_search -> MODEL ของคุณค้นหา X ไม่ได้ ไปเลือกตัวที่ทำได้ใน console.x.ai -> Models5Grok ตอบมาเป็นบทความ -> ValueError, ถูกบันทึก, SKIP ห้ามแปลงย่อหน้าให้เป็นคำสั่งเทรดเด็ดขาด6rugcheck ได้ 404 หรือว่างเปล่า -> ใหม่เกินกว่าจะถูก index SKIP ของใหม่ไม่ได้แปลว่าสะอาด7lp_unlocked ขึ้นกับทุกอย่าง -> pool บางประเภทไม่มี LP token เลย ลองเปิดดูเองสักตัวบน rugcheck8 ก่อนไปแตะตัวเลขนั้น แล้วค่อยแก้ด้วยการเขียนลงไป9no_pool -> ยังไม่ได้เทรดบน DEX หรือไม่ใช่ Solana SKIP10รูทีนเงียบหายไป -> Grok Bot จะหยุดรูทีนชั่วคราวหลังคุณหายไปนาน11 ให้เปิด Routines แล้วสวิตช์มันกลับมา
บิลค่าใช้บริการ
ทุกอย่างก่อนถึงผู้พิพากษานั้นฟรี: limits, Rugcheck, DexScreener ขั้นตอนเดียวที่ต้องจ่ายเงินคือการเรียก Grok หนึ่งครั้งต่อโทเค็นที่รอดจากการตรวจสอบทั้ง 13 ข้อ โดยเปิดการค้นหา X ไว้
1cost_per_token = input_tokens / 1_000_000 * price_per_M_input2 + output_tokens / 1_000_000 * price_per_M_output3 + posts_fetched / 1_000 * 5 # ค้นหา X: $5 ต่อ 1,000 โพสต์ที่ดึงมา45max_turns = 2 ช่วยจำกัดการค้นหาไว้ที่สองรอบ ทำให้ posts_fetched น้อยอยู่เสมอ6ทุก response จะรายงาน x_posts_fetched ของตัวเอง ดังนั้นแค่วันแรกคุณก็รู้ตัวเลขจริงแล้ว78ราคา: [ราคาจาก console.x.ai]
จุดที่คนมักเข้าใจผิด: ค่าบริการจะเพิ่มขึ้นตามจำนวนผู้รอดชีวิต ไม่ใช่ตาม scanner scan.py สามารถป้อนโทเค็นให้ desk ได้ 240 ตัวต่อวัน และส่วนใหญ่ตายฟรีตั้งแต่ก่อนที่ Grok จะได้ยินชื่อพวกมันด้วยซ้ำ

ส่วนสำคัญ
นี่คือเซ็ตอัปของผม ไม่ใช่กลยุทธ์ของคุณ
ตัวเลขทุกตัวใน config.py เป็นของผม เลือกมาเพื่อตั๋ว $25 และความทนทานของผมเองในการนั่งมองบางสิ่งร่วงลงเหลือศูนย์ memecoins ส่วนใหญ่จบที่ศูนย์จริงๆ และคนที่เทรดมันส่วนใหญ่ก็ขาดทุน ตัวกรองไม่ได้ทำให้โทเค็นกลายเป็นของดี มันแค่กำจัดวิธีเจ็บตัวที่เห็นได้ชัดออกไป และบังคับให้คุณต้องอ่านว่าทำไมโทเค็นแต่ละตัวถึงตาย
ลองรันแบบ paper หนึ่งสัปดาห์ อ่านเหตุผลที่ถูกตัดทิ้ง เลื่อนตัวเลขตรงที่คุณไม่เห็นด้วย แล้วเขียนมันลงไป ลอกโครงสร้างมาใช้ อย่าลอกค่าคงที่ นี่ไม่ใช่คำแนะนำทางการเงิน
โค้ดเป็นคนฆ่า Grok เป็นคนอ่าน X คุณเป็นคนเซ็น สคริปต์ไม่มีสิทธิ์ใช้วิจารณญาณ Grok ไม่มีสิทธิ์จับเครื่องคิดเลข และไม่มีใครนอกจากคุณที่ได้จับกระเป๋า
เซฟเรื่องนี้ไว้ก่อนการซื้อครั้งต่อไปของคุณ กดติดตามถ้าคุณกะจะรันระบบแบบเดียวกัน จะมีอะไรแบบนี้มาอีก 🫶
tg ของผม - t.me/+8wAXS0nHWgA2MGEy
github ของผม - github.com/0xboan
เทรดที่นี่ - fomo.family/r/0xboan





