SuperTrend İndikatörünü Python ile Yazalım

Arkadaşlar, SuperTrend indikatörü basitçe trendi takip etmek için kullanılan, son zamanlarda kullanımı artan çok faydalı indikatörlerden bir tanesidir.

Supertrend, temel olarak atr (average true range), yani ortalama gerçek aralık diye çevirebileceğimiz indikatörü baz alır.

Atr, fiyattaki oynaklığı veren bir değerdir. Seçilen zaman aralığında fiyatın hangi değerler arasında değiştiğini bize vermektedir.

SuperTrend indikatörü ilk olarak Olivier Seban tarafından geliştirilmiştir. Yazıda amacım indikatörünü derinlemesine incelemek değil. Gerçekte nasıl çalıştığını tarihçesini öğrenmek istiyorsanız, aşağıda sonuç bölümünde paylaştığım linklere bakabilirsiniz.

Yazıda amacım SuperTrend indikatörünü python programlama dili ile nasıl yazabileceğimizi incelemek. Trading amaçlı bot yazarken python kullanıyorsanız yazdığım supertrend fonksiyonunu kendinize uyarlayabilirsiniz.

TradingView sitesinde de Kıvanç Özbilgiç tarafından hazırlanmış Supertrend indikatörünü kullanabilirsiniz. Aşağıdaki grafikte, günlük bitcoin/usdt fiyat grafiğinde SuperTrend için periyot değerini 10, atr çarpım faktörünü 2 olarak verdim.

Faydalı bulduğunuz başka değerlerde verebilirsiniz.

tradingview supertrend indikatörü

TradingView grafiğinde göreceğiniz üzere fiyat süpertrend çizgisinin üstünde seyrederken, trend yukarı yönlü demektir (Supertrend çizgisi yeşil). Tersine fiyat supertrend çizgisinin altında ise, trend aşağı yönlüdür.

Örnek programımızda matplotlib ile fiyat kapanış grafiği ile birlikte hesapladığımız supertrend değerlerini grafiğini çizeceğiz.

Fiyatları Binance api ile çekiyorum. Python ile Kripto Para Al/Sat Botu Yazalım (Python Trading Bot) yazısında Binance borsasına nasıl bağlanıp fiyatları çekebileceğinize bakabilirsiniz. O yüzden yazıda bu kısımları anlatmayacağım.

BinanceConnection objesi oluşturup, BTC/USDT günlük mum fiyatlarını çekiyorum.

from binance.client import Client
import talib as ta
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import sys
import math

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)


def generateSupertrend(close_array, high_array, low_array, atr_period, atr_multiplier):

    try:
        atr = ta.ATR(high_array, low_array, close_array, atr_period)
    except:
        print('exception in atr:', sys.exc_info()[0], 'pair', pair, flush=True)
        print('filename', filename, flush=True)
        return False, False

    previous_final_upperband = 0
    previous_final_lowerband = 0
    final_upperband = 0
    final_lowerband = 0
    previous_close = 0
    previous_supertrend = 0
    supertrend = []
    supertrendc = 0

    for i in range(0, len(close_array)):
        if np.isnan(close_array[i]):
            pass
        else:
            highc = high_array[i]
            lowc = low_array[i]
            atrc = atr[i]
            closec = close_array[i]

            if math.isnan(atrc):
                atrc = 0

            basic_upperband = (highc + lowc) / 2 + atr_multiplier * atrc
            basic_lowerband = (highc + lowc) / 2 - atr_multiplier * atrc

            if basic_upperband < previous_final_upperband or previous_close > previous_final_upperband:
                final_upperband = basic_upperband
            else:
                final_upperband = previous_final_upperband

            if basic_lowerband > previous_final_lowerband or previous_close < previous_final_lowerband:
                final_lowerband = basic_lowerband
            else:
                final_lowerband = previous_final_lowerband

            if previous_supertrend == previous_final_upperband and closec <= final_upperband:
                supertrendc = final_upperband
            else:
                if previous_supertrend == previous_final_upperband and closec >= final_upperband:
                    supertrendc = final_lowerband
                else:
                    if previous_supertrend == previous_final_lowerband and closec >= final_lowerband:
                        supertrendc = final_lowerband
                    elif previous_supertrend == previous_final_lowerband and closec <= final_lowerband:
                        supertrendc = final_upperband

            supertrend.append(supertrendc)

            previous_close = closec

            previous_final_upperband = final_upperband

            previous_final_lowerband = final_lowerband

            previous_supertrend = supertrendc

    return supertrend

