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.
WT indikatörü al-sat sinyalleri üretebilir, bunun dışında uyuşmazlık (divergence) tespit etmek için de kullanabilirsiniz:
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.
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.
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:
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:
Tradingview grafiğini tekrar görelim:
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.
pmax diye bi indikatör var, ona da bi el atsanız fena olmayacak üstat
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
dataframe’i nasıl tanımlıyoruz burada hocam? pmax’i anlık veri olarak çekemedim
farklı bir borsa için sadece burayı değiştirsek yeterli mi?
exchange_id = ‘binance’
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’,
})
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
warning ler dikkate almayabilirsiniz. Kurulum zaten yapılmış.
bunu uyumsuzluğu yakalamak için nasıl formülize edebiliriz? yazınızda keşke buna da değinseydiniz.
merhaba, al sat sinyallerini nasıl algılatacağız peki?
Al sat sinyali için wt1 ve wt2 arasında karşılaştırmayı başaramadım. if wt1 > wt2 kombinasyonunu nasıl yapmam gerekir ?
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?
range filter buy and sell 5 min indikatörü için python kodu nasıl yazılır peki?
Merhaba yeniyim indikatör kullanımında hızlı öğrenmek amacım destek olabilirseniz sevinirim
TradingView e nasıl kurulum yapabileceğimi anlamadım????