çoğu kişi Grok Bot'la başkasının pnl ekran görüntüsü sayesinde tanışır, açar, bir grafiğe doğrultur ve daha kendileri almadan ölmüş bir tokene ilk 50 dolarını kaptırır. sorun bot değildi. kimse ona "ölü"nün neye benzediğini söylememişti.
bu, sıfırdan başlasam bu gece yine kuracağım düzendir. bir bot, bir klasör, on küçük dosya. 100x peşinde koşmaz. asıl işi tokenleri elemektir ve hayatta kalan birkaç tanesi için bile Grok'un tek bir dolar hareket etmeden önce X'i okuması gerekir.
01'den 07'ye kadar olan adımlar ilk akşamın işidir: bot, anahtar, limitler, çıkışlar. 08'den 12'ye kadar olanlar rug filtresidir; 14 kontrol, her biri kod olarak yazılmıştır. 13 ve 14 ise sistemi önce kağıt üzerinde otopilota alır.
sekiz ajanlı masam hakkındaki yazımı okuduysanız, bu o masanın üzerine kurulduğu temeldir.
https://x.com/0xboan/status/2092226208234647626
bunu nasıl kullanacaksın: Grok Bot'unu aç, bu makalenin tamamını yapıştır ve şunu de: "bu masayı /workspace/desk içinde, kağıt modunda kur; cüzdana dokunacak herhangi bir şeyden önce bana sor." tüm dosyaları kendi bilgisayarında kendisi yazar.
asla unutmaman gereken ayrım şudur: kod eler, Grok X'i okur, sen imzalarsın. masadaki kimse başkasının işini yapmaz.
01. başlamadan önce dört şeyi hazırla
dört şey. her biri ne olduğunu, bu gece ne yapacağını ve masanın buna neden ihtiyacı olduğunu anlatır.
1. Grok Bot
ne olduğu. İsim vererek bot tuttuğun uygulama. her biri tarayıcısı, dosyaları ve terminali olan bir bulut bilgisayarda çalışır ve sen dizüstü bilgisayarını kapatsan bile çalışmaya devam eder.
ne yapacaksın. x.ai/bot adresinden indir, giriş yap, Create your own (Kendi botunu oluştur) seçeneğine tıkla.
neden. masanın tamamı o bilgisayarda yaşar. dosyalar, rutinler, alarmlar... hepsi telefonundan açabileceğin tek bir yerde.
2. bir xAI API anahtarı
ne olduğu. İçinde X araması barındıran, koddan Grok'a ücretli erişim.
ne yapacaksın. console.x.ai, API Keys, yeni bir tane oluştur. henüz hiçbir yere yapıştırma, nereye gideceğini 03. adım söylüyor.
neden. bir rutin sohbette oturup kırk token hakkında düşünemez. ama token başına tek çağrı yapan bir script bunu yapabilir ve her yanıtı aynı formatta kaydeder.
3. Rugcheck ve DexScreener
ne olduğu. iki ücretsiz açık API. Rugcheck kontratı okur: yetkiler, LP, sahipler, içeriden öğrenenler, geliştirici cüzdanı. DexScreener havuzu okur: derinlik, yaş, satışlara karşı alımlar.
ne yapacaksın. hiçbir şey. kayıt yok, okuma işlemleri için anahtar yok.
neden. gerçekler fikirlerden önce gelir. açık bir mint yetkisi kişisel bir yorum değil, bir gerçektir ve gerçekler ilk eler.
4. tek kullanımlık bir cüzdan, ama bu gece değil
ne olduğu. daha önce başka hiçbir şey tutmamış, tertemiz bir Solana cüzdanı.
ne yapacaksın. şimdilik hiçbir şey. ilk hafta kağıt üzerinde geçecek.
neden. masa asla bir anahtar tutmaz. canlıya geçtiğinde sana ne alacağını söyler ve sen kendin imzalarsın.
02. sekiz değil, bir bot tut
benim masam şu an sekiz botla çalışıyor. böyle başlamadı, seninki de başlamamalı. ilk gün sekiz bot, aynı anda hata ayıklanacak sekiz şey demektir. tek işi olan bir bot, diğer yedisinin ileride nelere ihtiyacı olacağını sana gösterir.
Create your own seçeneğini seç ve kelimesi kelimesine şunu ver:
1İsim: RUG DESK2Görev: Solana memecoin masası, önce kağıt üzerinde3Açıklama: Yapıştırdığım makaledeki masayı /workspace/desk içinde kur ve çalıştır.4Her token istisnasız ve kestirme yol olmadan check.py'den geçer.5Asla fon almaz, satmaz, imzalamaz veya taşırsın. Bu sohbette ben istemedikçe config.py'yi asla düzenlemezsin.6Bir tokenin geçmesi için filtre değerlerini asla düşürmezsin.7Her eleme işlemini token hakkındaki fikrinle değil, gerekçesiyle raporla.8Bir kaynak çöktüğünde hangisi olduğunu söyle ve atla. Eksik bir sayıyı asla tahmin etme.
son iki satır, ilk beş satırdan daha önemlidir. eksik bir sayıyı tahmin eden bir bot, eninde sonunda sana pahalıya patlayacak bir sayıyı da tahmin edecektir.

