Kripto piyasası hiç kapanmıyor. Bu, bir insanın izleyemeyeceği ama bir programın izleyebileceği bir şey demek.
QuantDesk’i bu yüzden yazdım: 7/24 çalışan, kendi kararını veren, kendi defterini tutan bir motor. Kâğıt üstünde işlem yapıyor; gerçek para için iki ayrı kilit var ve ikisi de kapalı.
İki süreç, bir veritabanı
Borsa (REST + WebSocket)
│
┌───────────▼────────────┐
│ motor (Node) │ 7/24 karar döngüsü
│ │
│ piyasa deposu │ mumlar + defterin tepesi, bellekte
│ göstergeler │ sembol/zaman dilimi başına ~45
│ rejim │ TREND · ARALIK · SIKIŞMA · KAOS
│ 4 strateji │ her biri uygun rejimde açılıyor
│ topluluk │ en iyi + teyit, uyarlanan ağırlık
│ risk │ boyutlandırma, BD kapısı, devre kesici
│ yürütme │ kâğıt | gerçek — aynı sözleşme
└───────────┬────────────┘
│
┌─────▼──────┐
│ MySQL │
└─────┬──────┘
│
┌───────────▼────────────┐
│ panel (PHP) │ çoğunlukla okuma
└────────────────────────┘
İki süreç arasındaki tek bağ veritabanı. Sebebi basit: motorun bir WebSocket karesine milisaniyeler içinde tepki vermesi ve binlerce barlık gösterge durumunu bellekte tutması gerekiyor. Panelin ise yoğun tabloları basması ve bir yenilemeden sağ çıkması gerekiyor. İki ayrı şekil, iki ayrı çalışma zamanı.
Bu ayrım sayesinde paneli yeniden başlatmak açık bir pozisyona dokunmuyor.
Önce “şu an hangi piyasadayız?”
Bir stratejinin iyi ya da kötü olması yoktur; yanlış piyasada olması vardır. Trend takip eden bir kurgu yatay piyasada sürekli zarar yazar. Ortalamaya dönüş stratejisi güçlü bir trendde ezilir.
Bu yüzden motor önce sınıflandırıyor:
| rejim | ne demek | hangi strateji açık |
|---|---|---|
| TREND (yukarı/aşağı) | yönlü hareket, genişleyen oynaklık | trend takibi, kırılma |
| ARALIK | yatay, sınırlar belli | ortalamaya dönüş |
| SIKIŞMA | oynaklık daralmış, hareket bekleniyor | kırılma hazırlığı |
| KAOS | yön yok, oynaklık yüksek | hiçbiri |
Son satır en değerlisi. Bir motorun en kârlı davranışı bazen işlem yapmamak. “Kaos” rejimi eklendikten sonra işlem sayısı düştü ve sonuç iyileşti.
Beklenen değer kapısı
Bir sinyal geldi diye işlem açılmıyor. Önce şu soru soruluyor: bu işlem, masrafını çıkarabilir mi?
p stratejinin o rejimdeki gerçekleşmiş isabet oranı. kazanç/kayıp hedef ve stop mesafeleri. maliyet komisyon + emir defteri kayması.
Bu kapı tek başına bir şeyi ortadan kaldırdı: sakin bir majör coinde 5 dakikalık barın hareket aralığı, gidiş-dönüş masrafını karşılamaya yetmiyor. Aynı sembolün 1 saatlik barı rahatça geçiyor.
Yani motorun aynı anda birkaç zaman dilimine bakmasının sebebi çeşitlilik değil — masrafı ödeyebilecek hareketi bulmak.
En büyük terim: komisyon
Erken dönemde komisyon oranını sabit yazmıştım. Sonra hesabı yaptım:
Günde 40 işlem, gidiş-dönüş %0,1 ise günlük %8. Stratejinin brüt getirisi bunun altındaysa net zarar — sinyal ne kadar iyi olursa olsun.
Yani kısa vadeli işlemde komisyon, kâr-zarar tablosundaki en büyük tek kalem. Sabit yazılacak son şey oydu; parametre yapıldı ve duyarlılığı ölçüldü. Bu ölçüm, brüt olarak iyi görünen bir stratejiyi tamamen eledi.
Kontrol grubu
Eğri yukarı gitmeye başladığında yapmak istediğin şey sevinmektir. Onun yerine ikinci bir motor çalıştırdım: aynı evrenden rastgele alım yapan.
| parametre | strateji | kontrol |
|---|---|---|
| Dönem · evren · boyut · maliyet | aynı | aynı |
| Seçim kuralı | sinyal | rastgele |
Strateji kontrolü geçiyordu — ama düşündüğüm kadar değil. Getirinin büyük kısmı stratejiden değil, o dönemin genel yönünden geliyordu. Kalan fark hâlâ anlamlıydı; artık hangi kısmın gerçekten motora ait olduğunu biliyordum.
Ve bozuk alet
Bir noktada motorun “fırsat kaçırma” sayacı olması gerekenden çok yüksekti. Sebebini aradım ve sayacın kendisinde hata buldum: belirli bir durumda aynı olayı iki kez sayıyordu.
Yani o sayaca bakarak verdiğim son üç karar geçersizdi. Kırık aletle yapılan ölçüm, strateji hakkında kanıt değildir.
Ondan sonra alışkanlık edindim: bir metrik eklerken onu doğrulayan küçük bir kontrol de yazıyorum — “bu sayı şu ikisinin toplamına eşit olmalı” gibi. Tutmuyorsa alet bozuk.
Reddedilen işlemleri de kaydet
Bir filtre ekliyorsun ve bazı işlemler engelleniyor. Peki filtre doğru mu?
Bunu bilmenin tek yolu engellenen işlemlerin ne olacağını takip etmek. Motor artık reddettiği her işlemi de kaydediyor ve sanki açılmış gibi izliyor:
red_kaydı: {
sebep: "likidite yetersiz",
sinyal_anı: …,
takip_edilen_sonuç: +%2,3 (24 sa) ← filtre burada hata yaptı
}
Birkaç hafta sonra tablo netleşti: iki filtre gerçekten kayıp önlüyordu, biri ortalamada iyi işlemleri eliyordu. Üçüncüsü kaldırıldı.
Gerçek paraya iki kilit
Motorun gerçek emir gönderebilmesi için üç şeyin aynı anda doğru olması gerekiyor: mod “gerçek” olacak, ayrı bir izin bayrağı açık olacak, ve kimlik bilgileri tanımlı olacak. Ayrıca açık kâğıt pozisyonu varken moda geçiş reddediliyor.
Bunun üstünde devre kesiciler var: azami düşüşe ulaşınca defter tamamen durduruluyor ve ancak bir insan temizleyince açılıyor; günlük zarar sınırı ise yalnız o günü kapatıyor ve ertesi gün kendini kaldırıyor.
Bir de strateji bazlı kesici: yeterli işlem sayısına ulaşmış ve beklentisi negatife düşmüş bir strateji kendi kendini kapatıyor.
Ne öğrendim
Bu projede yazdığım kodun belki yarısı ölçüm koduydu. Strateji değil; stratejinin işe yarayıp yaramadığını anlamaya yarayan altyapı.
En değerli üç şey: kontrol grubu, reddedilen işlemlerin kaydı, ve ölçüm aletinin kendisini doğrulayan kontroller.
Bir sistemin ne kadar iyi olduğunu ölçemiyorsan, onu geliştirdiğini de söyleyemezsin. Sadece değiştiriyorsun.