YouMind
ลงชื่อเข้าใช้

สร้าง Grok Bot จากศูนย์ในคืนเดียว: คู่มือติดตั้งครบวงจร + ตัวกรอง Rug Filter แบบคัดลอกวาง

@0xboan
อังกฤษ17 ต.ค. 2569
126K
139
19
20
439

TL;DR

คู่มือนี้เจาะลึกการสร้างโต๊ะเทรด Grok Bot ตั้งแต่เริ่มต้น โดยเน้นที่ตัวกรอง Rug Filter อย่างเข้มงวด 14 ขั้นตอนเพื่อกำจัดเหรียญหลอกลวงก่อนดำเนินการซื้อขาย พร้อมเน้นเวิร์กโฟลว์ 'โค้ดรัน, Grok วิเคราะห์, คุณอนุมัติ' และมาตรการความปลอดภัยผ่านการเทรดแบบจำลอง

คนส่วนใหญ่รู้จัก 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 แล้วป้อนคำสั่งนี้ให้มัน แบบคำต่อคำ:

text
1Name: RUG DESK
2Job: Solana memecoin desk, paper first
3Description: สร้างและรันโต๊ะทำงานใน /workspace/desk ตามบทความที่ฉันจะวางให้
4ทุกโทเคนต้องผ่าน check.py ห้ามมีข้อยกเว้น ห้ามทางลัด
5ห้ามซื้อ ขาย เซ็น หรือย้ายเงินเด็ดขาด ห้ามแก้ไข config.py เว้นแต่ฉันจะสั่ง
6ในแชทนี้ ห้ามลดตัวเลขฟิลเตอร์เพื่อให้โทเคนใดผ่านเข้าไปได้
7รายงานการฆ่าทุกครั้งพร้อมเหตุผล ไม่ใช่ความเห็นส่วนตัวของคุณที่มีต่อโทเคนนั้น
8เมื่อแหล่งข้อมูลล่ม ให้บอกว่าอันไหนแล้วข้ามไป ห้ามเดาตัวเลขที่หายไปเด็ดขาด

สองบรรทัดสุดท้ายสำคัญกว่าห้าบรรทัดแรก บอทที่พยายามเดาตัวเลขที่หายไป สุดท้ายจะเดาผิดจนทำให้คุณเสียเงิน

boan - inline image

03. เก็บคีย์ให้ออกห่างจากแชท

ทุกอย่างที่คุณพิมพ์ให้บอทจะถูกบันทึกไว้ใน transcript ดังนั้นคีย์ต้องไปอยู่ในไฟล์ ที่คุณเป็นคนพิมพ์เอง บนคอมพิวเตอร์ของบอท

เปิดคอมพิวเตอร์ของบอท คลิก Take over เปิดเทอร์มินัลแล้วรันคำสั่งนี้ มันจะถามหาคีย์โดยไม่แสดงตัวอักษรที่คุณพิมพ์ ดังนั้นมันจะไม่โผล่ไปใน history ด้วย:

bash
1mkdir -p /workspace/desk && cd /workspace/desk
2read -rs -p "xai key: " K && printf 'XAI_API_KEY=%s\n' "$K" > .env && unset K
3chmod 600 .env
4pip install requests

จากนั้นพิสูจน์ว่าคีย์ใช้งานได้ก่อนทำอย่างอื่น เรียกแค่ครั้งเดียว เพื่อที่คุณจะได้ไม่สับสนระหว่างคีย์พังกับพรอมต์พังในตอนหลัง:

bash
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"}'
5
6-> ... "type":"output_text","text":"OK" ...

คลิก I'm done แล้วคืนคอมพิวเตอร์กลับไป จากจุดนี้เป็นต้นไปบอทจะสามารถรันโต๊ะนี้ได้โดยที่มันไม่เคยเห็นคีย์ในแชทเลย

boan - inline image

04. ดูภาพรวมของ funnel ทั้งหมดก่อนลงมือสร้าง

