WaveTrend Oscillator WT (LazyBear) Nedir? Python (cctx) ile yazalım

Tradingview’da en çok sevilen göstergelerden olan Wavetrend oscillatorünü python ile nasıl yazacağımız konusunda bir kaç arkadaşın sorusu olmuştu. Bahsettiğim indikatör, tradingview’de lazybear isimli yazarın hazırlamış olduğu indikatördür.

tradingview wavetrend oscillator

WT indikatörü al-sat sinyalleri üretebilir, bunun dışında uyuşmazlık (divergence) tespit etmek için de kullanabilirsiniz:

WT al-sat sinyalleri, Lazybear — Indicators and Signals — TradingView sayfasından aldığım örnek

Açıkcası tradingview pine kodlarına bakmadan önce biraz gözüm korkmuştu. Ama numpy kütüphanesinin sunduğu yetenekler sayesinde, kolay bir şekilde python diline çevirebildim.

Tradingview’daki linkine öncelikle referans verelim:

Indicator: WaveTrend Oscillator [WT] by LazyBear — TradingView

Daha önceki yazılarımdan farklı olarak bu sefer python-binance kütüphanesi yerine cctx kütüphanesini kullanmaya karar verdim. Sebebi de şu arkadaşlar, python-binance kütüphanesi adı üstünde sadece binance borsasına yönelik çalışan bir kütüphane. Oysa cctx kütüphanesi bildiğiniz tüm borsalara ortak bir arayüz üzerinden bağlanabilmektedir.

ccxt/ccxt: A JavaScript / Python / PHP cryptocurrency trading API with support for more than 120 bitcoin/altcoin exchanges (github.com)

Dolayısıyla ister binance ister bitrex ya da kucoin borsasıyla çalışıyor olun, aynı metodlarla kripto al-sat botunuzu yazabilirsiniz. Bu çok önemli bir avantaj elbette.

Öncelikle Kurulması Gereken Python Paketleri

Kodu yazmaya başlamadan önce bazı paketleri kurmamız gerekiyor:

CCXT Kurulumu

CCXT yazının başında söylediğim gibi, hemen hemen tüm kripto borsalarına aynı kodlama yapısıyla erişebilmeye imkan veren python dilinin yanı sıra php ve javascript ile de kod yazmayı destekleyen bir kripto borsa alım-satım kütüphanesidir.

Kütüphaneyi kurmak için öncelikle bağımlı olduğu six paketini kurmak gerekiyor:

pip install six

Bu paketi kurduktan sonra da ccxt kurulumunu yapalım:

pip install ccxt

ccxt kurulumumuzu tamamladıktan sonra geçelim diğer paketimizin kurulumuna.

TA-LIB Kurulumu

Bu paketin kurulumunu da diğer yazılarımızda da anlattığım için, tekrar baştan anlatmayacağım. Aşağıdaki linkten TA-LIB Windows/Linux kurulumu kısmına bakarak kurulumu gerçekleştirebilirsiniz.

ta-lib kurulumu

Numpy Kurulumu

Ta-lib ile birlikte array işlemlerimiz için kullanacağımız bir paket olan numpy kurulumunu da yapalım:

pip install numpy

Matplotlib Kurulumu

Wavetrend grafiğini python ile üretebilmek için yapmamız gereken son kurulum ise matplotlib kütüphanesinin kurulumu olacaktır. Matplotlib python evreninde en çok bilinen ve kullanılan grafik kütüphanesidir:

pip install matplotlib

Artık kurulumlarımız tamamlandığına göre, kodumuza geçelim.

Python ile Wavetrend Oscillator WT (LazyBear)

Daha önceki yazılarımda yapmış olduğum gibi orjinal tradingview üzerinde wave trend oscillator indikatörü nasıl bir grafik üretiyor.

Onu görelim, ardından da, python dilini kullanak, aynı grafiği matplotlib kütüphanesini kullanarak üretelim.

Tradingview üzerinde günlük btc-usdt grafiğine indikatörü uygulayalım, tarihimiz 26.04.2021:

wavetrend oscillator tradingview icerisinde

Görüldüğü üzere yeşil çizgi, kırmızı artıların üstünde seyrettiği zaman trend yukarı yönlü, tersine yeşil çizgi aşağıda olduğunda trend aşağı yönlü olduğuna işaret ediyor. Kesişim noktalarında da, özellikle aşırı alım ve satış bölgelerinde trendin dönüş yaptığını göstermektedir.

Python ile Wavetrend Oscillator Indikatörünün implementasyonu


import ccxt
import time
import datetime
import numpy as np
import talib as ta
import sys
import matplotlib.pyplot as plt

