Binance Api ile Yazılım Geliştirmek

Derin1adam

Racon Kesmiyorum Kafa Kesiyorum
Banned Member
Katılım
25 Ara 2020
Konular
51
Mesajlar
466
Tepkime puanı
1,035
Konum
Cehennemde Loca Da
Merhaba RC Ailesi.Malumunuz olduğu üzere kriptopara piyasası şu sıralar epey hareketli. Buna ithafen PHP ile Binance Api inceleyeceğiz. Örnek uygulama yapacağız.

78mtFA.png


Ana sayfada "Dünyanın Lider Kripto Borsası" olarak slogan yazmışlar. Binance kriptopara alıp satabileceğiniz(trading), borsaları, coinleri takip edebileceğiniz, vadeli işlemler(binance futures) yapabileceğiniz bir sistemdir. Mobil arayüzü çok kolay bir arayüze sahiptir. İlk kez coin piyasasına girenler için ise mobilde binance lite geliştirmişler. Daha birsürü güzel özelliği olan Binance‘ın Api‘sini inceleyeceğiz.

Api Ne Olaki?
Api, özetle farklı dillerde kodlanmış farklı yazılımların birbiriyle ortaklaşa çalışmalarını, veri alıp gönderebilen bir şeydir. Diğer bir tanımı ise yazılımdan kullanıcı arayüzünü (UI,UX) çıkarırsanız api kalır. Örneğin Binance, X diliyle kodlanmış olsun ben Y diliyle Binance‘dan koin piyasası hakkında bilgi almak istiyorsam api kullanarak JSON formatında veri alabilir ve gönderebilirim. Apiler genelde JSON formatında veri gönderir ya da alır.

6aClb1.png


Nasıl Olacak?
Bu örnekte PHP ve Symfony framework kullanarak Binance Api‘ye bağlanacağız. Bunu sağlamak için test ortamı olan Binance Testnet‘i kullanacağız ki testler sırasında gerçek koinlerimize bişey olmasın. Binance Api testnet aynı gerçek Binance gibi çalışır ve kurulum aşamasında size rastgele koinler verir. Siz de bu paralarda tıpkı gerçek piyasada işlem yapar gibi api kullanarak çeşitli işlemler yaparsınız.

Hadi Başlayalım!
Öncelikle Binance Api çok karmaşık bir yapıda olduğu için basite indirgemek için adım adım gideceğiz. PHP altyapımızı kuracağız, sonra binance apimizin entegrasyonunu yapacağız ve tokenlerimizi kullanacağız. En son ise Binance‘dan veri alıp veri göndereceğiz, güncel piyasa verilerini çekip al sat yapacağız.

Adım 1.) Yeni bir Symfony Projesi Oluşturalım

Komut satırına geliyoruz ve cd komutuyla projeyi oluşturmak istediğimiz dizine geliyoruz.

Ardından symfony new cw_koin --full yazıyoruz enter tuşuna tıklıyoruz. Burada komut satırına bizim için cw_koin adında bir proje açmasını ve --full koduyla ise tüm varsayılan geliştirme paketlerini(dependencies) yüklemesini sağlıyoruz. Bu komutu kullanmadığınızda annotation, doctrine gibi paketleri tek tek kurmakla uğraşırdık. İşlem bittiğinde diğer adıma geçeceğiz.

fEMmBO.png


İşlem tamamlandığında şu klasörler oluşturulmuş olacak. [.htaccess hariç, onun için apache-pack yüklemeniz de gerekli]

ZrDgpq.png


Adım 2.) Config(ayar) Dosyası Oluşturmak

Symfony sizin için bir proje oluşturduğunda src, bin, var, vendor vb. birsürü klasör oluşturur. Biz config klasörüne gelip config.yaml adında bir dosya oluşturacağız. Bu dosya yazılımımızla ilgili çeşitli ayarları tutacak dosyamız olacak. Binance Api‘den aldığımız tokenleri, istek yapacağımız urlleri komple bu dosyada tutacağız. [Ek Bilgi: YAML kolayca yapılandırma dosyası oluşturacağınız ve aynı zamanda symfony framework tarafından tanınan bir veri stilidir. Okumak yazmak kolaydır. Windowstaki ini dosyaları gibi düşünebilirsiniz.]

rDaKEI.jpg


Dosyanın içindeki adlar vs. tamamen keyfinize kalmış. Ben oluşturduğum config dosyasında binance api keylerimi ve api istekleri için kullanacağım çeşitli url formatlarını attım. Böylece PHP nin her yerinde bu url leri yazmak yerine merkezi bir config dosyasından yazacağım ki işim kolay olsun.

Adım 3.) Binance Api‘ye Bağlanmak
Öncelikle Binance Api‘de istek atabilmek için belli başlı şartlar var. User Auth yani kullanıcı parametresi diğer adıyla kullanıcı girişi isteyen istekler için token lara ihtiyacım olacak. (Bu token‘ları alabilmek için Binance üyeliğiniz olması gereklidir.)