แปดด่าน ด่านฟรีๆ จะรันก่อน เฉพาะตัวที่รอดจากด่านฟรีเท่านั้นที่จะเปลืองการเรียก Grok และเฉพาะตัวที่ Grok บอกว่า BUY เท่านั้นที่จะเปลืองเงิน สัปดาห์นี้ แม้แต่เรื่องนั้นก็ยังไม่เกิด

text
10. LEAD CA จากที่ไหนก็ได้: จากการเรียก โพสต์ หรือ scan.py -> หนึ่ง mint
21. 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 stop
87. REPORT report.py ตอน 21:30 -> อะไรตาย อะไรจ่าย อะไรต้องตั้งคำถาม

การที่ mint authority ยังเปิดอยู่ไม่ใช่เรื่องของวิจารณญาณ มันคือข้อเท็จจริง และข้อเท็จจริงนั้นฟรี Grok จะได้เห็นเฉพาะโทเคนที่ผ่านการตรวจสอบทุกอย่างที่สคริปต์ทำได้มาแล้วเท่านั้น

boan - inline image

05. ใส่ตัวเลขทุกอย่างไว้ในไฟล์เดียว

เซฟเป็น config.py ทุกตัวเลขบนโต๊ะตัวนี้จะอยู่ที่นี่ เวลาคุณปรับจูน คุณก็แก้แค่ไฟล์นี้ไฟล์เดียว ไม่ต้องแตะอะไรอื่น นี่คือตัวเลขของผม ปรับมาสำหรับไม้ละ 25 ดอลลาร์ มันไม่ใช่คำแนะนำ แต่มันคือจุดเริ่มต้นที่คุณจะต้องขยับมันเอง

python
1# config.py
2# ทุกตัวเลขบนโต๊ะตัวนี้อยู่ที่นี่ เวลาคุณปรับจูน คุณแก้แค่ไฟล์นี้ไฟล์เดียว ไม่ต้องแตะอะไรอื่น
3
4MODEL = "grok-4.7" # เช็ค console.x.ai -> Models ถ้า API ปฏิเสธ
5PAPER = True # สัปดาห์แรก: เติมไม้ปลอมด้วยราคาจริง เปลี่ยนค่านี้ก็ต่อเมื่อคุณอ่าน log จบแล้ว
6
7TICKET_USD = 25 # คงที่ ห้ามคำนวณขนาดจากกำไรครั้งก่อนเด็ดขาด
8MAX_OPEN = 4 # 4 x $25 = $100 ในตลาด สูงสุดเท่านี้
9MAX_ENTRIES_PER_DAY = 6
10DAILY_LOSS_HALT_USD = 50 # ขาดทุนจริงวันนี้แตะเลขนี้ -> ห้ามเข้าไม้ใหม่จนถึงพรุ่งนี้
11COOLDOWN_HOURS = 24 # ห้ามกลับเข้าไปในโทเคนที่เพิ่งขายออกไป
12
13FACTS = { # ฟิลเตอร์กรอง 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 + ผลจากกราฟ insider
19 "min_liquidity_usd": 30000,
20 "max_ticket_share": 0.01, # ไม้ของคุณต้องไม่เกิน 1% ของพูล
21 "min_age_min": 30, # อายุน้อยกว่านี้ ทุกบทวิเคราะห์ก็ยังเป็นการเดาอยู่
22 "max_age_hours": 72,
23}
24
25MIN_CONFIDENCE = 0.7 # ถ้า Grok บอก BUY แต่ความมั่นใจต่ำกว่านี้ -> ให้ถือเป็น SKIP
26
27EXIT = {
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}
35
36LOG = "checks.csv"
37POSITIONS = "positions.json"
38TRADES = "trades.csv"
text
1ไม้คงที่ ขนาดไม้จะไม่โตขึ้นเพียงเพราะสามครั้งล่าสุดคุณชนะ
2บอทอ่าน config.py แต่มันจะไม่เขียนทับ ตัวเลขจะขยับก็ต่อเมื่อคุณเป็นคนขยับมัน
3การผ่อนฟิลเตอร์ต้องประกาศเป็นลายลักษณ์อักษร ถ้าคุณเปลี่ยนตัวเลข คุณต้องบอกเหตุผลในแชทภายในวันเดียวกัน