# cctx ile binance borsasına baglanti sagliyoruz.
# size ait binance api/key degerlerini giriyoruz.

exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'apiKey': 'API_KEYINIZ',
    'secret': 'SECRET_KODUNUZ',
    'timeout': 30000,
    'enableRateLimit': True,
})

# Market verilerini yüklüyoruz.
exchange.load_markets()

symbol = 'BTC/USDT'

# Bağlandığımız borsa, açılış, kapanış, en yüksek ve en düşük grafik değerlerini döndüren
# bir özelliğe sahip midir diye kontrol ediyoruz. 

if exchange.has['fetchOHLCV']:

    ohlcv = exchange.fetch_ohlcv(symbol, '1d', limit=500)

# Gelen değerler aşağıdaki formata uygun:

# [
#     [
#         1504541580000, // UTC timestamp in milliseconds, integer# 
#         4235.4,        // (O)pen price, float
#         4240.6,        // (H)ighest price, float
#         4230.0,        // (L)owest price, float
#         4230.7,        // (C)losing price, float
#         37.72941911    // (V)olume (in terms of the base currency), float
#     ],
#     ...
# ]


    high = [float(entry[2]) for entry in ohlcv]
    low = [float(entry[3]) for entry in ohlcv]
    close = [float(entry[4]) for entry in ohlcv]

    close_array = np.asarray(close)

    high_array = np.asarray(high)

    low_array = np.asarray(low)

    # tradingview pine scriptini nerdeyse birebir uyguluyorum, numpy arraylerini kullanarak.
    # ap, esa, d vs... değerlerini hesapla

    ap = (high_array+low_array+close_array)/3

    channel_length = 10

    esa = ta.EMA(ap, channel_length)

    d = ta.EMA(abs(ap - esa), channel_length)

    ci = (ap - esa) / (0.015 * d)

    average_length = 21

    tci = ta.EMA(ci, average_length)

    wt1 = tci

    wt2 = ta.SMA(wt1, 4)

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

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

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

    area_wt1_w2 = wt1-wt2

    obLevel1 = 60
    obLevel2 = 53

    osLevel1 = -60
    osLevel2 = -53

    plt.figure(figsize=(11, 6))
    plt.axhline(y=0, color='gray', linestyle='-')

    plt.axhline(y=obLevel1, color='red', linestyle='-')
    plt.axhline(y=obLevel2, color='red', linestyle='dotted')

    plt.axhline(y=osLevel1, color='green', linestyle='-')
    plt.axhline(y=osLevel2, color='green', linestyle='dotted')

    plt.plot(new_time_x[400:], wt1[400:], label='wt1', color='green')
    plt.plot(new_time_x[400:], wt2[400:], label='wt2', color='red')

    plt.fill_between(new_time_x[400:], 0, area_wt1_w2[400:], facecolor='lavender', interpolate=True)
    plt.xticks(rotation=90, fontsize=5)
    plt.title("Wavetrend Oscillator (LazyBear)) for BTC/USDT")
    plt.xlabel("Open Time")
    plt.ylabel("Value")
    plt.legend()
    plt.show()




Limit 500 dedik yani 500 mum üzerinde hesaplama yapıyoruz. Fakat grafikte daha rahat görünmesi için son 100 mumu dikkate alıyorum (new_time_x[400:]).

Matplotlib grafiğini yukardaki tradingview grafiği ile karşılaştırırsak, doğru sonuca ulaştığımızı görmüş oluruz:

matplotlib wavelength oscillator

Tradingview grafiğini tekrar görelim:

tradingview-son 100 muma göre wavelength oscillator

SONUÇ

Trading kısmındaki kodlarla ilgili şunu söylemeliyim. Belirli bir düzeyde python altyapısına sahip olmanız gerekiyor.

Diğer türlü temel python bilgileriniz eksik olursa, örneğin python listlerinin çalışma mantığı veya kullandığımız numpy kütüphanesinin fonksiyonları hakkında yeterli bilginiz olmazsa sıkıntı yaşamanız normal.

Fakat internette python ile ilgili hem ingilizce, hem de türkçe bol miktarda kaynak var. O yüzden öğrenmenize engel herhangi bir durum yok.

Evet arkadaşlar, yazımın sonuna gelmiş olduk. Her zaman olduğu gibi yorumlarınızı ve varsa önerilerinizi bekliyorum.

