CBSoft adlı üyeden alıntı: mesajı görüntüle
python-binance veya unicorn-binance-websocket-api kütüphanelerinden birini kullanarak websocket konusunu kolaylıkla çözebilirsiniz.

Yapmanız gereken işlem kısaca şu (1 dakikalık mumlarda işlem yaptığınızı görüyorum örnek bunun üzerinden gidecek):
  1. İlk olarak get_klines vb. fonksiyonlarla ihtiyacınız olan sayıda mum verisini (OHLC) alın. Bunu yapmak için ilgili fonksiyondaki limit parametresini kullanabilirsiniz.
  2. RSI hesabının doğru olması için periyodun en az 2-3 katı veri almanızı tavsiye ederim. Yalnız 14 periyotluk mum verisi gönderirseniz hesabınız hatalı olacaktır. Burada RSI çıktısını ekrana yazdırırsanız array([nan, nan, nan, ..., 56.648156, 57.043271]) şeklinde bir sonuçla karşılaşırsınız. Ortalama hesabı doğru olmadığı için beklediğiniz değeri elde edemesiniz.
  3. Örnek olarak 100 mum verisi aldığınızı farz edelim.
  4. Soketi dinlemeye başlayın. Buradaki mantık şu, fiyat hareketi olduğunda soketten size veri geliyor, ancak gelen her veri farklı bir mumu temsil etmiyor. Burada yeni bir muma geçip geçmediğinizi "x" elemanının değişip değişmediğine bakarak anlayabilirsiniz. Detaylar için dokümantasyona göz atın.
    {
    "e": "kline", // Event type
    "E": 123456789, // Event time
    "s": "BTCUSDT", // Symbol
    "k": {
    "t": 123400000, // Kline start time
    "T": 123460000, // Kline close time
    "s": "BTCUSDT", // Symbol
    "i": "1m", // Interval
    "f": 100, // First trade ID
    "L": 200, // Last trade ID
    "o": "0.0010", // Open price
    "c": "0.0020", // Close price
    "h": "0.0025", // High price
    "l": "0.0015", // Low price
    "v": "1000", // Base asset volume
    "n": 100, // Number of trades
    "x": false, // Is this kline closed?
    "q": "1.0000", // Quote asset volume
    "V": "500", // Taker buy base asset volume
    "Q": "0.500", // Taker buy quote asset volume
    "B": "123456" // Ignore
    }
    }
  5. Eğer x parametresi değişmişse (Is this kline closed?) mum kapanışına ait sinyali almışsınız demektir. Bundan sonraki veri yeni muma ait olacak.
  6. Eğer aldığınız soket verisinde mum kapanışına ait bilgi gelmemişse OHLC değerlerini tuttuğunuz listenin son elemanını güncelleyin, kapanış bilgisi gelmişse dizinin başından bir eleman silip sonuna yeni gelen veriyi ekleyin. Bu mantıkla sürekli olarak güncel fiyat verilerini takip etmiş olursunuz.
  7. ta-lib kütüphanesini kullanarak istediğiniz indikatöre ait fonksiyonu çağırarak hesaplamanızı yapın.
Temel mantığı kabaca bu şekilde izah edebilirim. Takıldığınız bir yer olursa buradan yazarak detayları paylaşabilirsiniz, müsait oldukça yardımcı olmaya çalışırım.

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()