06. รันขีดจำกัดก่อนทำอย่างอื่นเสมอ

เซฟเป็น book.py การตรวจสอบที่ถูกที่สุดบนโต๊ะนี้คืออันที่ไม่ต้องเรียก API เลย ถ้าวันนี้ขาดทุนไปแล้ว 50 ดอลลาร์ โต๊ะตัวนี้จะไม่แม้แต่จะมองโทเคนนั้น ถ้าเปิดสถานะอยู่สี่ตำแหน่ง ก็เช่นเดียวกัน ไฟล์นี้ยังเป็นความทรงจำของโต๊ะด้วย: สองไฟล์ที่คุณเปิดดูเองได้ คือ positions.json และ trades.csv

python
1# book.py
2# สถานะ การเทรด ขีดจำกัด ความทรงจำของโต๊ะอยู่ในสองไฟล์ที่คุณเปิดดูเองได้
3import csv, json, os, sys, time
4from config import (POSITIONS, TRADES, TICKET_USD, MAX_OPEN, MAX_ENTRIES_PER_DAY,
5 DAILY_LOSS_HALT_USD, COOLDOWN_HOURS)
6
7def load() -> dict:
8 return json.load(open(POSITIONS)) if os.path.exists(POSITIONS) else {}
9
10def save(book: dict):
11 json.dump(book, open(POSITIONS, "w"), indent=2)
12
13def trades() -> list[dict]:
14 return list(csv.DictReader(open(TRADES))) if os.path.exists(TRADES) else []
15
16def 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})
24
25def 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))
28
29def 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 None
42
43def 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")
49
50def 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"] -= q
57 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 pnl
63
64if __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:

python
1# watch.py
2# ทุกสถานะที่เปิดอยู่ ทุกๆ 10 นาที ไม่พิมพ์อะไรเลยถ้าไม่มีอะไรเปลี่ยนแปลง
3import time
4from config import EXIT, PAPER
5from market import pool
6import book
7
8def 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 continue
16 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 continue
20
21 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) * 100
25 hours = (time.time() - s["opened"]) / 3600
26
27 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}")
32
33 if m["liq_usd"] < s["liq0"] * (1 - EXIT["liq_drop_pct"] / 100):
34 out(1.0, "liquidity_pulled"); continue
35 if pct <= EXIT["stop_pct"]:
36 out(1.0, "stop"); continue
37 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 continue
44 if s["steps"] > 0 and price <= s["peak"] * (1 - EXIT["trail_pct"] / 100):
45 out(1.0, "trailing_stop"); continue
46 if hours >= EXIT["time_stop_hours"] and pct < EXIT["time_stop_min_pct"]:
47 out(1.0, "time_stop")
48 return events
49
50if __name__ == "__main__":
51 for e in watch():
52 print(e)
text
1สภาพคล่องต้องมาก่อน พูลที่ถูกดึงออกชนะทุกกฎเกณฑ์ แม้แต่ในสถานะที่กำลังกำไร
2TRAILING STOP จะเริ่มทำงานหลังจากการขายทำกำไรครั้งแรก ก่อนหน้านั้น -35% คือพื้นเดียวที่มี
3เงินตายก็คือการขาดทุนเช่นกัน หกชั่วโมงที่ราคาไม่ขยับคือการคืนช่องว่างนั้นให้กับโทเคนตัวถัดไป
4ความเงียบก็คือสถานะ watch.py จะไม่พิมพ์อะไรเลยถ้าไม่มีอะไรเปลี่ยนแปลง ดังนั้นแชทที่เงียบแปลว่าคุณไม่ต้องไปดูมัน
boan - inline image

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 ไหนส่งกลับมาให้ได้

boan - inline image

09. ปล่อยให้โค้ดฆ่าพวกที่เห็นชัดๆ