Test sürüşü için öncelikle Binance Testnet adresine gidiyor ve Github kullanıcımızla oturum açıyoruz. Giriş yaptıktan sonra karşınıza Generate HMAC_SHA256 Key butonu çıkacak. Bu buton bizim için sha256 ile şifrelenmiş bir key ve secret kodu oluşturacak. Bu kodları olduğu gibi kopyalayıp az önce oluşturduğumuz config dosyasına yapıştırıyoruz. Api isteklerini atarken bu kodları header içinde göndereceğizki Binance kim olduğumuzu tanısın ve bize yetki versin.

l8MvNB.png


Api için olmazsa olmaz keylerimizi de aldığımıza göre artık yavaştan yazılım kısmına odaklanabiliriz.

Adım 4.) Endpoint URL Bulmak ve Derlemek
Endpoint URL dediğimiz şey bizim http istekleri göndereceğimiz url adreslerini ifade eder. Ben config dosyamda bu bu adreslerden sadece birkaç tanesini ekleyerek uygulama geliştireceğim. Siz keyfinize göre hangi işlemi yapmak istiyorsanız binance api github adresine giderek buradan resmi api kullanımlarına bakabilirsiniz. Aradığınız tüm cevaplar aslında bu dokümanda var.

Örneğin biz Binance hesabınızda ne kadar bakiye ve hangi cinsten bakiyeler olduğunu sorgulamak istiyorsanız /api/v3/account endpoint kullanacaksınız. Buraya yukarıda aldığınız token‘larla istek atarsanız Binance Api size güncel bakiyenizi JSON formatında sunacaktır. Bu JSON yanıtını hangi dille kullanmak isterseniz hiç fark etmez o dille kullanırsınız.

Adım 5.) Sınıf(Class) Yapısını Oluşturalım

Uygulamamız şimdilik iki adet sınıftan oluşacak. Bu iki adet sınıfı oluşturmak için, proje dizinimize gelip ayrı ayrı;

php bin/console make:controller BaseController
php bin/console make:controller BinanceController

uCTcQv.png


BaseController Sınıfı: Bu sınıf tüm sınıflarımızın en üstünde(parent) sınıfımız olacak. Biz bu sınıfta config dosyamızı yükleyeceğizki alt sınıfların tamamında burada yazdığımız public fonksiyonlarımızı kullanabilelim. Örneğin buradaki appConfig metodumuz ile az önce oluşturduğumuz config dosyasındaki verileri çekeceğiz ve bunu bir alt sınıf olan BinanceController sınıfında kullanacağız.

yQ3Sme.png


-- appConfig: Config dosyamızdaki ayarları döndüren fonksiyonumuz.
-- failSafe: Hata çıktığında yazılımdan çıkış yapan fonksiyonumuz. (burada loglama vs. bir şeyler yapılabilir, vakit kısıtlı olduğu için yazdım geçtim.)

BinanceController Sınıfı: BaseController sınıfımızın alt sınıfı olan bu sınıfta ise Binance Api ile ilgili yapmak istediğimiz işlemleri sağlayan metodlarımız(fonksiyonlarımız) olacak. Örneğin Binance‘a bir api isteği göndermek ve almak gibi. Ya da dinamik olarak config dosyamızdan gelen endpoint url adreslerimizi derlemek gibi. Derleme işlemini tek bir metotla yaparsak her yerde aynı şekilde çalışır. Ve bize geliştirme açısından kolaylık sağlar.

-- getRequestSignature : Bu fonksiyonumuz isteğin yapıldığı zamanı(timestamp) mikrosaniye cinsinden olacak şekilde sha256 algoritmasıyla HMAC yöntemini kullanarak şifreyecek. Bunun için PHP‘nin hazır fonksiyonunu kullanıyoruz. Buradan dönen şifrelenmiş veri Binance Api‘ye istek atarken işimize yarayacak.

RZ2Bc6.png


-- getBinanceUrl: Bu fonksiyonumuz yine parent class yani üst sınıfından aldığı config verisine göre bizim için url hazırlayacak. Burada dikkatinizi çekmesi gereken nokta config dosyamızda kullandığımız süslü parantez içeren urllerimiz. Bu süslü parantezler metodumuz tarafından otomatik olarak değiştirilecek. Çünkü URL lerimiz dinamik yani isteğin atıldığı zamana ve parametrelere bağlı olarak değişebiliyor.

6JmV1B.png


-- getBinanceMethod: Burada kodladığımız metot, verdiğimiz parametreye göre config dosyasına bakacak ve http isteğinin atılacağı yöntemi, GET ya da POST verecek. Dönen bu değer ile Symfony‘deki http-client kullanarak Apimize istek atacağız.

PAcikH.png


-- prepareRequestFor: Bu en önemli metodumuz ise bizim için bir Api Request‘i hazırlıyor yani bir http isteği gönderiyor ve dönen veriyi bize gösterecek. Binance Api‘nin resmi dokümantasyonunda görebileceğiniz gibi isteğimizin header‘larında X-MBX-APIKEY adından bir parametre daha göndermemiz gerekiyor. Bu da doğrulama, diğer adıyla user auth için. Fonksiyonumuz oluşturulan bu parametreye config dosyasında kaydettiğimiz api keyimizi değer olarak veriyor ve bizim için bir http isteği oluşturuyor.

