Python ile Kripto Para Al/Sat Botu Yazalım (Python Trading Bot)

Kripto para grafiklerini saatlerce izlemekten bıktıysan, otomatik olarak belli bir algoritmaya göre al-sat yapabileceğini biliyor musun? Örneğin binance üzerinde python kullanarak otomatik olarak al-sat yapabilirsiniz.

TradingView sitesini bilmeyen trader herhalde yoktur. TradingView pine dili ile alert verebilir, kendi algoritmanızı yazabilirsiniz. TradingView üzerinde belirli bir sayıda indikator ekleyebilir, alert yazabilirsiniz. Belirli bir limiti aştıktan sonra, ücretli bir üyelik almanız gerekiyor.

Aynı şeyi python dilini kullanarak yapacağız arkadaşlar; adım adım nasıl yapacağınızı göstereceğim. Böylece istediğiniz kadar indikator ekleyebilir ve dilediğiniz algoritmaya göre alert verebilir, al-sat yapabilirsiniz.

Python Ide olarak PyCharm kullanıyorum arkadaşlar:

Uygulamayı Yazmaya Başlıyoruz

PyCharm ile yeni proje oluşturalım:

Python 3.6 sürümünü kullanıyorum.

Projemizi oluşturduktan sonra da yeni python dosya oluşturalım:

İsmini de algotrade olarak veriyorum.

Kripto para bilgilerini ve al/sat işlemlerini binance üzerinden alacağım. Binance bildiğiniz gibi çok yaygın bir şekilde kullanılan ve oldukça fazla hacimli işlem yapılan bir kripto para borsasıdır.

Binance Api (Key, Secret) Parametrelerimizi Alalım

Binance borsası üzerinde hesabınızın olduğunu varsayıyorum. Binance hesabınıza login olup, api yönetimi sayfanıza gidiniz:

Api Yönetimi sayfasında yeni api anahtarı oluşturun:

Bir etiket adı verip oluştur tuşuna basınca bizim için yeni bir key ve secret anahtar değerlerini oluşturacaktır.

Bu değerleri (key, secret) python projemizde bir txt dosyasına yazalım (credentials.txt):

credentials.txt (üst satır key, alt satır secret değeri):

3jJ8kD8D5iexxxxx908080980980980980
7VsGh8g4eguHfMj7LA23zkvJLbnbnbbn958585

algotrade.py kodumuza geri dönelim:

from binance.client import Client

class BinanceConnection:
    def __init__(self, file):
        self.connect(file)

    """ Creates Binance client """
    def connect(self, file):
        lines = [line.rstrip('\n') for line in open(file)]
        key = lines[0]
        secret = lines[1]
        self.client = Client(key, secret)

if __name__ == '__main__':
    pass

Bu kodda binance borsasına bağlanmak için bir sınıf oluşturuyoruz.

Kodumuz şu haliyle çalışmayacaktır. Binance client kütüphanesini yükleyelim.

python-binance kütüphanesi

https://github.com/sammchardy/python-binance

Binance borsası tüm fiyat bilgilerini rest apileri ile dışarıya sunmaktadır. python-binance kütüphanesi de bu bilgilere python ortamında erişmemizi kolaylaştıran güzel bir kütüphanedir.

PyCharm settings (ayarlar) menüsüne bağlanalım:

Settings ekranına + düğmesine tıklayarak (python-binance) kütüphanesini ekleyelim:

python-binance kütüphanesinin eklenmesi:

Install Package diyerek kütüphaneyi yüklemiş oluruz.

Artık algotrade.py kodunu çalıştırınca hata vermeyecektir. Binance borsasına bağlandığımıza göre BTCUSDT ikilisinin fiyatlarını çekmeyi deneyelim:

algotrade.py:

from binance.client import Client

class BinanceConnection:
    def __init__(self, file):
        self.connect(file)

    """ Creates Binance client """
    def connect(self, file):
        lines = [line.rstrip('\n') for line in open(file)]
        key = lines[0]
        secret = lines[1]
        self.client = Client(key, secret)

