Kripto Para Borsalarında Veri Analizi ve Algoritmik Ticaret

Kategori: Egitim, Kripto Para, Teknik Analiz / Yazar: Kris Waters

Bu yazıda kripto para borsaları için geliştirdiğim ürünlerden edindiğim bilgi ve tecrübeleri paylaşmaya çalışacağım.

Kripto para borsalarında robot yazılımlar kullanılarak neler yapılabilir?
  • İstenilen periyotlarda talep edilen kontroller gerçekleştirilebilir. (Her 3 dakikada bir, ETH’nin fiyatı 13 periyot hareketli ortalamanın üstüne çıkmış mı kontrol et.)
  • Ön tanımlı koşullar gerçekleştiğinde talep edilen işler yaptırılabilir. (Hesabımda bulunan XRP’nin 1/3’ünü, destek olarak belirlediğim 37 Cent’in altında 4 saatlik mum kapanışı gerçekleşirse zarar durdurmak için sat, direnç olarak belirlediğim 78 Cent’e yükselirse kâr almak için sat. Bu işlemden sonra Telegram kanalına mesaj atarak beni bilgilendir.)
  • Portföy yönetimi için özelleşmiş arayüzler geliştirilebilir. Borsa hesabınızda bulunan varlıklar listelenebilir, açık ve kapalı emirler görüntülenebilir hatta kendiniz için bir alarm uygulaması bile yapabilirsiniz.
Finansal geçmiş ve açık pozisyonları görüntülemek için oluşturulan örnek bir gösterge paneli.
Finansal geçmiş ve açık pozisyonları görüntülemek için oluşturulan örnek bir gösterge paneli.

UYGULAMA GELİŞTİRMEYE GİRİŞ

Finansal piyasa verilerinin teknik analizini yapmak isteyen yazılım geliştiriciler için TA-LIB adında bir kütüphane bulunmaktadır. Bu kütüphanenin alt yapısını kullanan PHP Trader ile göstergelerin sonuçlarına hızlı ve zahmetsiz bir şekilde erişmeniz mümkündür. ATR, MACD, RSI, MA ve OBV gibi birçok göstergenin yanı sıra mum desenleri (doji, hammer hanging man vb.) ve çeşitli cebirsel fonksiyonlar (vector trigonometric aTan, vector trigonometric sin vb.) ilgili kütüphanede mevcuttur. Gösterge sonucunu alabilmek için fonksiyona genellikle market verisi ile birlikte periyot bilgisini göndermek yeterli olacaktır. PHP ile yazılmış kod bloğu örnekte yer almaktadır.

//On Balance Volume (OBV) 
$_obvArr = trader_obv($closeValueArr,$volumeValueArr); 
//Bollinger Bands (BB) 

$_bbArr= trader_bbands($_obvArr,20,2,2,TRADER_MA_TYPE_SMA); 
//Average True Range (ATR)
$_atrArr = trader_atr($highValueArr,$lowValueArr,$closeValueArr,14);
//Exponential Moving Average (EMA)

$_emaArr=trader_ema($closeValueArr,21);

Bazı indikatörlerin sonucu “0.0” (sıfır) olarak dönebilir. Hesaplama yaparken kullanılacak olan basamak hassasiyetini örnekteki kod yardımıyla 8’e yükselterek çözüm üretebilirsiniz.

ini_set(“trader.real_precision”, “8”);

MARKET VERİLERİNE ERİŞİM

Market verilerine erişim, ticaret ve hesap gözlem işlemlerini gerçekleştirebilmek için gerekli bilgiler borsaların API dokümanlarında mevcuttur.

Binance API dokümanından örnekler

https://api.binance.com/api/v1/ticker/24hr bağlantısından Binance borsasında işlem gören varlıkların market verilerine erişebilirsiniz. https://api.binance.com/api/v1/klinessymbol=BTCUSDT&interval=1d&limit=10 bağlantısından Binance borsasında yer alan BTCUSDT çiftinin son 10 günlük mum verilerine erişebilirsiniz.

