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 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
Ö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.
Geri bildirim: python ile kripto para al sat botu yazalım (trading bot): RSI, MACD, vs...
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.
Evet yazdım. Son Blog yazıma bakabilirsiniz.
https://www.onbirkod.com/tillson-t3-indikatorunu-python-ile-yazalim/
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.
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
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.
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?
Merhaba.
while döngüsünün içerisinde sokmaya çalıştığımda
” connection = BinanceConnection(filename)
File “C:\Users\suley\PycharmProjects\pythonProject\venv\supertrade.py”, line 17, in __init__
self.connect(file)
File “C:\Users\suley\PycharmProjects\pythonProject\venv\supertrade.py”, line 22, in connect
lines = [line.rstrip(‘\n’) for line in open(file)]
TypeError: ‘list’ object is not callable”
hatası alıyorum. Al sat sinyali için program satırlarını nereden döngüye almam gerekiyor. Yardımcı olursanız sevinirim.
selamlar.
Bir önceki yazımda belirttiğim gibi, credentials.txt diye bir dosyanız olması gerekiyor. O dosya da da binance’dan aldığınız key ve secret değerlerini koymalısınız.
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.
Tradingview’da pine dili ile kod yazılıyor. Python farklı bir dil, dolayısıyla olmayacaktır.
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.
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
Siz bir bolinger band stratejisi önerin, onu implement edelim isterseniz.
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
Önceki yazıda kapanış mum u dikkate almıştınız, burada kapanış mum ele alınmamış farkeder mi ?
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 ?
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.
Merhaba. Kütüphaneleri importlarken hata alıyorum.
Hatanın ayrıntısını paylaşırsanız ancak yardımcı olabilirim.
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.
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?
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.
hocam öncelikle ellerine saglık Al/Sat Sinyalini hangi satırın altına yazacagız ve supertrend sürekli zaman akmasına ragmen bir değilik olmuyor ilk açtıgımız gibi ekranda kalıyor buna yenileme yapması için ne yapmamız lazım
Sonsuz döngü içerisinde tekrar tekrar hesaplatabilirsiniz. Programlama bilginiz varsa çok rahat bir şekilde yapabilirsiniz.
selamlar. pine editör dilinde supertrend indikatörü için al sat sinyallerini nasıl üretebiliriz?
Merhabalar, emeğinize sağlık. Web sitenizde oldukça işe yarayan bilgiler var. Bir soru sormak istiyorum. MA ve Multiplier değerlerini birebir aynı ayarladığımızda Tradingview’deki Supertrend indikatörü verileri ile sizin yazdığınız kodu çalıştırdığımızda elde ettiğimiz verileri karşılaştırdığımda çok ufak bir farklılık görüyorum. Aynısını profit maximizer kodu paylaşımınızda da görmüştüm. Muhtemelen alım satımı etkileyecek bir fark değil. Algoritmik olarak trading view’deki hesaplama ile sizin yazdığınız kod arasında bir fark mevcut mu acaba? Mesela EMA yerine SMA gibi. Teşekkürler
hangi indikatörünü kullanmaya kalksam hep aynı hatayı verdi.
File “d:\yazılım\python\Projeler\backtest\tillsonT3.py”, line 52, in
connection = BinanceConnection(filename)
File “d:\yazılım\python\Projeler\backtest\tillsonT3.py”, line 11, in __init__
self.connect(file)
File “d:\yazılım\python\Projeler\backtest\tillsonT3.py”, line 16, in connect
lines = [line.rstrip(‘\n’) for line in open(file)]
FileNotFoundError: [Errno 2] No such file or directory: ‘credentials.txt’
hatalar hep credentials.txt yüzünden diye tahmin ediyorum.oraya key ve secret key giriyorum.örnek:
123dwad5d646
dujkwd4856464
şeklinde.acaba benmi hata yapıyorum.keylerin sol kısımlarına key = , secret = seklindemi yazmam gerekiyor.çünkü sadece keyler yazdığımda hata veriyor.nasıl olacağına dair örnek olarak bir yorum yazarsan sevinirim.
backtest klasörü altında credentials.txt dosyasının olması gerekiyor. Dosya başka bir dizinin altında kalmış olmalı.
Dosya uzantısı hatalı olabilir. Dosya ismi credentials.txt.txt olarak kalmış olabilir. Bilinen dosya uzantılarını gizle seçeneği aktif ise bilgisayarınızda .
Merhaba hocam,
Divergence Indikatörü ile ilgili bir çalışmanız var mı? Sanırım pine da kullanılan talib komutlarının ta.pivotlow gibi bazıları python için hazırlanmamış yoksa temel teknik analiz indikatörleri mevcut.
Hocam nasıl teşekkür edeceğimi bilemiyorum, çok minnettarım, elinize emeğinize sağlık
Merhaba
Çalışma çok güzel. Bu çalışmayı binance yerine tradingview üzerinden yapmamız mümkün mü ? Nasıl yardımcı olabilirsiniz ?
Lorenzio indikatöründeki güçlü al güçlü sat sinyalleri ile işlem açıp kapatana bir bot yazmak istiyorum. Bu konuda hiç bilgim yok. Nerden başlayıp nasıl devam etmem gerekir bunu yapmak için. Yardımcı olursanız çok sevinirim.