if __name__ == '__main__':
    filename = 'credentials.txt'
    connection = BinanceConnection(filename)

    symbol = 'BTCUSDT'
    interval = '5m'
    limit = 500

    try:
        klines = connection.client.get_klines(symbol=symbol, interval=interval, limit=limit)
    except Exception as exp:
        print(exp.status_code, flush=True)
        print(exp.message, flush=True)

    open = [float(entry[1]) for entry in klines]
    high = [float(entry[2]) for entry in klines]
    low = [float(entry[3]) for entry in klines]
    close = [float(entry[4]) for entry in klines]

    last_closing_price = close[-1]

    previous_closing_price = close[-2]

    print('anlık kapanış fiyatı', last_closing_price, ', bir önceki kapanış fiyatı', previous_closing_price)

Örneğimizde BTC’nin 5 dakikalık mum grafiğini USDT (tether) cinsinden bize dönen bir kod yazmış olduk:

anlık kapanış fiyatı 9354.79 , bir önceki kapanış fiyatı 9349.01

Parametreleri daha iyi anlamak için, binance’ın resmi api dokümanlarını incelemenizde fayda olacaktır:

https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md

close değişkeninde kapanışları bir liste olarak elde ettik.

Listenin son ve bir önceki değerlerine aşağıdaki kod satırları ile ulaşmış oluruz:

last_closing_price = close[-1]
previous_closing_price = close[-2]

Indikatörleri Nasıl Hesaplarız?

Şimdi belirli bir sistem dahilinde uyarı (alert, mail) ya da al/sat komutu vermek istiyoruz. Bir algoritmamız olduğunu basit bir örnek olmak üzere, macd ve macd sinyalinin üst tarafa doğru kesiştiği zaman alım emri verelim.

Bunu yapmak için, macd değerini hesaplamamız gerekiyor. Halihazırda böyle bir kütüphane olduğu için bizim yazmamıza gerek kalmayacaktır.

TA-Lib Python kütüphanesi ile 150’ye yakın indikatörü kolayca hesaplayabiliriz

Ta-lib kütüphanesi bu konudaki ihtiyacımızı rahatlıkla görecektir.

https://github.com/mrjbq7/ta-lib

Şöyle bir mantık düşünelim: 5 dakikalık rsi değeri 50’nin üzerinde olsun ve macd değeri macd sinyal değerini yukarı doğru kessin.

Bu mantığın pek çok durumda işe yaramayacağını söyleyelim. Sırf basit bir örnek olsun diye yapıyoruz. Amacımız örnek bir algoritmanın yazılıma nasıl uyarlanacağıdır.

TA-Lib kurulumu

Daha önce python-binance kütüphanesini kurmak için settings sayfasına giderek eklemiştik. TA-Lib kütüphanesi ise 3.6 python sürümünü tam olarak desteklemediği için farklı bir şekilde kuracağız:

https://www.lfd.uci.edu/~gohlke/pythonlibs/

Yukarıdaki siteden TA_Lib‑0.4.18‑cp36‑cp36m‑win_amd64.whl dosyasını kendi bilgisayarıma indirdim.

Siz bu dosya yerine hangi python sürümünü kullanıyorsanız onunla uyumlu sürümü indirin. Dosyayı projenin kök dizinine indiriyorum.

Dosyayı indirdikten sonra, pycharm terminal ekranından pip3 install diyerek kurulumu gerçekleştiriyorum:

pip3 install TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl

Bu şekilde kurulumu başarıyla gerçekleştirdikten sonra artık istediğimiz ta-lib fonksiyonunu kullanmaya başlayabiliriz:

Öncelikle başka bir kütüphane daha ekleyelim (numpy). Numpy kütüphanesini yine pycharm File-> Settings (ayarlar) -> Project -> Project Interpreter menüsünden kolayca ekleyebiliriz.

numpy kütüphanesini ekledikten sonra algotrade.py kodunu son haline getirelim:

from binance.client import Client
import talib as ta
import numpy as np
import time

class BinanceConnection:
    def __init__(self, file):
        self.connect(file)

    """ Creates Binance client """
    def connect(self, file):
        lines = [line.rstrip('\n') for line in open(file)]
        key = lines[0]
        secret = lines[1]
        self.client = Client(key, secret)