“Wrapper” adı verilen, bağımsız geliştiriciler tarafından üretilen ve borsanın web servisinden bilgi çekmeye olanak sağlayan yazılımlar mevcuttur. Bu yazılımların fonksiyonlarını kullanarak daha az kod geliştirebilir, bu sayede zamandan tasarruf sağlayabilirsiniz. Kullanmayı tercih ettiğim kaynaklar aşağıdaki gibidir.

Binance PHP wrapper’ında tanımlanan ve mum verilerini çeken fonksiyon, örnekteki gibidir.

function get_chart_data($symbol,$interval,$limit) {
$coins=array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,url.”v1/klines?symbol=”.$symbol.”
interval=”.$interval.”&limit=”.$limit);
$result = curl_exec($ch);
$json = json_decode($result);
curl_close ($ch);
return $json;
}

BTCUSDT çiftinin son 10 günlük mum verisine örnekteki kod kullanılarak erişebiliriz.

$btc_1d = json_encode (get_chart_data(“BTCUSDT”,”1d”,10),JSON_NUMERIC_CHECK);

KARŞILAŞILAN ZORLUKLAR

Her borsa size istediğiniz çözünürlükte mum verisi sunamayabilir. Güncel API dokümanlarında yer alan bilgiler doğrultusunda borsalardan erişebileceğiniz mum verilerinin zaman çözünürlükleri aşağıdaki gibidir.

Binance: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1D, 3D, 1W, 1M Bittrex: 1m, 5m, 30m, 1h, 1d
Poloniex: 5m, 15m, 30m, 2h, 4h, 1d

Her üç borsada da çalışan bir robotunuzun olduğunu varsayalım. 4 saatlik mum verilerini tarayıp belirlediğimiz koşullar gerçekleştiğinde işlem yapmasını istiyoruz. Dikkat ederseniz Bittrex borsasında 4 saatlik mum verisi yer almıyor. Bu veriyi elde edebilmek için ne yapmalıyız?

1. Mum Birleştirme


Mum birleştirme yapılarak 4 adet 1 saatlik mum, 1 adet 4 saatlik muma dönüştürülebilir.

Örneğin;

Elimizde 1’er saatlik 4 adet mumun (00:00, 01:00, 02:00, 03:00) verileri bulunuyor ve biz 00:00– 04:00 arasındaki 4 saatlik 1 adet mumu oluşturmak istiyoruz. 00.00’daki 1 saatlik mumun açılış değeri 4 saatlik mumun açılış değeri (Open) ile aynı olacaktır.

Mum Kapanışı

Benzer şekilde 03:00’teki (son mum) 1 saatlik mumun kapanış değeri de 4 saatlik mumun kapanışı ile (Close) aynı olacaktır. Yüksek ve düşük mum verilerini bulabilmek için 1’er saatlik 4 adet mum toplu bir şekilde kontrol edilir. Aralarında en yüksek fiyat verisine sahip olan mum, 4 saatlik mumun yüksek değerini (High), en düşük fiyat verisine sahip olan mum ise 4 saatlik mumun düşük (Low) değerini oluşturacaktır.

2. Canlı İşlem

Oluşturulan stratejiyi test ederken belirlenen koşullar sağlandığında ilgili coin’in son fiyatı (last price) üzerinden işlem yapıldığı düşünülür. Teoride kabul gören durum pratikte işimizi göremeyebilir.

Örneğin; algoritmamız hazır ve market verilerini anlık olarak kontrol ediyor. Belirlediğimiz koşullar sağlandığında alım emri verilecek.

İşlem geçmişi tablosunun en üstündeki girdi varlığın son fiyatını belirler.
İşlem geçmişi tablosunun en üstündeki girdi varlığın son fiyatını belirler.
Varlığın son fiyatı işlem geçmişindeki en üst satır ile aynıdır.
Varlığın son fiyatı işlem geçmişindeki en üst satır ile aynıdır.
Alım ve satım için bekleyen işlem tablolarını inceleyecek olursak son fiyat değeri ile girilen alım emri tabloda ancak 3. sırada kendine yer bulabilir.
Alım ve satım için bekleyen işlem tablolarını inceleyecek olursak son fiyat değeri ile girilen alım emri tabloda ancak 3. sırada kendine yer bulabilir.