การตรวจสอบข้อ 1 ถึง 9 มันจะดึงรายงานมาหนึ่งชุดและเก็บไว้เฉพาะฟิลด์ที่โต๊ะตัวนี้อ่าน Grok จะไม่เห็นรายงานดิบๆ เพราะ payload ที่ใหญ่เกินไปจะกิน token และทำลายความแม่นยำ

รายละเอียดหนึ่งที่คนมักพลาด: vault ของพูลเองและล็อกเกอร์จะอยู่ในรายชื่อผู้ถืออันดับต้นๆ ถ้านับพวกนี้รวมไปด้วย ทุกโทเคนก็จะดูเหมือนโทเคนที่วาฬถือ โค้ดจะตัดพวกนี้ออกก่อนนำไปรวมยอด top 10

python
1# rugcheck.py
2# รายงานหนึ่งชุดต่อโทเคน ตัดแต่งเหลือแค่ฟิลด์ที่โต๊ะตัวนี้อ่าน Grok จะไม่เห็นรายงานดิบๆ
3import requests
4from config import FACTS
5
6RC = "https://api.rugcheck.xyz/v1/tokens"
7
8def 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 {}
14
15 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")
18
19 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 0
26 risks = d.get("risks") or []
27
28 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 }
43
44def 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
boan - inline image

10. ตรวจสอบพูล ไม่ใช่แค่สัญญา

การตรวจสอบข้อ 10 ถึง 13 สัญญาอาจจะสมบูรณ์แบบแต่พูลก็ยังไม่ยอมให้คุณออกอยู่ดี โค้ดนี้จะอ่านพูลที่ลึกที่สุดของโทเคนนั้นแล้วถามคำถามน่าเบื่อๆ สี่ข้อ: มีเงินในนั้นพอไหม ไม้ของเราใหญ่แค่ไหนเมื่อเทียบกับมัน มันอายุเท่าไหร่แล้ว และมีคนขายจริงๆ ไหม

python
1# market.py
2# ตัวพูลเอง: ความลึก อายุ ราคา และว่ามีคนขายได้จริงไหม
3import time
4import requests
5from config import FACTS, TICKET_USD
6
7DS = "https://api.dexscreener.com/tokens/v1/solana"
8
9def 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 None
17 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 }
30
31def 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:

python
1# grok.py
2# ไฟล์เดียวที่เก็บคีย์ และเป็นจุดเดียวที่ desk สื่อสารกับ xAI
3import os, json, datetime, requests
4from config import MODEL
5
6URL = "https://api.x.ai/v1/responses"
7
8def _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 k
17
18def _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)
28
29def 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 นี่คือไฟล์ที่คุณจะกลับมาอ่านจริงๆ:

python
1# prompts.py
2# พรอมต์ Grok เพียงตัวเดียวบน desk นี่คือไฟล์ที่คุณจะกลับมาอ่านจริงๆ
3
4JUDGE_PROMPT = """
5คุณคือ RUG DESK มี Solana memecoin ตัวหนึ่งเพิ่งผ่านการตรวจสอบแบบเข้มงวดทุกข้อในโค้ดแล้ว:
6authorities, LP, holders, dev wallet, insiders, pool depth, age
7ห้ามตรวจตัวเลขเหล่านั้นซ้ำ คุณเป็นคนตัดสินใจว่าจะใส่ตั๋วแบนๆ ใบนี้เข้าไปหรือไม่
8คุณห้ามกำหนดขนาด และห้ามเลือกจุดออกโดยเด็ดขาด
9
10INPUT: {"token": {...ข้อเท็จจริงจาก rugcheck...}, "pool": {...ข้อเท็จจริงจาก dexscreener...}}
11
12ขั้นตอนที่ 1 ค้นหา ticker และ contract address บน X ในช่วง 72 ชั่วโมงที่ผ่านมา
13ขั้นตอนที่ 2 ตัดสินเฉพาะสิ่งที่โค้ดมองไม่เห็น:
14 - ความเสี่ยงระดับ warn รวมกันแล้วกลายเป็นเรื่องที่แย่ลงไหม
15 - ใครโพสต์ก่อน: dev, บัญชีจริงที่มีประวัติ หรือคลื่นบัญชีใหม่ที่ผุดขึ้นมาพร้อมกัน
16 - ออร์แกนิกหรือซื้อโพสต์: ถ้อยคำเหมือนกัน นาทีเดียวกัน บัญชีที่ไม่มีอดีต
17 - contract address ในโพสต์เหล่านั้นตรงกับที่อยู่ใน INPUT หรือไม่
18 - ชื่อ ticker นี้หรือ dev คนนี้เคยเกี่ยวข้องกับ rug มาก่อนไหม
19
20ส่งคืนเฉพาะ JSON:
21{"verdict": "BUY" | "SKIP", "confidence": 0.0-1.0,
22 "why": "สูงสุดสองบรรทัด", "x_read": "หนึ่งบรรทัดว่า X ดูเป็นอย่างไร",
23 "main_risk": "หนึ่งบรรทัด"}
24
25ถ้าไม่มีโพสต์บน X เลย นั่นคือคำตอบ: ไม่มีใครรู้ว่ามันมีอยู่ SKIP
26ถ้ามี contract address อื่นภายใต้ ticker เดียวกันบน X: เสี่ยงเป็นของลอก SKIP
27ห้ามตอบ BUY เมื่อฟิลด์ที่คุณต้องการเป็น null
28ห้ามพูดถึงราคาเป้าหมาย คุณไม่รู้เรื่องนั้น
29"""

12. รวบทุกอย่างเข้าด้วยกันด้วยคำสั่งเดียว

ป้อน contract address เข้ามาหนึ่งอัน ได้คำตัดสินออกมาหนึ่งอัน ขีดจำกัด ข้อเท็จจริง pool Grok ตามลำดับนี้ และตัวแรกที่บอกว่าไม่ผ่านก็จบเกม:

python
1# check.py
2# ป้อน contract address เข้ามาหนึ่งอัน ได้คำตัดสินออกมาหนึ่งอัน ทำงานทุกครั้งที่โทเค็นวิ่งผ่าน desk ของคุณ
3import csv, json, os, sys, time
4from config import LOG, MIN_CONFIDENCE, PAPER, TICKET_USD
5from rugcheck import report, fact_kill
6from market import pool, market_kill
7from grok import ask
8from prompts import JUDGE_PROMPT
9import book
10
11def 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})
19
20def check(mint: str) -> dict:
21 if (g := book.guard(mint)): # limits, ฟรี
22 return {"stage": "limits", "verdict": "SKIP", "reason": g}
23
24 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"]}
30
31 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"]}
37
38 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}"}
42
43 verdict, conf = ans.get("verdict"), ans.get("confidence") or 0
44 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"]}
49
50if __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>" แล้วมันจะรันแค่บรรทัดเดียว สิ่งที่ได้กลับมามีหน้าตาแบบนี้ (ตัวอย่างโครงสร้าง ไม่ใช่โทเค็นจริง):

json
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}
boan - inline image
text
1ข้อเท็จจริงมาก่อนความคิดเห็น Grok ไม่เคยตัดสินใจว่า mint เปิดอยู่หรือไม่
2การเรียก API ที่ล้มเหลวคือการ SKIP Rugcheck ล่ม, DexScreener ล่ม, Grok ล่ม, JSON พัง: SKIP ทั้งหมด
3NULL ไม่ได้แปลว่าสะอาด ฟิลด์ไหนไม่ส่งค่ากลับมาจะฆ่าโทเค็นนั้นทิ้ง ไม่เคยทำให้มันผ่าน
4หนึ่งคำตัดสินต่อหนึ่งโทเค็น ห้ามรันซ้ำจนกว่ามันจะบอก BUY ถ้าคุณไม่เห็นด้วย แปลว่าคุณไม่เห็นด้วยกับ config.py
5อ่านเหตุผลที่ถูกตัดทิ้ง อย่าอ่านแค่ตอนซื้อ ตอนซื้อมันรู้สึกดี แต่เหตุผลที่ถูกตัดต่างหากที่บอกคุณว่าตัวกรองทำงานได้จริงไหม

