aşağıdaki gibi denedim 14 de yazsam 100 de aynı sonuç hatalı geliyor sonuçlar websocketi çok zamanımı aldı eski sisteme devam:
isteyen kontrol edebilir dego yu 1 dkk lık rsi dinliyorum gerçek rakamlarla uyuşmadığını göreceksiniz.
import numpy as np
import websocket
import json
import pprint
import talib
import numpy
from binance.client import Client
from binance.enums import *
import config
import pandas as pd
SOCKET = "wss://stream.binance.com:9443/ws/degousdt@kline_1m"
#RSI Setup
RSI_PERIOD = 14
RSI_OVERBOUGHT = 70
RSI_OVERSOLD = 30
TRADE_SYMBOL = "DEGOUSDT"
TRADE_QUANTITY = 0.05
closes =[]
in_position = False
client = Client(config.API_KEY, config.API_SECRET)
def on_open(ws):
print('open connection')
def on_close(ws):
print('close connection')
def computeRSI(data, time_window):
diff = np.diff(data)
up_chg = 0 * diff
down_chg = 0 * diff
# up change is equal to the positive difference, otherwise equal to zero
up_chg[diff > 0] = diff[diff > 0]
# down change is equal to negative deifference, otherwise equal to zero
down_chg[diff < 0] = diff[diff < 0]
up_chg = pd.DataFrame(up_chg)
down_chg = pd.DataFrame(down_chg)
up_chg_avg = up_chg.ewm(com=time_window - 1, min_periods=time_window).mean()
down_chg_avg = down_chg.ewm(com=time_window - 1, min_periods=time_window).mean()
rs = abs(up_chg_avg / down_chg_avg)
rsi = 100 - 100 / (1 + rs)
rsi = int(rsi[0].iloc[-1])
return rsi
def on_message(ws, message):
global closes, in_position
print('received message')
json_message = json.loads(message)
#pprint.pprint(json_message)
candle = json_message['k']
is_candle_closed = candle['x']
close = candle['c']
closes.append(float(close))
#print("closes")
#print(closes)
close_array = numpy.array(closes)
#close_array = np.asarray(closes)
close_finished = close_array[:-1]
rsi = computeRSI(close_finished, 14)
print("TEST RSİ = ",rsi)
ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()
Aslında çok basit bir mantığa dayanıyor. Hata yaptığınız kısım şu, soketi dinliyorsunuz ve her gelen veriyi listeye ekliyorsunuz. Örneğin 1 dakikalık
RSI hesabında son 14 mumun kapanış fiyatları kullanılır. Siz ise soketten gelen son 14 veriyi kullanıyorsunuz. Bu da kabaca 10 saniyelik bir veriyi temsil ediyor olabilir. RSI hesabının doğru yapılamamasının sebebi bu. Yazının devamında nasıl düzeltebileceğinizi göstereceğim.
Göndermiş olduğunuz kodda kapanış fiyatlarını ekrana yazdırdığınızda bunu görebilirsiniz.
Şimdi de düzeltilmiş örnek üzerinden RSI değerlerinin uyuşup uyuşmadığına bakalım. Tradingview
52.75 değeri gösterirken biz
52.748782813272996 değerini bulmuşuz. Bunu 2 ondalık basamağa göre yuvarlarsanız birebir aynı değeri bulduğunuzu göreceksiniz.
Daha önce de söylediğim gibi soket başlatıldığında size geçmişe dönük mum verilerini vermez. Bu nedenle ya soketi başlatıp yeterince mum verisinin birikmesini beklersiniz ya da soketi başlatmadan önce o ana kadarki mum verilerini alır ve kalan kısmı soketi dinleyerek siz oluşturursunuz. Bunu yaparken de mumdaki değişikliği ya mumun kapandığına dair parametreyi (x) kullanarak ya da soketten gelen mum açılış verisinin tarihini (t) kontrol ettirerek yapabilirsiniz.
Düzeltilmiş kodlar aşağıdadır. Fazla vaktim olmadığı için yalnızca temel mantığı görebilmeniz için düzenledim.
import numpy as np
import websocket
import json
import pprint
import talib
import numpy
from binance.client import Client
from binance.enums import *
import config
import pandas as pd
SOCKET = "wss://stream.binance.com:9443/ws/degousdt@kline_1m"
#RSI Setup
RSI_PERIOD = 14
RSI_OVERBOUGHT = 70
RSI_OVERSOLD = 30
TRADE_SYMBOL = "DEGOUSDT"
TRADE_QUANTITY = 0.05
in_position = False
LIMIT = 500
client = Client(config.API_KEY, config.API_SECRET)
candles = client.get_klines(symbol=TRADE_SYMBOL, interval=Client.KLINE_INTERVAL_1MINUTE, limit=LIMIT)
def on_open(ws):
print('open connection')
def on_close(ws):
print('close connection')
def on_message(ws, message):
global candles, in_position
json_message = json.loads(message)
candle = json_message['k']
candle_data = [candle['t'], candle['o'], candle['h'], candle['l'], candle['c'], candle['v'], candle['T']]
if candle['t'] == candles[-1][0]:
candles[-1] = candle_data
else:
candles.append(candle_data)
if len(candles) > LIMIT:
candles.pop(0)
closes = numpy.asarray([float(c[4]) for c in candles])
rsi = talib.RSI(closes, RSI_PERIOD)
print('RSI: ' + str(rsi[-1]))
ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()