if __name__ == '__main__':
    filename = 'credentials.txt'

    connection = BinanceConnection(filename)

    interval = '1d'

    pair = 'BTCUSDT'

    limit = 500

    klines = connection.client.get_klines(symbol=pair, interval=interval, limit=limit)

    open_time = [int(entry[0]) for entry in klines]

    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]

    close_array = np.asarray(close)
    high_array = np.asarray(high)
    low_array = np.asarray(low)

    new_time = [datetime.fromtimestamp(time / 1000) for time in open_time]

    new_time_x = [date.strftime("%y-%m-%d") for date in new_time]

    supertrend = generateSupertrend(close_array, high_array, low_array, atr_period=10, atr_multiplier=2)

    plt.figure(figsize=(11, 6))
    plt.plot(new_time_x[400:], close_array[400:], label='Price')
    plt.plot(new_time_x[400:], supertrend[400:], label='Supertrend')
    plt.xticks(rotation=90, fontsize=5)
    plt.title("Supertrend Plot for BTC/USDT")
    plt.xlabel("Open Time")
    plt.ylabel("Value")
    plt.legend()
    plt.show()

generateSupertrend fonksiyonu içerisinde gönderilen, high, low ve close fiyat listelerini parametre olarak gönderek, supertrend arrayini oluşturup ana programa dönüyorum.

PyCharm içerisinden çalıştırdığımda matplotlib grafiğini üretmiş oluyorum:

SuperTrend Matplotlib Grafiği

matplotlib supertrend grafiği

Önceki tradingview grafiği ile karşılaştırırsanız aynı olduğunu göreceksiniz.

Kodda bir kaç yerde estetik bazı ayarlar yaptım. Yatay x ekseninde tarihler sığmayacağı için rotate edip, font büyüklüğünü küçülttüm.

plt.xticks(rotation=90, fontsize=5)

Tarihleri de yine düzgün çıksın diye, formatladım:

new_time = [datetime.fromtimestamp(time / 1000) for time in open_time]

new_time_x = [date.strftime("%y-%m-%d") for date in new_time]

Al/Sat Sinyali Nasıl Üretiriz

Al/Sat sinyali üretmek için, şöyle bir kod yazabiliriz:

son_kapanis = close_array[-1]
onceki_kapanis = close_array[-2]

son_supertrend_deger = supertrend[-1]
onceki_supertrend_deger = supertrend[-2]

# renk yeşile dönüyor, trend yükselişe geçti
if son_kapanis > son_supertrend_deger and onceki_kapanis < onceki_supertrend_deger:
	print('al sinyali')

# renk kırmızıya dönüyor, trend düşüşe geçti
if son_kapanis < son_supertrend_deger and onceki_kapanis > onceki_supertrend_deger:
        print('sat sinyali')

Sonuç ve Ek Kaynaklar

TradingView sitesinde en çok kullanılan indikatörlerden birisini python dili nasıl yazabileceğimizi görmüş olduk.

Yazıda zor anlaşılan veya düzeltmemi istediğiniz bir şey varsa, yorum olarak iletebilirsiniz.

What is The SuperTrend Indicator?

Süper Trend İndikatörü Nedir?

Python ile Kripto Para Al/Sat Botu Yazalım