Alım koşulunu sağlayan DASH coin’i için robotumuz son fiyat olan 0.02436268 satoshi değeri ile emir gönderdiğinde alıcıların bulunduğu tabloya ancak 3. sıradan girer. Fiyat yukarı doğru baskılanırsa ilgili işlem hiçbir zaman gerçekleşmeyebilir. Peki bu durumda ne yapmalıyız?

Bu konuda farklı stratejiler kullanmak mümkündür. Alım bir an önce gerçekleşsin istenirse satıcı tablosunun en üstünde yer alan fiyattan (ask price) emir girilebilir. Bu şekilde bile emriniz tam anlamıyla doldurulamayabilir. Tablonun en üstündeki satım emri, miktar olarak talebinizi karşılıyorsa işleminiz gerçekleşir. Talep ettiğiniz miktardan az ise, emir ile birlikte gönderdiğiniz parametreye göre işlemimizin bir bölümü uygulanır veya tamamı iptal edilir.

Poloniex borsasında verilen emirler için 3 farklı parametreden biri true (doğru) tanımlanarak, karşılaşılan duruma göre izlenecek yol belirlenebilir.

FillOrKill: Parametresi ile verilen alım emrine karşılık gelen bir satım emrinde talep edilen miktar karşılanıyorsa işlem anında gerçekleşir. Aksi durumda emrin tümü silinir.

Immediate-or-cancel: Parametresi ile verilen alım emrine karşılık gelen bir satım emrinde talep edilen miktar karşılanamıyorsa var olan satış miktarı kadar alım gerçekleşir. Geri kalan miktara karşılık gelen alım emri anında iptal edilir.

PostOnly: Parametresi ile verilen alım emrine karşılık gelen bir satım emri olmadığı durumda işlemi yapamasa bile alım emri iptal edilmez. Verilen emir alım tablosunda yer almaya devam eder.

Alım emrinin hızla gerçekleşebilmesi için kullanılabilecek bir diğer yöntem ise alım tablosunda yer alan en yüksek fiyat ile eşit (bid price) veya +1 satoshi daha yüksek emir girmektir. Diğer robotlar kendi emirlerinin önce işlem görebilmesi için benzer yöntemle fiyatlarını sürekli +1 satoshi arttırarak önünüze taşıyabilirler. Ne diyeyim, hızlı olan kazansın!

Piyasa yapıcı (Maker): İşlem tahtasını dolduran emirlerdir. Verilen emir parçalı ve farklı zamanlarda gerçekleşirse piyasa yapıcı komisyon ücreti ödenir.

Piyasadan alıcı (Taker): Verilen emrin tamamı tek seferde ve anında gerçekleşirse piyasadan alıcı komisyon ücreti ödenir.

Yapıcı komisyonunun, alıcı komisyonundan daha düşük olması beklenir. Poloniex’te bu oran işlem başına yapıcı için 0.10%, alıcı için ise 0.20%’dir. Borsadan borsaya farklılık gösterebilir. Çok fazla alım ve satım sinyali üreten bir algoritmanız varsa piyasa yapıcısı (maker) olmakta yarar vardır. Aksi takdirde ödenen komisyon kazanılan miktarı karşılamayabilir.

Ask Price veya Lowest Ask (Talep Fiyatı): Satım tablosunun en üstünde yer alır. Satım için belirlenen en düşük fiyattır. Daha düşük fiyatlı bir satım emri gelirse tablonun ilk sırasına yükselir. Varlığın talep fiyatı da bu veriye göre değişir.

Bid Price veya Highest Bid (Teklif Fiyatı): Alım tablosunun en üstünde yer alır. Alım için belirlenen en yüksek fiyattır. Daha yüksek bir alım emri gelirse tablonun ilk sırasına yükselir. Varlığın teklif fiyatı da bu veriye göre değişir.

Stochastic osilatörü kullanılarak geliştirilen otomatik ticaret algoritmasının akış diyagramı
Stochastic osilatörü kullanılarak geliştirilen otomatik ticaret algoritmasının akış diyagramı.
3. Çoklu Strateji Kontrolü