03. anahtarı sohbetten uzak tut
bir bota yazdığın her şey bir kayda düşer. bu yüzden anahtar, botun bilgisayarında senin tarafından yazılarak bir dosyaya gider.
botun bilgisayarını aç, Take over (Devral) butonuna tıkla, terminali aç ve şunu çalıştır. anahtarı ekrana yansıtmadan sorar, böylece geçmişte de görünmez:
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
ardından başka hiçbir şey yapmadan önce anahtarın çalıştığını kanıtla. tek bir çağrı; böylece ileride kötü bir anahtarla kötü bir prompt'u birbirine karıştırmazsın:
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 (Bittim) butonuna tıkla ve bilgisayarı geri bırak. bundan sonra bot masayı çalıştırabilir ve anahtarı sohbette asla görmez.

04. huninin tamamını inşa etmeden önce gör
sekiz aşama. ücretsiz olanlar önce çalışır. sadece ücretsiz aşamalardan sağ çıkanlar bir Grok çağrısına mal olur ve sadece Grok'un AL (BUY) dediği şey paraya mal olur. bu hafta o bile değil.
10. ADAY Herhangi bir yerden gelen bir CA: bir çağrı, bir gönderi, scan.py -> tek mint21. LİMİTLER book.py: günlük zarar, açık slotlar, bekleme süresi -> ücretsiz, ağ bağlantısı bile gerektirmez32. GERÇEKLER rugcheck.py: 10 kesin eleme -> açık mint, kilitsiz LP, şişik ilk 10 burada ölür43. HAVUZ market.py: derinlik, yaş, satışlar -> sığ havuzlar ve honeypot'lar burada ölür54. YARGIÇ grok.py + X araması, tek çağrı -> AL veya ATLA, tek gerekçe, tek risk65. DOLUM kağıt: book.py canlı fiyat üzerinden -> canlı: kendin imzalarsın76. İZLEME watch.py her 10 dakikada bir -> stop, kademeli satış, izleyen stop, süre stopu87. RAPOR report.py saat 21:30'da -> ne öldü, ne kazandırdı, ne sorgulanmalı
açık bir mint yetkisi kişisel bir yorum değildir. bir gerçektir ve gerçekler bedavadır. Grok yalnızca bir script'in yapabileceği tüm kontrolleri zaten geçmiş tokenleri görür.