h30CiO.png


Adım 6.) Api‘ye İstek Göndermek
Her şey hazır olduğuna göre artık Binance Api‘ye istek gönderebiliriz. Dönen veriyle ne yapacağınız size kalmış. Alım satım emri verebilirsiniz, alarm kurabilirsiniz, grafik verilerini sitenize ekleyebilirsiniz. Binance ile yapabildiğiniz hemen her şeyi api ile yapabilirsiniz. Bot mu yazarsınız ne yaparsınız orasını bilemem :))

Fazla uzatmadan hemen örnekleyelim. Örnekleri yazmak için HomeController adında bir sınıf daha oluşturuyorum ve annotation ekliyorum. Route yazmak yerine annotation kullanacağım. Bunun için proje dizininde yine komut satırına

php bin/console make:controller HomeController

yazıyorum ve enter lıyorum. Oluşturduğumuz sınıfa geliyoruz ve apimizi denemek için yeni bir istek atıyoruz. Örnekler ve dönen değerler karşınızda.

-- Örnekleri Yazdığımız HomeController Sınıfı [İlk iki örneği comment ledim. Onları da kendiniz deneyebilirsiniz.]

XNqpML.png


-- Sonuçlar


4Bj9Sy.png


Adım 7.) Daha da Anlat!

* Cron Job oluşturup dakika başı piyasa takibi yapabilirsiniz. (Api limitleri dahilinde.)
* Api‘den aldığınız verileri işleyerek kendi trend eğrilerinizi yazılıma otomatik olarak buldurabilirsiniz.
* Kendi yorum tarzınızı tamamen yazılıma entegre edebilir ve karmaşık verileri otomatik olarak analiz edecek sistemi kurabilirsiniz.
* Kendi alarm sisteminizi kurabilir hatta bunu SMS ya da whatsapp hattına geçirebilirsiniz.

Özetle;

Kriptopara piyasasında eğer Binance kullanıyorsanız ve yazılımla uğraşıyorsanız Api ile yapamayacağınız işlem yok. Örneğin piyasadaki güncel kriptopara kurlarını alabilir ve artık azalışlara göre otomatik emirler verebilir alım satım yapabilirsiniz. Ya da alt koinleri takip etmek sizi zorluyorsa yine bunlar için otomatize bir sistem kurabilirsiniz. Gerisi tamamen hayal gücünüze kalmış. Ben sadece yüzeysel bilgi verdim gerisi sizde.

Dostça kalın...
 

samilh

Member
Katılım
18 Tem 2021
Mesajlar
1
Tepkime puanı
0
ben Binance vadelide işlem yapmak istiyorum Postman uzerinden komut gönderiyoru su ana kadar tek çalıstırdığım komut acık olan bekleyen emirleri iptal etmek oldu , vadelide işlem komut örneği nereden bulabilirim Binance sitesinden Perpetual futures collecsions dosyasını Postman a çektiğim ama hep hata alıyorum API kodumu yükledim bana timestamp hatası veriyor onu neden verdiğini biliyorum ama çözemiyorum onu ortadan kaldırınca signiture hatası ile karşılaşıyorum .. ama acık olan emiri iptal etmekte sıkıntı yaratmıyor .. acık posizyonları kapatma ile ilgili bireyde bulamadım .. kimsenin bu isten anladığı yok kendim yazılımcı değilim... ama çok iyi bir trader im fakat bu sistemde parakazanmak icin tek tek alım yapmak yerine toplu emir vermem ve o an almam gerekiyor Binance sitesinden bunu yapmak uzun sürüyor alım yaparken piyasa terse dönüyor ve zararla kapatıyorum acılan emirlerin stop losss seviyelerini de aynı anda o saniye icinde girmem gerekiyor kar yapanlar kalıp zarar olan stop olsun istiyorum .. bana bu konuda yardımcı olabilirmisiniz gercekten kazanç sağlanacak birsistemde bu sekilde zarar büyük zararlar ediyorum... bana tek bir alım icin market emri verebilecek ve aynı zamanda o fiyattan yüzde belirleyeceğim stoploss miktarını belirteceğim bir koda ihtiyacım var ... coinleri ben ayrı bir dosyada listeleyip onları alsan yaptırtmalıyım .. mesela bilmem ne exe boşluk benim dosyamın isminide yazacağım bir program kullanmak istiyorum ... dosyamın icinde api kodum ese bin istediği sekilde orda olacak . ve emir girmek istediği coinleride alt altta market fiyatından al ve misal yüzde 1 eksiye gittiğinde pozisyonu kapat belirtilmiş olacak bu sekil bir şey yazabilirmisiniz .. iki satırlık yazıyı yazdırcak bir programcı bulamıyorum uygunsanız ve konuyu. anladıysanız yardımcı olursanız sevinirim teşekkürler
 
Üst