if __name__ == '__main__':
    filename = 'credentials.txt'
    connection = BinanceConnection(filename)

    symbol = 'BTCUSDT'
    interval = '5m'
    limit = 500

    while True:
        # 10 saniye bekliyoruz. Sürekli sorgu göndermeye gerek yok.
        time.sleep(10)

        try:
            klines = connection.client.get_klines(symbol=symbol, interval=interval, limit=limit)
        except Exception as exp:
            print(exp.status_code, flush=True)
            print(exp.message, flush=True)

        open = [float(entry[1]) for entry in klines]
        high = [float(entry[2]) for entry in klines]
        low = [float(entry[3]) for entry in klines]
        close = [float(entry[4]) for entry in klines]

        last_closing_price = close[-1]

        previous_closing_price = close[-2]

        print('anlık kapanış fiyatı', last_closing_price, ', bir önceki kapanış fiyatı', previous_closing_price)

        close_array = np.asarray(close)
        close_finished = close_array[:-1]

        macd, macdsignal, macdhist = ta.MACD(close_finished, fastperiod=12, slowperiod=26, signalperiod=9)
        rsi = ta.RSI(close_finished, timeperiod=14)

        if len(macd) > 0:
            last_macd = macd[-1]
            last_macd_signal = macdsignal[-1]

            previous_macd = macd[-2]
            previous_macd_signal = macdsignal[-2]

            rsi_last = rsi[-1]

            macd_cross_up = last_macd > last_macd_signal and previous_macd < previous_macd_signal

            if macd_cross_up and rsi_last > 50:
                print('al sinyali', flush=True)

                # mail atabilirsiniz, sms gönderebilirsiniz.

                # alım yapabilirsiniz (0.1 miktarında market ya da limit alım emri girebiliriz):

                # buy_order = connection.client.order_market_buy(
                #     symbol=symbol,
                #     quantity=0.1)

Kodun üzerinde biraz duracak olursak, öncelikle sonsuz bir döngü kuruyoruz.

Program sürekli 10 saniyelik aralarla binance borsasını dinleyerek, rsi ve macd değerlerinin bizim belirlediğimiz şartlara uyup uymadığını denetliyor. Eğer uyuyorsa:

macd_cross_up and rsi_last > 50:

Bize uyarı vermesini sağlamış oluyoruz.

close_array = np.asarray(close)
close_finished = close_array[:-1]

Yukarıdaki kodda close değişkenine attığımız değerleri direkt almıyoruz. Çünkü anlık mum çubuğunu değil, tamamlanmış çubuğu hesaplamaya esas alıyoruz.

close_array[:-1] ile son çubuk hariç diğer değerleri almış oluyoruz.

Sonuç ve İyileştirme

Böylece dünyada en çok kullanılan dillerden birisi olan python dili ile nasıl bir al sat botu yazabileceğimizi görmüş olduk.

Binance çok yaygın bir kripto para borsası. Diğer borsaların da benzer api (rest, socket) arabirimleri var. O yüzden onlara da aynı mantığı uyarlayabilirsiniz. Daha güzeli ise CCXT kütüphanesini kullanmak olacaktır:

https://github.com/ccxt/ccxt

Bu kütüphane tüm borsalara standart bir arabirimle bağlanmaya imkan tanımaktadır. O yüzden iyileştirme adımı olarak kullanabilirsiniz.

TA-Lib içerisinde bulunmayan bazı indikatörleri de implement ettim (Tillson T3, supertrend). Eğer fırsat bulursam onları da onbirkod üzerinde paylaşacağım.

Güncelleme

SuperTrend indikatörünü python ile yazdığım fonksiyonu linke tıklayarak inceleyebilirsiniz.

Yararlı olmasını umuyorum.

Faydalandığım Kaynaklar

https://steemit.com/cryptocurrency/@genesiscrypto/cryptocurrency-trading-bot-part-1-setup-and-connect-to-binance

https://steemit.com/cryptocurrency/@genesiscrypto/cryptocurrency-trading-bot-part-2-ta-lib-setup-and-beginning-strategy

Python ile Mail Göndermek için tıklayın

