Merhaba arkadaşlar: Binance Websocket kullanarak al sat yapan bot yapmaya çalışıyorum. netten bulduğum kodlarda rsi değeri çok dengesiz çektiğini gördüm. elinizde basitte olsa düzenli çalışan rsi li bot'unuzu paylaşabilir misiniz. RSİ değerleri çok oynak çıkıyor. piyasada rsi 61 63 arasında değerler gidip geliyorsa uygulamada 58 47 65 değerleri gösteriyor. forumda Binance Websocket uygulaması bulamadım yada gözümden kaçmış olabilir. yardımcı olursanız sevinirim. sadece rsi değeri sağlam çeken kod kısmıda işime yarar geri kalanları ben halletmeye çalışırım. saygılar.
config.py
API_KEY = 'keygirin'
API_SECRET = 'secretgirin'
index.py
import websocket, json, pprint, talib, numpy
import config
from binance.client import Client
from binance.enums import *
SOCKET = "wss://stream.binance.com:9443/ws/ethusdt@kline_1m"
RSI_PERIOD = 14
RSI_OVERBOUGHT = 70
RSI_OVERSOLD = 30
TRADE_SYMBOL = 'ETHUSDT'
TRADE_QUANTITY = 0.05
closes = []
in_position = False
client = Client(config.API_KEY, config.API_SECRET, tld='us')
def on_open(ws):
print('opened connection')
def on_close(ws):
print('closed connection')
def on_message(ws, message):
global closes, in_position
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))
np_closes = numpy.array(closes)
rsi = talib.RSI(np_closes, RSI_PERIOD)
last_rsi = rsi[-1]
print(last_rsi)
ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()
python Binance Websocket bot kullanan var mı ?
10
●246
- 16-08-2021, 08:10:06
- 16-08-2021, 08:31:54Merhabalar, piyasayı tradingview üzerinden takip edip yalnızca işlemi binance üzerinden yaparsanız daha sağlıklı bir çalışma olabilir..
- 16-08-2021, 09:05:38sürekli bilgisayar başında olamıyorum. İndikatörlerin verdiği sinyalleri yorumlayıp üzerine koyduğum %1 karla al sat yapmayı düşünüyorum. Fakat soket olayında rsi çözemedim sorunlu çalışıyor.keyiflerolsun adlı üyeden alıntı: mesajı görüntüle
- 16-08-2021, 10:28:20bahsettiğim şuydu aslında; https://pypi.org/project/tradingview-ta/fsahinoglu adlı üyeden alıntı: mesajı görüntüle
- 16-08-2021, 10:37:51veridiğniiz örnek spesifik benim mevcutta kullandığım uygulamada hatalar alıyorum websoket önerdiler mevcut uygulamada hatalardan ötürü kendime uyarlayamadım en azından aldığım hatayı durdurup dosyayı yeniden başlatmak istiyorum otomatik netten bununla ilgili bir kod buldum fakat çalışmıyor : doğru düzgün çalışan bir uygulama geliştiremedim illa hata olacak hataları kapatmak için yama yapıyoruz offff....keyiflerolsun adlı üyeden alıntı: mesajı görüntüle
#! /bin/env python3
import os
import sys
def like_cheese():
var = input("Hi! I like cheese! Do you like cheese?").lower()
if var == "yes":
print("That's awesome!")
if __name__ == '__main__':
like_cheese()
os.execv(__file__, sys.argv) # Run a new iteration of the current script, providing any command line args from the current iteration. - 19-08-2021, 06:08:22python-binance veya unicorn-binance-websocket-api kütüphanelerinden birini kullanarak websocket konusunu kolaylıkla çözebilirsiniz.fsahinoglu adlı üyeden alıntı: mesajı görüntüle
Yapmanız gereken işlem kısaca şu (1 dakikalık mumlarda işlem yaptığınızı görüyorum örnek bunun üzerinden gidecek):
- İ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.
- 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.
- Örnek olarak 100 mum verisi aldığınızı farz edelim.
- 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 } } - 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.
- 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.
- 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. - 20-08-2021, 12:48:40CBSoft adlı üyeden alıntı: mesajı görüntüle
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() - 20-08-2021, 14:32:43Aslı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.fsahinoglu adlı üyeden alıntı: mesajı görüntüle
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() - 21-08-2021, 15:23:01değ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.CBSoft adlı üyeden alıntı: mesajı görüntüle