13 thoughts on “WaveTrend Oscillator WT (LazyBear) Nedir? Python (cctx) ile yazalım”

    1. pmaxtype = 8
      pmaxl = 12
      pmaxmulti = 2
      pmaxperiod = 10
      mavalue = ‘MA_’ + str(pmaxtype)+ ‘_’ + str(pmaxl)
      class pmax(IStrategy):
      minimal_roi = {
      # “0”: 0.23096,
      # “10”: 0.06246,
      # “26”: 0.01838,
      “0”: 1
      }
      plot_config = {
      ‘main_plot’: {
      f’pm_14_{pmaxmulti}_{pmaxl}_{pmaxtype}’: {‘color’: ‘red’},
      f'{mavalue}’: {‘color’: ‘blue’}
      }
      }
      stoploss = -0.1159
      # Trailing stop:
      trailing_only_offset_is_reached= True
      trailing_stop = True
      trailing_stop_positive = 0.00503
      trailing_stop_positive_offset= 0.0236
      timeframe = “1h”
      startup_candle_count: int = 124
      def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
      heikinashi = qtpylib.heikinashi(dataframe)
      heikinashi[“volume”] = dataframe[“volume”]
      # print(heikinashi,metadata[“pair”])
      pmdf = PMAX(heikinashi, MAtype=pmaxtype, length=pmaxl, multiplier=pmaxmulti, period=pmaxperiod, src=3)
      # dataframe[‘pmX_buy’] = pmdf[f’pmX_{pmaxperiod}_{pmaxmulti}_{pmaxl}_{pmaxtype}’]
      dataframe[f’pm_{pmaxperiod}_{pmaxmulti}_{pmaxl}_{pmaxtype}’] = pmdf[f’pm_{pmaxperiod}_{pmaxmulti}_{pmaxl}_{pmaxtype}’]
      dataframe[mavalue] = pmdf[mavalue]
      # pmdf2 = PMAX(dataframe, period=10, multiplier=3, length=13, MAtype=1, src=3)
      # dataframe[‘pmX_filtre’] = pmdf2[‘pmX_10_3_13_1’]
      # dataframe[“mom9”] = momentum9(dataframe)
      dataframe[“sar”] = ta.SAR(dataframe)
      # dataframe[“obv”] = ta.OBV(dataframe)
      # sellpoint := dataframe[“low”].rolling(window=3).min().tail(1)
      # dataframe_long = resample_to_interval(dataframe, 240)# 240=4 * 60=4h
      # dataframe_long[“mortirtik”] = MORTIRTIKbycoinspor(dataframe_long)
      # dataframe = resampled_merge(dataframe, dataframe_long, fill_na=True)
      # dataframe = dataframe.drop(
      # columns=[‘resample_60_open’, ‘resample_60_high’, ‘resample_60_low’, ‘resample_60_close’,”wto1″, “TKEema”]
      # )
      # print(dataframe[“mom9”],metadata[“pair”])
      return dataframe

    1. Farklı borsalara bağlanmak için aşağıdaki linkteki örneklere bakabilirsin.
      https://github.com/ccxt/ccxt

      # örnek bağlantılar:
      import ccxt

      hitbtc = ccxt.hitbtc({‘verbose’: True})
      bitmex = ccxt.bitmex()
      huobipro = ccxt.huobipro()
      exmo = ccxt.exmo({
      ‘apiKey’: ‘YOUR_PUBLIC_API_KEY’,
      ‘secret’: ‘YOUR_SECRET_PRIVATE_KEY’,
      })
      kraken = ccxt.kraken({
      ‘apiKey’: ‘YOUR_PUBLIC_API_KEY’,
      ‘secret’: ‘YOUR_SECRET_PRIVATE_KEY’,
      })

  1. hocam aşağıdaki hatayı alıyorum var mı tavsiyeniz

    C:\p>pip install six
    WARNING: Value for scheme.headers does not match. Please report this to
    distutils: c:\users\administrator\appdata\local\programs\python\python39\Include\UNKNOWN
    sysconfig: c:\users\administrator\appdata\local\programs\python\python39\Include
    WARNING: Additional context:
    user = False
    home = None
    root = None
    prefix = None
    Requirement already satisfied: six in c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages (1.15.0)
    WARNING: Value for scheme.headers does not match. Please report this to
    distutils: c:\users\administrator\appdata\local\programs\python\python39\Include\UNKNOWN
    sysconfig: c:\users\administrator\appdata\local\programs\python\python39\Include
    WARNING: Additional context:
    user = False
    home = None
    root = None
    prefix = None

  2. Merhaba bu gerçekten aradığım bir kaynak.

    Size bu konu ile ilgili birşey danışmak istiyorum. Yazınız iceriginde indikatörün al sat sinyalleri uretebildigini belirtmişsiniz. Bu sinyalleri binance borsası ile bağlantı kurdurup, sinyal verdiğinde al, sinyal verdiğinde sat işlemini nasıl yaptırabiliriz?

Yorum bırakın

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

Scroll to Top