21 thoughts on “SuperTrend İndikatörünü Python ile Yazalım”

  1. Geri bildirim: python ile kripto para al sat botu yazalım (trading bot): RSI, MACD, vs...

  2. Tolgay Karagöz

    Merhaba,

    Tillson T3 ü de yazacağınızı belirtmiştiniz, acaba bunu yaptınız mı? yaptıysanız linkini paylaşabilir misiniz?

    Teşekkürler.

      1. Merhabalar Hocam,
        Çalışmalarınız ve paylaşımlarınız için çok teşekkür ederiz.
        Eğer sizin için mümkün ise;
        SuperTrend ile Most indikatörlerinin güçlü yanlarını bir araya getiren Kıvanç Hoca’nın Profit Maximizer (Kıvanç Hocanın Pmax Sunumu: https://www.youtube.com/watch?v=yR6tkDTTjCQ&t=2035s)
        indikatörü için de bir çalışma yapabilmeniz mümkün müdür?
        Teşekkürler, iyi günler.

  3. Merhaba,
    Öncelikle elinize sağlık. İndikatörde ki ekranda basılan al ve sat sinyalinin bu kodda nasıl yakalayabiliriz.

    Örn: O mum da AL varsa değeri True döndürmek. Sonraki mumlarda artık AL etiketi çıkmadığı için ilgili mumda basması önemli. Umarım anlatabilmişimdir

    1. Merhaba

      Periyodik olarak fiyatları okumak gerekiyor bir döngü içerisinde. Şartlar oluştuğunda yani örnek al/sat sinyalinde gösterdiğim gibi o durumda alım emri girilebilir.

      Soruna cevap oldu mu bilmiyorum ama olmadıysa biraz daha detaylandırabilirsin sorunu.

      1. hocam merhaba,
        program alsat yapabilmesi için grafik matlap basmasına gerek yok diye umuyorum. grafik yerine sinyal ürettiği zaman emir vermesi gerekiyor. grafik kodlarını silip yerine al sat emirlerini yazdım (print olarak). sinyal üretmedi dolayısı ile çıktı alamadım. ancak program bir süre sonra kendisini sonlandırdı.
        -robotun biz müdahale etmediğimiz sürece çalışması gerekmiyor mu?
        -verileri güncelleme yapıyor mu?

  4. Direk tradingviewdeki kodu yapıştırınca olmuyormu ben tam anlamadım, aslında hiç bilmiyorum, dikkatlice yazdıklarınızdan gittim ama beceremedim. Önceki yazınızdan binancen grafik ve veri çekmeyi öğrendim, ama tradingviewdeki beğendim indikatörlerin kodlarını direk kopyalayınca sanırım olmuyor.

  5. Hocam selamlar, bu yazdığınız koda al ve sat emirleri girerek nasıl otomatik işlemler yapabiliriz. Örnek kod yazmanız mümkün mü al ve sat komutu olarak? teşekkürler.

  6. Merhaba, önceki yazınızda MACD ve RSI kullanarak bir strategy geliştirmiştiniz , Bolinger Band kullanımı ile ilgili bir örnek yapmanız mümkün mü?
    Şimdiden çok teşekkür ederim

      1. merhabalar. tradingview de wawe trend eklentisi var. lazy bear ın yaptığı. onu python a entegre edebilir misiniz. Gerçekten işe yarayan bir indikatördür. “WT_CROSS_LB” diye geçmekte

  7. Hocam diyelim 15m lik çalışıyor. O anda mı yakalaması lazım illa, yani denk gelirse mi yakalar 30 dk geçse bile yakalar mı sinyali ?

  8. sizden tek isteğim supertrend e 200 ema eklemeniz. ben istiyorum ki 15 dakikalık btcusdtperp de 200 ema üstü buy sinyaliyle beraber long açsın sell de satsın.
    short işlem içinde 200 ema altı sell sinyaliyle short pozisyon açsın buy sinyalinde kapasın. alarm kurup geceleri uyanmak çok kötü… Şimdiden çok teşekkür ederim.

  9. Merhaba,

    kodu koşmaya çalıştığımda şu şekilde bir hata alıyorum;
    AttributeError: ‘numpy.ndarray’ object has no attribute ‘shift’

    google da shift attibute ı aradım fakat bilgi bulamadım, yardımcı olabilirseniz sevinirim.

  10. Hocam merhabalar, öncelikle elinize sağlık. Kodları 15 dklık için çalıştırdığımda anlamsız bir sonuç ortaya çıktı. Bunu nasıl düzeltebiliriz ?
    Bir de birden fazla taratmak istersem nasıl yapabilirim?

  11. Merhaba Hocam,
    Supertrend’ de ta-lib yerine tulip kullanmak istedimde aşağıdaki hatayı alıyorum. Tek yaptıgım atr için tulip kullanmak

    index 491 is out of bounds for axis 0 with size 491

    ama len(close_array) baktıgımda 500 olarak goruyorum.

Yorum bırakın

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

Scroll to Top