Tillson T3 İndikatörünü Python ile Yazalım

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 tradingview

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:

tillson t3 plot

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:

tillson t3 tradingview line graph

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)

T3 (T3) | Trading Technologies

T3 Moving Average Indicator (tradingpedia.com)

27 thoughts on “Tillson T3 İndikatörünü Python ile Yazalım”

  1. selahattin kayacan

    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?

    1. 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]
      ---

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

  2. 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’

  3. Kapanan mum mu dikkate alıcaz içinde olunan mı ? ilk yazınızda kapanan mum dediniz sonrakilerde son mum kavramlar karıştı

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

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

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

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

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

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

  8. 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?

    1. 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ü

  9. fatih şahinoğlu

    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

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

  11. 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 ?

Yorum bırakın

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

Scroll to Top