Arkadaşlar bugün sizlere söz etmek istediğim indikatörlerden biriside Tillson T3 indikatörüdür. TradingView sitesinde de Kıvanç Özbilgiç tarafından hazırlanmış versiyonunu kullanabilirsiniz.
Hareketli ortalamalar baz alınarak hesaplanan bir değerdir. Tillson T3 indikatörü hareketli ortalamaları biraz daha yumuşatarak, fiyatlar hakkında bize daha net bir bakış açısı kazandırmaktadır.
Aşağıdaki resimde görüldüğü üzere çizgi yeşil olduğunda fiyatlar yükseliyor, kırmızı olduğunda fiyatlar düşme eğiliminde anlamında gelmektedir.
Tillson T3 indikatörü Tim Tillson tarafından geliştirilmiştir.
Formülü yaklaşık olarak aşağıdaki gibidir:
a değeri hacim çarpanıdır. Varsayılan değer 0.7 fakat 0.618 değeri de kullanılır.
– e1 = EMA (Close, Periyot)
– e2 = EMA (e1, Periyot)
– e3 = EMA (e2, Periyot)
– e4 = EMA (e3, Periyot)
– e5 = EMA (e4, Periyot)
– e6 = EMA (e5, Periyot)
– c1 = – a^3
– c2 = 3*a^2 + 3*a^3
– c3 = – 6*a^2 – 3*a – 3*a^3
– c4 = 1 + 3*a + a^3 + 3*a^2
T3 = c1*e6 + c2*e5 + c3*e4 + c4*e3
Görüldüğü üzere kapanış değerleri üzerinden EMA (exponential moving average) hesaplanıyor. Silsile halinde hesaplanan değerlerin tekrar ema’sı hesaplanarak sonuca ulaşılıyor.
Al/Sat Sinyalini Nasıl Üretiriz
Basitçe rengi kırmızıdan yeşile döndüğünde al sinyali, yeşilden kırmızıya döndüğünde sat sinyali olarak değerlendirebiliriz.
Genelde de olduğu gibi zaman aralığı daha büyük olduğunda daha net sinyaller verecektir; Örneğin 4 saatlik ve günlük grafikleri için güzel sinyaller üretecektir.
Tabi ki tek bir indikatöre bakarak al/sat yapmak her zaman doğru olmayacaktır. Fakat Tillson T3 indikatörünü de destekleyici bir parametre olarak düşünebilirsin.
Python ile Tillson T3 İndikatörünü Yazalım
Daha önce Supertrend indikatörünü python ile nasıl yazdığımızı anlattığım blog yazısında izlediğim yöntemi tekrar izleyeceğim.
Fiyat hareketlerini çekmek için Binance borsasına bağlanacağım. Nasıl bağlandığımı burada tekrar anlatmayacağım. Binance Api ayarlarının nasıl yapılacağını yine bir başka yazımdan bakarak öğrenebilirsin.
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 generateTillsonT3(close_array, high_array, low_array, volume_factor, t3Length):
ema_first_input = (high_array + low_array + 2 * close_array) / 4
e1 = ta.EMA(ema_first_input, t3Length)
e2 = ta.EMA(e1, t3Length)
e3 = ta.EMA(e2, t3Length)
e4 = ta.EMA(e3, t3Length)
e5 = ta.EMA(e4, t3Length)
e6 = ta.EMA(e5, t3Length)
c1 = -1 * volume_factor * volume_factor * volume_factor
c2 = 3 * volume_factor * volume_factor + 3 * volume_factor * volume_factor * volume_factor
c3 = -6 * volume_factor * volume_factor - 3 * volume_factor - 3 * volume_factor * volume_factor * volume_factor
c4 = 1 + 3 * volume_factor + volume_factor * volume_factor * volume_factor + 3 * volume_factor * volume_factor
T3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
return T3
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]
volume_factor = 0.7
t3length = 8
tillsont3 = generateTillsonT3(close_array, high_array, low_array, volume_factor=volume_factor, t3Length=t3length)
plt.figure(figsize=(11, 6))
plt.plot(new_time_x[400:], close_array[400:], label='Price')
plt.plot(new_time_x[400:], tillsont3[400:], label='Tillson T3')
plt.xticks(rotation=90, fontsize=5)
plt.title("Tillson T3 Plot for BTC/USDT")
plt.xlabel("Open Time")
plt.ylabel("Value")
plt.legend()
plt.show()
Kodu PyCharm içerisinden çalıştırdığımızda üretilen grafiği görelim:
Grafiğimizde renk değişimini yapmadım. Yani yükselirken, yeşile dönmesi ve düşerken kırmızı renge dönmesi.
İşin bu kısmını alıştırma olarak yapmanızı öneriyorum.
Bu grafiği trading view çizgi grafiği ile karşılaştırırsak doğru hesapladığımızı görmüş oluruz:
Al/Sat Sinyali Üretelim
Al/Sat sinyali üretmek için şöyle bir kod ekleyebiliriz arkadaşlar:
t3_last = tillsont3[-1]
t3_previous = tillsont3[-2]
t3_prev_previous = tillsont3[-3]
# kırmızıdan yeşile dönüyor
if t3_last > t3_previous and t3_previous < t3_prev_previous:
print('tillson t3 buy signal, from red to green')
# yeşilden kırmızıya dönüyor
elif t3_last < t3_previous and t3_previous > t3_prev_previous:
print('tillson t3 sell signal, from green to red)
Faydalandığım Kaynaklar
T3 Moving Average (technicalindicators.net)
Gerçekten harika! elinize sağlık.
interval = 1day olduğunda tradingview daki 1gün grafiği ile birebir aynı. ancak bu uygulamada 3dk yapınca (yani 3m) bir türlü grafiği çalıştıramıyorum. boş görünüyor. limit ile de oynadım olmuyor. farklı bişey daha mı yapmam lazım?
Aşağıdaki şekilde ilgili satırları değiştirin, çalışacaktır.
---
if __name__ == '__main__':
---
interval = '3m'
---
new_time_x = [date.strftime("%H:%M:%S") for date in new_time]
---
merhabalar, bu c# olarak ta yazmanız mümkün mü?
Bir kaç tane dotnet wrapper kütüphane var, fakat kullanmadım.
https://github.com/binance-exchange/BinanceDotNet
https://github.com/JKorf/Binance.Net
hocam bu vermiş olduğunuz linkler binance ticareti yapmak için kullanılan uygulamalar. Bunların içerisinde tilson t3 kodları bulunmuyor. Keşke bu indikatörün c# versiyonunu yazsanız ne güzel olurdu
merhabalar, backtest için alış ve satış fiyatlarını ekrana nasıl yazdırabilirim ?
merhaba çalıştırmak istediğimde boyle bir hata aliyorum ne yapmaliyim
File “c:\Users\yahya\Desktop\New folder\binance-tutorials-master\rsibot\bot.py”, line 91, in
connection = BinanceConnection(filename)
File “c:\Users\yahya\Desktop\New folder\binance-tutorials-master\rsibot\bot.py”, line 11, in __init__
self.connect(file)
File “c:\Users\yahya\Desktop\New folder\binance-tutorials-master\rsibot\bot.py”, line 16, in connect
lines = [line.rstrip(‘\n’) for line in open(file)]
FileNotFoundError: [Errno 2] No such file or directory: ‘credentials.txt’
bot.py ile ‘credentials.txt’ aynı klasörde mi? kontrol ettiniz mi?
merhaba. binance bağlantısını kuramadım. github.com da ki gibi dosyası varsa eposta adresime atabilir misiniz.
Kapanan mum mu dikkate alıcaz içinde olunan mı ? ilk yazınızda kapanan mum dediniz sonrakilerde son mum kavramlar karıştı
4 saatlikte yaklaşık 3-4 saat sonra sinyal geliyor iş işten geçmiş oluyor, 4h sinyali nasıl daha erken alabilir, kapanan muma göre yapıyorum.
Her dört saatte bir supertrend hesaplayıp, anlık mumun bir öncesini dikkate alacak şekilde kodlayabilirsiniz.
Bu kod sistemini her dk yenilyecek şekilde ekranda yapsanız daha güzel olmaz mı?
Bir while döngüsü içerisinde her dakika çağırarak son mumu ya da sondan bir önceki muma bakarak, yapabilirsiniz.
Öncelikle elinize sağlık,
buy / sell için aşağıdakiler yeterli oluyor mu?
Buy:
if t3_last > t3_previous:
Sell:
if t3_last < t3_previous:
Buradaki T3 değerleri ile TradingView daki bir şekilde farklı oluyor bu fark talib ema hesaplamasından mı oluyor başka bir şeyden mi bilemedim ama bu büyük bir sorun
Farklı olmadığını göstermek için hem tradingview hem de matplotlib grafiğini yazımda paylaştım.
Aynı olduğunu görebilirsin. Parametrelerden herhangi birisinin ya da zaman aralığının farklı olması durumunda tabi ki sonuçlar da farklı olacaktır.
arkadaşlar yapan varsa github a atabilir mi hazır halini rica etsem
Merhaba. Talib deki T3 ile birebir aynı mı bu hocam? Yoksa kıvanç özbilgiç farklı bi hesaplama mı yapmış?
Üstad öncelikle eline sağlık;
Anlamadığım birkaç konu var müsaadenle;
1.si ema hesaplamasında 1. parametre olarak data serisi alması gerekiyor ancak burada tek bir değer var,
2.si python bilmediğim için belki normaldir ancak
ema_first_input = (high_array + low_array + 2 * close_array) / 4
satırında gizli bir for loop mu var? burası nasıl çalışıyor anlayamadım.
Tillsonu java da yazmaya çalışıyorum o yüzden bazı detayları anlamaya çalışıyorum. Teşekkürler.
Zaten bir data serisi gönderiyorum.
İkinci soruna gelirsek, python mantığıyla ilgili bir şey. Aritmetik işlemi arrayin her elemanı için yapıp, sonuc arrayine ekliyor.
Java da array operasyonları için işini görecek illaki bir paket vardır.
teşekkürler.
from binance.client import Client
import talib as ta
import numpy as np
import time
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 generateTillsonT3(close_array, high_array, low_array, volume_factor, t3Length):
ema_first_input = (high_array + low_array + 2 * close_array) / 4
e1 = ta.EMA(ema_first_input, t3Length)
e2 = ta.EMA(e1, t3Length)
e3 = ta.EMA(e2, t3Length)
e4 = ta.EMA(e3, t3Length)
e5 = ta.EMA(e4, t3Length)
e6 = ta.EMA(e5, t3Length)
c1 = -1 * volume_factor * volume_factor * volume_factor
c2 = 3 * volume_factor * volume_factor + 3 * volume_factor * volume_factor * volume_factor
c3 = -6 * volume_factor * volume_factor – 3 * volume_factor – 3 * volume_factor * volume_factor * volume_factor
c4 = 1 + 3 * volume_factor + volume_factor * volume_factor * volume_factor + 3 * volume_factor * volume_factor
T3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
return T3
if __name__ == ‘__main__’:
filename = ‘credentials.txt’
connection = BinanceConnection(filename)
symbol = ‘BNBUSDT’
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_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]
new_time = [datetime.fromtimestamp(time / 1000) for time in open_time]
new_time_x = [date.strftime(“%y-%m-%d”) for date in new_time]
volume_factor = 0.7
t3length = 8
tillsont3 = generateTillsonT3(close_array, high_array, low_array, volume_factor=volume_factor, t3Length=t3length)
last_closing_price = close[-1]
previous_closing_price = close[-2]
t3_last = tillsont3[-1]
t3_previous = tillsont3[-2]
t3_prev_previous = tillsont3[-3]
print(‘anlık kapanış fiyatı’, last_closing_price, ‘, bir önceki kapanış fiyatı’, previous_closing_price)
close_array = np.asarray(close)
high_array = np.asarray(high)
low_array = np.asarray(low)
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
macd_cross_down = last_macd previous_macd_signal
t3_buy = t3_last > t3_previous and t3_previous < t3_prev_previous
t3_sell = t3_last t3_prev_previous
if rsi_last 70 and t3_sell:
print(‘sat sinyali’, flush=True)
sell_order = connection.client.order_market_sell(
symbol=symbol,
quantity=0.1)
Hocam yeni öğreniyorum, nerede yanlış var bakar mısınız?
eksik gitmiş bazı yerler fakat, küçüktür büyüktür işaretleri falan hocam bi de buy sinyalini yapıştırmamış fakat başka bi sorun var hiç açılmıyor bot çünkü
Kod’da sorun yaşayanlar TW’de aynı sayıları görmek istiyorsanız aşağıdaki gibi düzeltin.
def generateTillsonT3(close_array, volume_factor, t3Length):
ema_first_input = close_array
ben çalıştıramadım. run dediğimde direki from binance.client import Client de hata veriyor. kütüphaneyi de kurdum ama yanlış ne ki.
Merhabalar,
Hocam harikasınız, çok teşekkür ederim. Bir sorum olacak cevaplarsanız çok menmun olurum.
Binance api si ile değilde websocket ile yapmaya çalışıyorum. Websocket ile yapıldığında sinyal gelmiyor. Sinyali almak için ne kadar mum verisine ihtiyaçım var bunu merak ettim. Kodda son 3 mum verisine bakıyor ama sinyal alamadım acaba ema lar daha fazla mum istiyormu ?