13. สามรูทีน รูทีนละประโยค

ไม่ต้องใช้ workflow builder คุณแค่บอกรูทีนแต่ละตัวให้บอทฟังครั้งเดียวด้วยประโยคเดียว แล้วมันจะแสดงรอบการทำงานถัดไปให้คุณดู นี่คือของผม แบบคำต่อคำ:

text
1ทุก 10 นาที ใน /workspace/desk ให้รัน python watch.py
2ถ้ามันไม่พิมพ์อะไรออกมา ก็ไม่ต้องพูดอะไร ถ้ามันพิมพ์อะไรออกมา ให้โพสต์ที่นี่แบบคำต่อคำ
text
1ทุก 30 นาที ใน /workspace/desk ให้รัน python scan.py
2โพสต์เฉพาะคำตัดสิน BUY: symbol, confidence, x_read
3ถ้า Rugcheck หรือ DexScreener ล่ม ให้บอกว่าตัวไหนล่มแค่ครั้งเดียว ไม่ต้องบอกทุกรอบ
text
1ทุกวันเวลา 21:30 ใน /workspace/desk ให้รัน python report.py แล้วโพสต์ผลลัพธ์ที่นี่
2เพิ่มสิ่งที่เวิร์กในวันนี้หนึ่งอย่าง และตัวเลขใน config.py ที่คุณตั้งคำถามอีกหนึ่งตัว พร้อมเหตุผล
3ห้ามเปลี่ยนตัวเลขนั้นด้วยตัวเองเด็ดขาด

นี่คือสองไฟล์ที่รูทีนเหล่านั้นเรียกใช้ บันทึกเป็น report.py:

python
1# report.py
2# รายงานช่วงเย็น ทุกอย่างในนี้ได้มาจาก checks.csv และ trades.csv ไม่มีอะไรมาจากความจำ
3import csv, os, time
4from collections import Counter
5from config import LOG, PAPER
6import book
7
8day = 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"]
12
13by_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"))
17
18print(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 ยอมควักกระเป๋า ส่วนที่เหลือปล่อยให้ตัวกรองจัดการ:

python
1# scan.py
2# แหล่งหา lead แบบเสริม: โทเค็น Solana ใหม่เอี่ยมที่เพิ่งจ่ายเงินซื้อโปรไฟล์ DexScreener
3# โปรไฟล์แบบจ่ายเงินไม่ใช่สัญญาณบอกคุณภาพ มันแค่บอกว่า dev ยอมควักกระเป๋า ตัวกรองจะเป็นคนตัดสิน
4import csv, os, subprocess, sys
5import requests
6from config import LOG
7
8seen = {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]
13
14for mint in fresh[:5]: # ห้าตัวต่อรอบ เพื่อไม่ให้ชั่วโมงที่ยุ่งจัดๆ มาสูบงบ API จนหมด
15 subprocess.run([sys.executable, "check.py", mint])

เรื่องสุดท้ายสำหรับคืนนี้: Settings, General, Auto-review เพิ่มกฎ Ask first สองข้อ กฎพวกนี้จะหยุดการทำงานและรอคุณเสมอ ไม่ว่ารูทีนไหนจะคิดยังไงก็ตาม:

text
1ถามก่อนทุกครั้งที่จะเชื่อมต่อกระเป๋า เซ็นชื่อ สวอป หรือโอน
2ถามก่อนทุกครั้งที่จะแก้ไขไฟล์ชื่อ config.py
boan - inline image
boan - inline image

14. เล่นกระดาษหนึ่งสัปดาห์ ก่อนใช้เงินจริงแม้แต่ดอลลาร์เดียว

PAPER = True หมายถึง desk ทำทุกอย่างเหมือนจริง ยกเว้นเรื่องเงิน โทเค็นจริง ราคาจริง จุดออกจริง แต่ fill เป็นของปลอม พอครบเจ็ดวัน ให้เปิด checks.csv แล้วอ่านมันเหมือนคนแปลกหน้าที่เขียนขึ้นมา

สิ่งที่คุณต้องมองหา: การตรวจสอบข้อไหนตัดทิ้งเยอะที่สุด, คำสั่ง BUY ที่ได้มานั้นเป็นของที่คุณจะซื้อจริงไหม, และมีเหตุผล SKIP ไหนที่ดูผิดเพี้ยนไปบ้าง การ fill แบบ paper เกิดขึ้นที่ราคาบนหน้าจอ แต่การ fill แบบ live ไม่มีทางเกิดขึ้นแบบนั้น ดังนั้นให้ถือว่าผลแบบ paper เป็นเพดานสูงสุด ไม่ใช่การคาดการณ์ล่วงหน้า

พอถึงเวลาเล่นจริง แค่พลิก PAPER เป็น False แล้วทุกอย่างจะเหมือนเดิม ยกเว้นขั้นตอนสุดท้าย check.py จะหยุดซื้อแล้วโพสต์บรรทัดขออนุมัติแทน: ให้คุณซื้อ $25 ด้วยตัวเองในกระเป๋าของคุณ จากนั้นใช้คำสั่งเดียวโยนมันเข้า book เพื่อให้ watch.py เริ่มเฝ้าระวังมัน

ตอนที่มันพัง

ระบบนี้แตะเรื่องเงิน ดังนั้นทุกความล้มเหลวต้องมีคำตอบเขียนไว้ก่อนที่มันจะเกิด

text
1401 จาก xAI -> คีย์ผิด เข้าควบคุมเอง เขียน .env ใหม่ แล้วรัน curl จากขั้นตอน 03 อีกครั้ง
2400 / 404 จาก xAI -> ชื่อโมเดลเปลี่ยน แก้ MODEL ใน config.py แค่นั้นพอ
3429 จาก xAI -> ติด rate limit โทเค็นนั้นคือ SKIP รอบถัดไปจะไปต่อ ห้ามวนลูปมันเด็ดขาด
4error เรื่อง x_search -> MODEL ของคุณค้นหา X ไม่ได้ ไปเลือกตัวที่ทำได้ใน console.x.ai -> Models
5Grok ตอบมาเป็นบทความ -> ValueError, ถูกบันทึก, SKIP ห้ามแปลงย่อหน้าให้เป็นคำสั่งเทรดเด็ดขาด
6rugcheck ได้ 404 หรือว่างเปล่า -> ใหม่เกินกว่าจะถูก index SKIP ของใหม่ไม่ได้แปลว่าสะอาด
7lp_unlocked ขึ้นกับทุกอย่าง -> pool บางประเภทไม่มี LP token เลย ลองเปิดดูเองสักตัวบน rugcheck
8 ก่อนไปแตะตัวเลขนั้น แล้วค่อยแก้ด้วยการเขียนลงไป
9no_pool -> ยังไม่ได้เทรดบน DEX หรือไม่ใช่ Solana SKIP
10รูทีนเงียบหายไป -> Grok Bot จะหยุดรูทีนชั่วคราวหลังคุณหายไปนาน
11 ให้เปิด Routines แล้วสวิตช์มันกลับมา

บิลค่าใช้บริการ

ทุกอย่างก่อนถึงผู้พิพากษานั้นฟรี: limits, Rugcheck, DexScreener ขั้นตอนเดียวที่ต้องจ่ายเงินคือการเรียก Grok หนึ่งครั้งต่อโทเค็นที่รอดจากการตรวจสอบทั้ง 13 ข้อ โดยเปิดการค้นหา X ไว้

text
1cost_per_token = input_tokens / 1_000_000 * price_per_M_input
2 + output_tokens / 1_000_000 * price_per_M_output
3 + posts_fetched / 1_000 * 5 # ค้นหา X: $5 ต่อ 1,000 โพสต์ที่ดึงมา
4
5max_turns = 2 ช่วยจำกัดการค้นหาไว้ที่สองรอบ ทำให้ posts_fetched น้อยอยู่เสมอ
6ทุก response จะรายงาน x_posts_fetched ของตัวเอง ดังนั้นแค่วันแรกคุณก็รู้ตัวเลขจริงแล้ว
7
8ราคา: [ราคาจาก console.x.ai]

จุดที่คนมักเข้าใจผิด: ค่าบริการจะเพิ่มขึ้นตามจำนวนผู้รอดชีวิต ไม่ใช่ตาม scanner scan.py สามารถป้อนโทเค็นให้ desk ได้ 240 ตัวต่อวัน และส่วนใหญ่ตายฟรีตั้งแต่ก่อนที่ Grok จะได้ยินชื่อพวกมันด้วยซ้ำ

boan - inline image

ส่วนสำคัญ

นี่คือเซ็ตอัปของผม ไม่ใช่กลยุทธ์ของคุณ

ตัวเลขทุกตัวใน config.py เป็นของผม เลือกมาเพื่อตั๋ว $25 และความทนทานของผมเองในการนั่งมองบางสิ่งร่วงลงเหลือศูนย์ memecoins ส่วนใหญ่จบที่ศูนย์จริงๆ และคนที่เทรดมันส่วนใหญ่ก็ขาดทุน ตัวกรองไม่ได้ทำให้โทเค็นกลายเป็นของดี มันแค่กำจัดวิธีเจ็บตัวที่เห็นได้ชัดออกไป และบังคับให้คุณต้องอ่านว่าทำไมโทเค็นแต่ละตัวถึงตาย

ลองรันแบบ paper หนึ่งสัปดาห์ อ่านเหตุผลที่ถูกตัดทิ้ง เลื่อนตัวเลขตรงที่คุณไม่เห็นด้วย แล้วเขียนมันลงไป ลอกโครงสร้างมาใช้ อย่าลอกค่าคงที่ นี่ไม่ใช่คำแนะนำทางการเงิน

โค้ดเป็นคนฆ่า Grok เป็นคนอ่าน X คุณเป็นคนเซ็น สคริปต์ไม่มีสิทธิ์ใช้วิจารณญาณ Grok ไม่มีสิทธิ์จับเครื่องคิดเลข และไม่มีใครนอกจากคุณที่ได้จับกระเป๋า

เซฟเรื่องนี้ไว้ก่อนการซื้อครั้งต่อไปของคุณ กดติดตามถ้าคุณกะจะรันระบบแบบเดียวกัน จะมีอะไรแบบนี้มาอีก 🫶

tg ของผม - t.me/+8wAXS0nHWgA2MGEy

github ของผม - github.com/0xboan

เทรดที่นี่ - fomo.family/r/0xboan

บันทึกในคลิกเดียว

อ่านบทความไวรัลเชิงลึกด้วย AI ใน YouMind

บันทึกแหล่งที่มา ถามคำถามที่ตรงประเด็น สรุปข้อโต้แย้ง และเปลี่ยนบทความไวรัลให้เป็นโน้ตที่นำกลับมาใช้ได้ใน AI เวิร์กสเปซเดียว

สำรวจ YouMind
สำหรับครีเอเตอร์

เปลี่ยน Markdown ของคุณให้เป็นบทความ 𝕏 ที่สะอาดตา

เวลาคุณเผยแพร่งานเขียนยาวของตัวเอง การจัดรูปแบบรูปภาพ ตาราง และบล็อกโค้ดให้เข้ากับ 𝕏 นั้นน่าปวดหัว YouMind เปลี่ยนร่าง Markdown ทั้งฉบับให้เป็นบทความ 𝕏 ที่สะอาดตาและพร้อมโพสต์ทันที

ลอง Markdown เป็น 𝕏

แพตเทิร์นให้ถอดรหัสเพิ่มเติม

บทความไวรัลล่าสุด

สำรวจบทความไวรัลเพิ่มเติม