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

5 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.

  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.

Yorum bırakın

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

Scroll to Top