CBSoft adlı üyeden alıntı: mesajı görüntüle
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()
değerli zamanını aldım dostum hakkını helal et closes = numpy.asarray([float(c[4]) for c in candles]) buradaki mantığı kavrayamadığım için dönüp dönüp aynı sorunu yaşamışım çok tşk ederim.