15 düşünce - “Python ile Kripto Para Al/Sat Botu Yazalım (Python Trading Bot)”

  1. merhaba, 2 hareketli ortalamanın crossover yapmasını kullanarak basit bit bot yazdırmak istiyorum. örneğin XRP/BTC de trade ediyor olalım. hareketli ortalamalar AL sinyal verdiğinde portföyümde olan BTC ile XRP alıyoruz. hareketli ortalamalar SAT sinyali verdiğinde eğer BTC/USDT çaprazı aynı hareketli ortalamalar AL pozisyonunda ise BTC de kalıyoruz değil ise USDT’ ye geçiyoruz. bunu yazdırmak istiyorum. yardımcı olabilirseniz memnun olurum. sevgiler

    1. Selamlar
      Ema (exponential moving average, üssel ortalama) için ta.EMA,
      SMA (simple moving average, basit ortalama) için ta.SMA fonksiyonunu kullanabilirsiniz.

      Aşağıdaki koda benzer şekilde çakışmayı kontrol edebilirsiniz:

      ema10 = ta.EMA(close_array, 10)
      last_ema10 = ema10[-1]
      previous_ema10 = ema10[-2]

      ema20 = ta.EMA(close_array, 20)
      last_ema20 = ema20[-1]
      previous_ema20 = ema20[-2]

      # ema10 değeri ema20’yi yukarı doğru kesiyor, al sinyali
      if last_ema10 > last_ema20 and previous_ema10 < previous_ema20: print(''al sinyali', flush=True) ------

  2. merhaba,
    tradingview’ den aldığım verilerle yalnızca 2 hareketli ortalama kullanarak binance’ de çalışan bir bot yazdırmak istiyorum. ayrıca dk lık güncellemeler yaparak binance’ da listelenen tüm coin lerdeki sonuçları (buy/sell) bir web sitesinde yayımlamak istiyorum. bu konuda birlikte nasıl çalışabiliriz?

    1. Ben binance api üzerinden verileri çekiyorum. TradingView’da aynı yerden verileri çekiyor. Hangi borsayı esas alıyorsanız onun api’si üzerinden veriye ulaşabilirsiniz.

      Geliştirme hakkında daha detaylı bilgi için, email adresime mesaj gönderebilirsiniz. Başarılar dilerim.

      talattufekci@gmail.com

  3. buy_order = connection.client.order_market_buy(
    symbol=symbol,
    quantity=0.1)

    satın alma işlemine hata vermekte komut hatalı dıyor. symbol=symbol bölümüne ayrıca satma komutuda bunun tam tersimi olmalı? market_sell gibi teşekkürler

  4. Pingback: SuperTrend İndikatörünü Python ile Yazalım - Onbirkod

  5. selamlar

    python-binance kütüphanesini yüklemek istediğim de bu hatayı alıyorum sebep ne olabilir acaba
    Error occurred when installing package”python-binance”

    1. Error’un kendisini göndermeniz gerekiyor. İnternete bağlı olmanız gerekiyor, dosyayı uzaktan yükleyeceği için. Diğer taraftan firewall antivirüs programlarını kontrol edebilirsiniz.
      Hata mesajının kendisini gönderirseniz daha net bir cevap verebilirim.

  6. merhaba xrp haftalık grafikte rsi indikatörü 40-60 arası gidip geliyor 1,5 yıldır. Buna göre bir alım satım botunu ve ayrıca;
    ampl tokeni 0,55 usd -0,80 usd arasında 4 kez para kazandım.
    bu ikisinin python kodlarını urhanozgur67@gmail.com adresine mail atarmısınız.
    Teşekkürler.

  7. Tradingview’da kendi oluşturduğumuz indikatörün verdiği al ve sat değerlerine programı nasıl uygulayabiliriz. bir kaç indikatörün birleşiminden hibrit bir indikatör oluşturduk. Kütüphanede bulunan hazır indikatörlerden olmadığı için uyarlama konusunda fikir verirseniz sevinirim.

    Değerli vaktinizi aldığım için kusura bakmayın. Selamlar.

    1. Merhaba

      Supertrend indikatörünü python ile yazdığım yazıya bakabilirsiniz.

      Söylediğiniz gibi uyarlama için python ve algoritma bilgisi gerekiyor.

      İyi çalışmalar dilerim.

  8. merhaba, binance testnet üzerinde botu çalıştırmak istiyorum. binance’den çekilen verilerle testnet verileri arasında farklılık var mıdır?

Yorum Gönder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top