05. tüm sayıları tek bir dosyaya koy
config.py olarak kaydet. masadaki her sayı burada yaşar, böylece yeniden ayar yaptığında sadece tek bir dosyayı düzenlersin, başka hiçbir şeye dokunmazsın. bunlar benim 25 dolarlık işlem büyüklüğüne göre ayarladığım değerler. bir tavsiye değiller, değiştireceğin bir başlangıç noktasıdırlar.
1# config.py2# masadaki her sayı burada yaşar. yeniden ayar yaptığında sadece bu dosyayı düzenlersin, başka hiçbir şeyi değil.34MODEL = "grok-4.7" # API reddederse console.x.ai -> Models kısmını kontrol et5PAPER = True # ilk hafta: gerçek fiyatlardan sahte dolumlar. sadece logları okuduktan sonra değiştir67TICKET_USD = 25 # sabit. asla son kazanca göre boyutlandırılmaz8MAX_OPEN = 4 # piyasada maksimum 4 x 25$ = 100$9MAX_ENTRIES_PER_DAY = 610DAILY_LOSS_HALT_USD = 50 # gerçekleşen günlük zarar buna ulaşırsa -> yarına kadar yeni giriş yok11COOLDOWN_HOURS = 24 # yeni çıktığın bir tokene tekrar girme süresi1213FACTS = { # rug filtresi. sadece kod, model yok14 "max_risk_score": 40, # rugcheck score_normalised, 0-100, yüksek = daha riskli15 "min_lp_locked_pct": 90, # en büyük havuz: LP kilitli veya yakılmış16 "max_top10_pct": 30, # ilk 10 sahip, havuzlar ve kilitleyenler hariç17 "max_dev_pct": 5, # yaratıcı cüzdanında hala duran arz18 "max_insiders": 0, # insider işaretli sahipler + insider grafik eşleşmeleri19 "min_liquidity_usd": 30000,20 "max_ticket_share": 0.01, # işlemin asla havuzun %1'inden fazla olamaz21 "min_age_min": 30, # bundan gençse her rapor hala tahminden ibarettir22 "max_age_hours": 72,23}2425MIN_CONFIDENCE = 0.7 # Grok bunun altında AL derse -> ATLA olarak kabul edilir2627EXIT = {28 "stop_pct": -35, # girişten itibaren sert stop29 "ladder": [(100, 0.50), (200, 0.25)], # +%100'de yarısını sat, +%200'de çeyreğini sat30 "trail_pct": 30, # kalanı: fiyat zirvesinden %30 düşerse çık31 "time_stop_hours": 6, # 6 saat sonra +%20'de değilse -> çık, ölü para32 "time_stop_min_pct": 20,33 "liq_drop_pct": 40, # havuz likiditesi girişten %40 düşerse -> hemen çık34}3536LOG = "checks.csv"37POSITIONS = "positions.json"38TRADES = "trades.csv"
1SABİT İŞLEM BÜYÜKLÜĞÜ. son üç işlem kazandı diye miktar asla artmaz.2BOT config.py'yi OKUR, ASLA YAZMAZ. bir sayı ancak sen değiştirdiğinde değişir.3FİLTRE ANCAK YAZARAK GEVŞETİLİR. bir sayıyı değiştirirsen, aynı gün sohbette nedenini söylersin.
06. her şeyden önce limitleri çalıştır
book.py olarak kaydet. masadaki en ucuz kontrol, hiç API çağırmayan kontroldür. bugün zaten 50 dolar kaybedildiyse, masa tokene bakmaz bile. dört pozisyon açıksa, aynı şekilde. bu dosya aynı zamanda masanın hafızasıdır: kendin açabileceğin iki dosya, positions.json ve trades.csv.
1# book.py2# pozisyonlar, işlemler, limitler. masanın hafızası senin de açabileceğin iki dosyada yaşar.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 """Limitler herhangi bir ağ çağrısından önce çalışır. Engellenen bir girişin maliyeti yoktur."""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 """ORİJİNAL büyüklüğün bir kısmını satar (1.0 = kalan her şey). Gerçekleşen pnl'i döndürür."""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 # canlı mod: kendi cüzdanında aldıktan sonra -> python book.py add <mint> <usd> <price> <liq_usd>66 # elle sattıktan sonra -> 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. girişi değil, çıkışı önce yaz
çoğu kişi ne zaman satacağına yeşil bir muma bakarken karar verir. bu, karar vermek için en kötü andır. bu masada her çıkış, token alınmadan önce bellidir ve bot bunu sadece 10 dakikada bir kontrol eder:
- likidite girişten %40 çekildiyse: çık, tamamından, soru sorma
- %35 düşüşte: çık
- %100 artışta: yarısı gider, kalanı piyasanın parasıdır
- %200 artışta: bir çeyrek daha gider
- ilk kârdan sonra kalan kısım, fiyat zirvesinden %30 düştüğünde çıkar
- altı saat boyunca +%20 yoksa: çık, o slot umuttan daha değerlidir
watch.py olarak kaydet:
1# watch.py2# her açık pozisyon, her 10 dakikada bir. hiçbir şey değişmediğinde hiçbir şey yazdırmaz.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']}: fiyat akışı çöktü ({e}), tutuyorum, tekrar deneyeceğim")15 continue16 if not m or m["price"] <= 0:17 events.append(f"{p['symbol']}: havuz gitti. rug yemiş gibi davran, satabildiğini sat")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 = "satıldı" if PAPER else "cüzdanında ŞİMDİ SAT"30 size = "kalanı" if frac >= 1 else f"%{int(frac * 100)}"31 events.append(f"{s['symbol']}: {verb} {size}, %{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ÖNCE LİKİDİTE. çekilmiş bir havuz, pozisyon kârda olsa bile diğer tüm kuralları ezer.2İZLEYEN STOP İLK KÂRDAN SONRA DEVREYE GİRİR. ondan önce tek taban -%35'tir.3ÖLÜ PARA DA BİR ZARARDIR. altı hareketsiz saat, slotu bir sonraki token için serbest bırakır.4SESSİZLİK DE BİR DURUMDUR. watch.py hiçbir şey değişmediğinde çıktı vermez, yani sessiz bir sohbet bakmana gerek olmadığı anlamına gelir.