Borsaların API’lerine atılan sorguların belirli üst limitleri vardır. Çok sık kontrol ve her kontrolde benzer verilerin servisten çekilmesi sorgu limitine takılmaya yol açar ve robotu borsaların belirlediği süre boyunca devre dışı bırakır. Bu konunun önüne geçebilmek için varlıkların fiyat geçmişini kısa aralıklarla kontrol edip elde edilen bilgileri veritabanına yazabilirsiniz. Strateji kontrolünü veritabanından okuduğunuz mum bilgileri ile yaparsanız web servise tekrar bir istek göndermeyeceğiniz için limite takılma ihtimaliniz azalacaktır.

Veritabanında yer alan coin veri seti için bir örnek
Veritabanında yer alan coin veri seti için bir örnek.
4. Varlığın Dolar Fiyatına Göre Strateji Oluşturma

Borsalar USD kapısı olan coin’ler için Coin/USD fiyat bilgisini sağlar. Her coin’in USD kapısı olmadığı için kurduğunuz strateji sadece belirli coin’ler için çalışacaktır. Peki tüm coin’ler için dolar fiyatı üzerinden bir strateji oluşturmak mümkün müdür?

Evet mümkündür! BTCUSD çiftinin geçmiş veri seti stratejide kullanılan mum çözünürlüğünde alınır, aşağıdaki formül uygulanır ve istenilen veri elde edilir.

CoinUSD Fiyatı = (CoinBTC Fiyatı X BTCUSD Fiyatı)

CoinUSD Fiyatı = (CoinBTC Fiyatı X BTCUSD Fiyatı)
CoinUSD Fiyatı = (CoinBTC Fiyatı X BTCUSD Fiyatı)
5. Telegram Uygulamasına Bildirim Gönderme

Robotunuz verilen görevi yerine getirdiğinde Telegram uygulamasına mesaj atarak sizi bilgilendirebilir. Bu işlem için aşağıdaki adımları izlemelisiniz.

  • Telegram’ın bot yaratma uygulaması olan “BotFather” ile yeni bir bot oluşturun ve Token değeri edinin.
  • Telegram uygulamasında yeni bir kanal oluşturun ve @ işareti ile başlayan bir kullanıcı adı belirleyin.
  • Botunuzu, oluşturduğunuz kanala yönetici olarak (administrator) ekleyin.
  • Yazılımda kullanılacak olan “chatId” değerini bulabilmek için, [bot token] ve @kanaladi bilgilerini kendi verilerinizle değiştirerek tarayıcıdan aşağıdaki bağlantıya istekte bulunun.
    result->chat->id değerine karşılık gelen ve “-” ile başlayan sayı chatId değerinizdir.

PHP kodundaki ön tanımlı değerler doğru bir şekilde girildiği takdirde Telegram kanalına mesaj bildirimi alacaksınız.

//Ön tanımlı değerler
$botToken = “bot token değeri bu alana yazılmalıdır”;
$website = “https://api.telegram.org/bot”.$botToken;
$chatId= chat id değeri bu alana yazılmalıdır;
//mesaj gönderen fonksiyon
function sendMessage ($chatId, $message) {
$url = $GLOBALS[‘website’].”/sendMessage?chat_id=”.$chatId.”&text=”.
urlencode($message).”&parse_mode=HTML”;
file_get_contents($url);

}
//görev tamamlandığında sendMessage fonksiyonunu çağır
$messageStr=”Telegram uygulamasına gönderilecek olan mesaj”;
sendMessage($GLOBALS[‘chatId’],$messageStr);

6. Grafik Arayüzü Oluşturma

Plot.ly servisine veritabanında tutulan giriş ve çıkış noktaları ile mum verilerini JSON veya CSV formatında sağlayarak grafik görüntüleme arayüzü oluşturulabilir.

plot.ly

“Sorabileceğim biri olsaydı daha hızlı çözüm bulurdum” dediğim konuların kısa bir özetini bu yazı ile birlikte Fibo Bülten okuyucuları ile paylaştım. Öneri ve görüşlerinizi bekliyorum.

.
Kris Waters

Kris Waters

Twitter

İndikatörlerin Etkin Kullanımı yazısı da ilginizi çekebilir.

Arkadaşlarınla Paylaş!