加密貨幣交易代理的止蝕錯誤令作者蒙受損失
Kripto Borsasında Zarar Durdurma Hatam Bana Neye Mal Oldu
作者的加密貨幣交易代理因把止蝕機制寫在本機程式內,電腦重啟期間無法執行止蝕,令持倉在市場下跌時蒙受重大損失。作者改為把止蝕限價單交由交易所的訂單簿執行,並設定 GTC,令交易所即使在作者電腦關閉時仍會跟進該訂單。
Olay nasıl başladı
Kripto piyasalarında kendi alım satım ajanımı yazmaya karar verdiğimde kendimi çok zeki hissediyordum. Bir dil modelini aldım ve piyasa verilerini ona yorumlatarak al sat ya da bekle kararları vermesini sağladım. Her şey başlangıçta çok güzel gidiyordu. Python kodum çalışıyor, borsa verilerini çekiyor ve modelin verdiği kararlara göre emirleri iletiyordu. İlk sürümde zarar durdurma mekanizmasını tamamen kodun içine gömmüştüm. Yani kodum sürekli fiyatı kontrol ediyor, eğer fiyat belirli bir seviyenin altına düşerse hemen satış emri gönderiyordu. Bu bana oldukça mantıklı gelmişti. Sonuçta bilgisayarım açık olduğu sürece her şey yolundaydı. Ancak bir gece sistemin çökmesiyle tüm hayallerim yıkıldı. Bilgisayarım güncelleme için yeniden başlamış ve o sırada piyasa sert bir düşüş yaşamış. Zarar durdurma kodum çalışmadığı için pozisyonum korumasız kaldı ve ciddi bir zarar ile uyandım. O an anladım ki yazılım tarafında kurduğum güvenlik duvarı aslında bir serapmış. Kendi yazdığım koda fazla güvenmenin bedelini ödedim. O günden sonra riski yazılım içinde değil, borsanın kendi sisteminde tutmam gerektiğini acı yoldan öğrendim.
Bu nerede karşına çıkar
Bu problem sadece benim gibi küçük çaplı trading yapanların değil, aslında otomasyon kullanan herkesin karşısına çıkabilir. Eğer bir sistem kuruyorsan ve bu sistemin başında durmuyorsan, sistemin her an kesilebileceğini kabul etmen gerekir. Kripto piyasaları 7 gün 24 saat açık, ancak senin yazdığın kod ya da üzerinde çalıştığı sunucu öyle değil. Elektrik kesilebilir, internet gidebilir, sunucu sağlayıcısı bakım yapabilir veya kodun içinde beklenmedik bir hata oluşup program kapanabilir. Bu senaryoların hepsi gerçek ve kaçınılmaz. Eğer zarar durdurma gibi hayati bir karar mekanizmasını sadece kendi kodunun insafına bırakırsan, kodun durduğu anda o koruma da yok olur. Borsa senin kodunun çalışıp çalışmadığını bilmez, umursamaz da. Sen emirleri göndermeyi bıraktığında borsa sadece senin son emrini hatırlar. Bu durum sadece borsa işlemlerinde değil, aslında herhangi bir kritik sürecin otomasyonunda karşına çıkar. Bir sistemin ayakta kalması için gereken şartları, sistemin kendisinden ayırmadığın sürece her zaman risk altındasın demektir.
Kök neden
Kök neden, sorumluluğu yanlış yere yüklememdi. Zarar durdurma emri aslında bir sigortadır. Bir sigortayı, sigortalanan nesnenin içine koyamazsın. Kodumun içinde tutulan zarar durdurma, yazılım çalışmadığı anda yok hükmünde kalıyordu. Piyasa durmaksızın hareket ederken, benim karar mekanizmam sadece kodun çalıştığı kısa anlarda var olabiliyordu. Bu bir mantık hatasıydı. Yazılım içinde yaptığım kontroller sadece o anlık birer niyet beyanıydı. Borsa tarafında bir emir defteri var ve bu defter senin bilgisayarından bağımsız bir şekilde çalışıyor. Benim hatam, piyasanın kendi kurallarını kullanmak yerine kendi kurallarımı piyasanın üzerine zorla dayatmaya çalışmaktı. Yazılım, piyasaya emir ileten bir arayüz olmalıydı, piyasanın kendisi değil. Riski kodun içinde tutmak demek, riski kodun ömrüyle sınırlandırmak demektir. Kodumun ömrü ise çok kısaydı. Bu yüzden zarar durdurma mekanizmasını, yazılımdan bağımsız, borsanın kendi emir defterine emanet etmem gerekiyordu.
Çözüm
Zarar durdurmayı borsanın kendi emir defterine yazarak bu sorunu kökten çözdüm. Artık kodum sadece emirleri gönderiyor ve borsanın sistemine yerleştiriyor.
def emir_gonder(miktar, fiyat, tur):
emir = borsa.create_order(
symbol='BTC/USDT',
type='stop_loss_limit',
side=tur,
amount=miktar,
params={
'stopPrice': fiyat,
'timeInForce': 'GTC'
}
)
return emir
Bu kod parçası, borsanın kendi sisteminde bir stop loss emri oluşturuyor. GTC yani iptal edilene kadar geçerli parametresi sayesinde, benim bilgisayarım kapansa bile borsa bu emri takip etmeye devam ediyor. Artık fiyat o seviyeye geldiğinde borsa otomatik olarak satışımı gerçekleştiriyor. Sadece bununla da kalmadım. Takip eden kar alma mekanizması ekleyerek, fiyat yükseldikçe zarar durdurma noktamı da yukarı çekmeye başladım. Ayrıca başabaş noktasına çekme ve oynaklık kalkanı gibi ek özelliklerle sistemimi daha sağlam hale getirdim. Karar aralığını 15 dakikadan 30 dakikaya çıkardım. Bu sayede model maliyeti yarıya indi ve karar kalitesi ölçümlerinde hiçbir fark görmedim. Artık sistemim çok daha az kaynak harcıyor ve çok daha güvenli çalışıyor.
[[GÖRSEL2]]
Yolda çıkan hatalar
Bu değişimleri yaparken ilk başlarda bazı teknik engellerle karşılaştım. En büyük sorun, borsanın emir defterine gönderdiğim emirlerin bazen eşleşmemesiydi. Kodumda yaptığım ilk denemelerde emir tipini yanlış seçmiştim. Borsa belirli emir tiplerini desteklemiyordu veya API üzerinden gönderdiğim parametreler eksik kalıyordu. Bir süre boyunca emirlerin neden borsada görünmediğini anlamaya çalıştım. Sorun, API dokümantasyonunu tam okumamaktan kaynaklanıyordu. Emir tipi olarak limit emir kullanmaya çalışırken borsa stop loss limit bekliyordu. Ayrıca emirlerin geçerlilik süresini ayarlamak da başlarda kafa karıştırıcıydı. Bazı emirler sadece birkaç dakika sonra iptal oluyordu. GTC yani good till cancelled parametresini doğru yere eklediğimde sorunlar çözüldü. Bir diğer hata ise piyasa oynaklığı yüksek olduğunda emirlerin anlık olarak iptal edilmesiydi. Bunu engellemek için oynaklık kalkanı ekledim. Eğer piyasa çok hızlı hareket ediyorsa emir göndermeyi bir süre durduran bir mantık kurdum. Bu hatalar bana her zaman test etmenin ne kadar kritik olduğunu bir kez daha hatırlattı.
Alternatifler
Zarar durdurma için piyasada farklı yöntemler mevcut. Bir alternatif, sadece borsa üzerinden manuel emirler girmekti ancak bu benim otomasyon hedefime aykırıydı. Bir diğer alternatif ise daha gelişmiş üçüncü parti trading platformları kullanmaktı. Bu platformlar zaten kendi içlerinde zarar durdurma mekanizmalarını barındırıyorlar. Ancak ben kendi ajanımı yazmak istediğim için bu yolu tercih etmedim. Üçüncü parti platformlar hem ek maliyet getiriyor hem de kontrolü tamamen onlara bırakmak anlamına geliyor. Ben kendi kodumun kontrolünün bende kalmasını ama riskin borsa tarafında olmasını istedim. Kendi yazdığım kod ile borsanın API sistemini doğrudan kullanmak, en düşük maliyetli ve en esnek çözümdü. Alternatif yöntemlerin çoğu ya çok pahalı ya da benim istediğim özel karar mekanizmalarını desteklemiyordu. Bu yüzden en sağlıklı yolun borsanın kendi emir defterini kullanmak olduğuna karar verdim. Bu sayede hem kendi ajanımı geliştirmeye devam edebiliyorum hem de sistemin çökmesi durumunda paramı koruma altına alabiliyorum.
Bundan sonra ne yapmalı
Bundan sonra yapman gereken ilk şey, kendi sistemindeki riskleri gözden geçirmek. Eğer bir riski yazılım içinde tutuyorsan, o yazılımın çökmesi durumunda ne olacağını kendine sormalısın. Riski kendinden daha uzun yaşayacak bir yere koymak zorundasın. Borsa örneğinde bu emir defteriydi, başka bir sistemde bu veritabanı seviyesinde bir tetikleyici veya farklı bir güvenlik katmanı olabilir. Kodunu yazarken her zaman en kötü senaryoyu düşün. Bilgisayarın kapandığında, internetin kesildiğinde veya kodun hata verip durduğunda sistemin ne yapacak? Bu sorunun cevabı yoksa sistemin güvenli değildir. Bir sonraki adım olarak, kritik emirlerini borsanın kendi sistemine taşı. Testlerini yaparken sadece başarılı senaryoları değil, sistemini bilerek durdurduğun senaryoları da dene. Kodun çalışmadığında borsanın senin emrini hala tuttuğunu gözünle görene kadar rahat etme. Otomasyon sadece işi hızlandırmak değil, aynı zamanda riski doğru yere yönetmektir. Kendi hatalarımdan aldığım en büyük ders bu oldu. Şimdi kendi ajanını aç ve zarar durdurma emirlerini borsanın emir defterine taşımakla işe başla.
來源:DEV Community · dev.to