08. bir tokenin ölebileceği 14 yolu öğren
yukarıdaki her şeyi çöpe atıp tek bir şeyi tutsaydım, bu olurdu. ayrıca hiçbir bot olmadan da çalışır: bir sonraki alımından önce rugcheck.xyz ve dexscreener üzerinde aynı 14 kontrolü elle yaparsan, pişman olacağın tokenlerin çoğunu es geçersin.
kontrollerin 13'ü koddur. karşılaştırmalar; model yok, fikir yok. 14.'sü Grok'a ihtiyaç duyan tek kontroldür.
#
kontrol
ne zaman eler
neden
1
zaten rug yemiş
Rugcheck onu rugged olarak işaretlemiş
biri çoktan yapmış
2
mint yetkisi
hala açık
geliştirici senin çantana yeni arz basabilir
3
dondurma yetkisi
hala açık
geliştirici tokenlerini dondurabilir, satamazsın
4
tehlike bayrakları
herhangi bir tehlike seviyesinde risk
Rugcheck senin yanlışlaman gereken bir şeyi zaten görmüş
5
risk skoru
40/100'ün üzerinde
küçük uyarılar birikir
6
LP kilidi
en büyük havuzun %90'ından azı kilitli veya yakılmış
kilitsiz likidite bir çekme butonudur
7
ilk 10 sahip
%30'un üzerinde, havuzlar ve kilitleyenler hariç
on cüzdan işlemini birlikte bitirebilir
8
geliştirici cüzdanı
yaratıcı hala %5'ten fazlasını tutuyor
geliştirici ilk satıcıdır
9
içeriden öğrenenler / paketler
herhangi bir insider sahibi veya insider grafik eşleşmesi
birlikte fonlanan cüzdanlar birlikte satar
10
havuz derinliği
30 bin doların altında likidite
birinin çıkış likiditesi olursun
11
işlem payı
25 doların havuzun %1'inden fazlası
kendi alımın fiyatı oynatır
12
yaş
30 dakikadan az veya 72 saatten fazla
herhangi bir rapor için çok taze ya da hareket zaten yapılmış
13
satış var mı
son bir saatte 20+ alım, sıfır satış
bu bir honeypot'un şeklidir
14
X okuması (Grok)
gönderi yok, taklitçi CA, satın alınmış hype, rug geçmişi
hiçbir API'nin döndürmediği kısım

09. bariz olanları kodun elemesine izin ver
1'den 9'a kadar olan kontroller. tek bir rapor çeker ve masanın okuduğu alanları tutar. Grok ham raporu asla görmez; şişkin bir veri yükü hem token harcar hem de doğruluğu düşürür.
insanların gözden kaçırdığı bir detay: havuzun kendi kasası ve kilitleyenler en büyük sahipler listesinde yer alır. onları sayarsan her token bir balina tokeni gibi görünür. kod, ilk 10'u toplamadan önce onları listeden çıkarır.
1# rugcheck.py2# token başına bir rapor, masanın okuduğu alanlara kırpılmış. Grok ham raporu asla görmez.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 kasaları ve kilitleyenler en büyük sahiplerdedir, balina değillerdir16 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 """Basit karşılaştırmalar. İlk başarısızlık kazanır, gerekçe loglanır."""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. sadece kontratı değil, havuzu da kontrol et
10'dan 13'e kadar olan kontroller. bir kontrat kusursuz olabilir ama havuz yine de çıkmana izin vermeyebilir. bu kod, token için en derin havuzu okur ve dört sıkıcı soru sorar: içinde yeterince var mı, benim işlemim onun yanında ne kadar büyük, kaç yaşında ve gerçekten satan biri var mı?
1# market.py2# havuzun kendisi: derinlik, yaş, fiyat ve birinin gerçekten satıp satamayacağı.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. kodun okuyamadığını Grok'un okumasına izin ver
- kontrol. masanın başka bir modelde değil de Grok üzerinde çalışmasının sebebi budur: düşünürken X'te arama yapabilir. bir token 13 kontrolün tamamını geçip yine de farklı bir kontrat adresine sahip bir taklitçi olabilir ya da geçen hafta açılmış kırk hesabın aynı dakika aynı cümleyi paylaştığı bir lansman olabilir. hiçbir API bunu döndürmez. X döndürür.
grok.py olarak kaydet. anahtarı okuyan tek dosya ve masanın xAI ile konuştuğu tek yer burasıdır:
1# grok.py2# anahtarı tutan tek dosya ve masanın xAI ile konuştuğu tek yer.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("ortamda veya .env içinde XAI_API_KEY yok")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 """Tek çağrı, JSON girer, JSON çıkar. JSON olmayan her şey hata fırlatır ve hata fırlatmak üst katmanda ATLA demektir."""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 # iki tur arama, sonra cevap vermek zorunda38 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"yanıtta json yok: {text[:200]}")45 return json.loads(text[start:end + 1])
prompts.py olarak kaydedin. aslında tekrar tekrar okuyacağınız dosya budur:
1# prompts.py2# masadaki tek Grok promptu. aslında tekrar tekrar okuyacağınız dosya budur.34JUDGE_PROMPT = """5Sen RUG DESK'sin. Bir Solana memecoin'i kodda her zorlu kontrolü geçti:6yetkiler, LP, holder'lar, dev cüzdanı, insider'lar, havuz derinliği, yaş.7Bu sayıları tekrar kontrol etme. Tek bir düz biletin girip girmeyeceğine sen karar veriyorsun.8Asla pozisyon büyüklüğü belirlemezsin, asla çıkış noktalarını seçmezsin.910GİRDİ: {"token": {...rugcheck gerçekleri...}, "pool": {...dexscreener gerçekleri...}}1112ADIM 1. Son 72 saat için X'te ticker'ı ve kontrat adresini ara.13ADIM 2. Sadece kodun göremediği şeyleri değerlendir:14 - uyarı seviyesindeki riskler bir araya gelince daha kötü bir tablo oluşturuyor mu15 - ilk kim paylaştı: geliştirici mi, geçmişi olan gerçek bir hesap mı, yoksa yeni açılmış hesap dalgası mı16 - organik mi satın alınmış mı: aynı ifadeler, aynı dakika, geçmişi olmayan hesaplar17 - bu paylaşımlardaki kontrat adresi GİRDİ'dekiyle aynı mı18 - bu ticker adı veya bu geliştirici daha önce bir rug olayına karışmış mı1920SADECE JSON DÖNDÜR:21{"verdict": "BUY" | "SKIP", "confidence": 0.0-1.0,22 "why": "en fazla iki satır", "x_read": "X'in nasıl göründüğüne dair tek satır",23 "main_risk": "tek satır"}2425X'te sıfır paylaşım da bir cevaptır: kimse varlığından haberdar değil. ATLA.26X'te aynı ticker altında başka bir kontrat adresi: taklitçi riski. ATLA.27İhtiyacın olan bir alan null ise ASLA BUY yanıtı verme.28ASLA fiyat hedeflerinden bahsetme. Onları bilmiyorsun.29"""
12. hepsini tek bir komuta bağlayın
bir kontrat adresi girer, bir karar çıkar. limitler, gerçekler, havuz, Grok; bu sırayla çalışır ve ilk "hayır" diyen süreci bitirir:
1# check.py2# bir kontrat adresi girer, bir karar çıkar. masandan her token geçtiğinde çalışır.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)): # limitler, ücretsiz22 return {"stage": "limits", "verdict": "SKIP", "reason": g}2324 try:25 token = report(mint) # rug filtresi, ücretsiz26 except Exception as e:27 return {"stage": "facts", "verdict": "SKIP", "reason": f"rugcheck başarısız oldu: {e}"}28 if (k := fact_kill(token)):29 return {"stage": "facts", "verdict": "SKIP", "reason": k, "symbol": token["symbol"]}3031 try:32 m = pool(mint) # havuz, ücretsiz33 except Exception as e:34 return {"stage": "pool", "verdict": "SKIP", "reason": f"dexscreener başarısız oldu: {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) # tek ücretli adım40 except Exception as e:41 return {"stage": "grok", "verdict": "SKIP", "reason": f"grok başarısız oldu: {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"düşük güven skoru {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} at {v['price']}"58 else:59 v["action"] = (f"ONAY GEREKLİ: kendi cüzdanında {v['symbol']} için ${TICKET_USD} al, "60 f"sonra şunu çalıştır: python book.py add {mint} {TICKET_USD} <fill price> {v['liq_usd']}")61 print(json.dumps(v, indent=2))
bunu kullanmak için bir tarayıcıya ihtiyacınız yok. bir çağrı kanalından gelen CA, bir paylaşım, bir arkadaş mesajı: bota "check <CA>" deyin ve tek satır çalışsın. Geri dönen sonuç şöyle görünür (örnek yapı, gerçek bir token değil):
1{2 "verdict": "SKIP",3 "confidence": 0.78,4 "why": "her zorlu kontrolü geçiyor ama ilk 30 paylaşım bu hafta açılmış hesaplardan geldi, aynı ifadeler kullanılmış.",5 "x_read": "bir gerçek hesap, bir sürü yeni hesap, CA uyumsuzluğu yok",6 "main_risk": "satın alınmış hype, paylaşımlar durduğunda alıcılar kaçacak",7 "stage": "grok",8 "symbol": "ORNEK",9 "reason": "her zorlu kontrolü geçiyor ama ilk 30 paylaşım bu hafta açılmış hesaplardan geldi, aynı ifadeler kullanılmış."10}

1FİKİRLERDEN ÖNCE GERÇEKLER. Grok hiçbir zaman bir mint'in açık olup olmadığına karar vermez.2BAŞARISIZ BİR ÇAĞRI ATLA DEMEKTİR. Rugcheck çöktü, DexScreener çöktü, Grok çöktü, hatalı JSON: ATLA.3NULL TEMİZ DEĞİLDİR. Geri dönmeyen bir alan token'ı eler, asla geçirmez.4TOKEN BAŞINA TEK KARAR. BUY diyene kadar asla yeniden çalıştırma. Katılmıyorsan, config.py'ye katılmıyorsun demektir.5ALIMLARI DEĞİL, ELEME NEDENLERİNİ OKU. alımlar iyi hissettirir. eleme nedenleri filtrenin işe yarayıp yaramadığını söyler.
13. üç rutin, her biri birer cümle
iş akışı oluşturucu yok. her rutini bota bir kez, tek bir cümleyle söylüyorsunuz ve o size bir sonraki çalıştırmayı gösteriyor. bunlar benimkiler, kelimesi kelimesine:
1Her 10 dakikada bir, /workspace/desk dizininde python watch.py çalıştır.2Hiçbir şey yazdırmazsa, hiçbir şey söyleme. Herhangi bir şey yazdırırsa, buraya kelimesi kelimesine gönder.
1Her 30 dakikada bir, /workspace/desk dizininde python scan.py çalıştır.2Sadece BUY kararlarını paylaş: symbol, confidence, x_read.3Rugcheck veya DexScreener çökerse, bunu her çalıştırmada değil sadece bir kez hangisi olduğunu söyleyerek belirt.
1Her gün 21:30'da, /workspace/desk dizininde python report.py çalıştır ve çıktıyı buraya gönder.2Bugün işe yarayan bir şey ve config.py'de sorgulayacağın bir sayıyı nedeni ile birlikte ekle.3O sayıyı asla kendin değiştirme.
bu rutinlerin çalıştırdığı iki dosya. report.py olarak kaydedin:
1# report.py2# akşam raporu. içindeki her şey checks.csv ve trades.csv'den gelir, hafızadan hiçbir şey gelmez.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"AKŞAM RAPORU {day} {'(PAPER)' if PAPER else '(CANLI)'}")19print(f"kontrol edilen: {len(checks)}")20print(f"rug filtresi tarafından elenen: {by_stage['facts']} | havuz tarafından: {by_stage['pool']} | "21 f"Grok tarafından: {by_stage['grok']} | limitler tarafından: {by_stage['limits']}")22print(f"alınan: {len(buys)} | şu an açık: {len(book.load())}")23print(f"bugün gerçekleşen pnl: ${book.today_pnl():+.2f}")24if done:25 print(f"kârlı çıkışlar: {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"en iyi: {best['symbol']} ${float(best['pnl']):+.2f} | en kötü: {worst['symbol']} ${float(worst['pnl']):+.2f}")29if reasons:30 top, n = reasons.most_common(1)[0]31 print(f"en yaygın eleme nedeni: {top} ({n}x)")
ve isteğe bağlı lead kaynağı olan scan.py. az önce DexScreener profili için ödeme yapmış yeni Solana token'larını çeker. ücretli bir profil kalite sinyali değildir, sadece geliştiricinin para harcadığı anlamına gelir. gerisine filtre karar verir:
1# scan.py2# isteğe bağlı lead kaynağı: az önce DexScreener profili için ödeme yapmış yeni Solana token'ları.3# ücretli bir profil kalite sinyali değildir, sadece geliştiricinin para harcadığı anlamına gelir. filtre karar verir.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]: # çalıştırma başına beş, böylece yoğun bir saat API bütçesini tüketemez15 subprocess.run([sys.executable, "check.py", mint])
bu gece son iş: Settings, General, Auto-review. iki adet "Ask first" (Önce sor) kuralı ekleyin; bunlar herhangi bir rutin ne düşünürse düşünsün işlemi durdurur ve sizi bekler:
1Herhangi bir cüzdan bağlantısı, imza, swap veya transferden önce sor.2config.py adlı herhangi bir dosyayı düzenlemeden önce sor.


14. tek bir dolardan önce bir hafta paper trade
PAPER = True demek, masanın para hariç her şeyi gerçekten yaptığı anlamına gelir. gerçek token'lar, gerçek fiyatlar, gerçek çıkışlar, sahte gerçekleşmeler. yedi gün sonra checks.csv'yi açın ve onu bir yabancı yazmış gibi okuyun.
aradığınız şey: hangi kontrolün en çok eleme yaptığı, BUY kararlarının sizin alacaklarınız olup olmadığı ve herhangi bir SKIP nedeninin yanlış görünüp görünmediği. paper gerçekleşme ekran fiyatından olur, canlı gerçekleşme asla olmaz; bu yüzden paper sonucu tahmin olarak değil, tavan olarak kabul edin.
canlıya geçtiğinizde PAPER değerini False yapın, son adım dışında hiçbir şey değişmez. check.py alım yapmayı bırakır ve bunun yerine bir onay satırı yayınlar: kendi cüzdanınızda 25 dolarlık alımı kendiniz yaparsınız, ardından tek bir komutla bunu deftere eklersiniz ve watch.py onu korumaya başlar.
bozulduğunda
bu sistem parayla ilgili olduğundan, her arızanın gerçekleşmeden önce yazılmış tek bir cevabı vardır.
1xAI'den 401 -> hatalı anahtar. Devral, .env'yi yeniden yaz, 03. adımdaki curl'ü tekrar çalıştır.2xAI'den 400 / 404 -> model adı değişmiş. config.py'deki MODEL'i düzelt, başka hiçbir şeyi değiştirme.3xAI'den 429 -> rate limit. o token bir SKIP'tır, sonraki çalıştırma devam eder. asla döngüye sokma.4x_search hakkında hata -> MODEL'in X'te arama yapamıyor. console.x.ai -> Models kısmından yapabilen birini seç.5Grok düzyazıyla cevap verirse -> ValueError, loglanır, SKIP. asla bir paragrafı işleme dönüştürme.6rugcheck 404 veya boş -> indekslenmek için çok yeni. ATLA. yeni olmak temiz olmak değildir.7her şeyde lp_unlocked -> bazı havuz türlerinde hiç LP token'ı yoktur. o sayıya dokunmadan önce rugcheck'te kendin bir tane aç8 ve değişikliği yazılı olarak yap.9no_pool -> henüz bir DEX'te işlem görmüyor veya Solana değil. ATLA.10rutinler sustu -> uzun süre uzak kaldığında Grok Bot rutinleri duraklatır.11 Routines'i aç ve tekrar etkinleştir.
fatura
hakemden önceki her şey ücretsizdir: limitler, Rugcheck, DexScreener. tek ücretli adım, 13 kontrolün tamamını geçen her token için X araması açıkken yapılan tek bir Grok çağrısıdır.
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 araması: çekilen 1.000 paylaşım başına 5$45max_turns = 2 aramayı iki turla sınırlar, böylece posts_fetched düşük kalır.6her yanıt kendi x_posts_fetched değerini bildirir, yani ilk gün gerçek sayıyı öğrenirsiniz.78fiyat: [console.x.ai'den alınan fiyat]
insanların yanlış anladığı kısım: fatura tarayıcıyla değil, hayatta kalanlarla ölçeklenir. scan.py masaya günde 240 token besleyebilir ve bunların çoğu Grok onlardan haberdar olmadan önce ücretsiz olarak elenir.

önemli kısım
bu benim kurulumum, senin stratejin değil.
config.py içindeki her sayı bana ait; 25 dolarlık bir bilet ve bir şeyin sıfıra gitmesini izleme konusundaki kendi toleransım için seçildi. memecoin'lerin çoğu sıfıra gider ve onları trade eden insanların çoğu para kaybeder. filtre bir token'ı iyi yapmaz. kaybetmenin bariz yollarını ortadan kaldırır ve her token'ın neden öldüğünü okumanızı sağlar.
bir hafta paper trade yapın. eleme nedenlerini okuyun. katılmadığınız sayıları yazılı olarak değiştirin. sabitleri değil, yapıyı kopyalayın. yatırım tavsiyesi değildir.
kod eler, Grok X'i okur, siz imzalarsınız. bir script asla takdir yetkisi kullanamaz, Grok asla bir hesap makinesine sahip olamaz ve cüzdana sizden başka kimse erişemez.
bir sonraki alımınızdan önce bunu kaydedin. aynısını çalıştırmayı planlıyorsanız takip edin, bunun daha fazlası gelecek 🫶
tg hesabım - t.me/+8wAXS0nHWgA2MGEy
github hesabım - github.com/0xboan
burada trade yapın - fomo.family/r/0xboan





