• 16-08-2021, 08:10:06
    #1
    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()
  • 16-08-2021, 08:31:54
    #2
    Merhabalar, 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:38
    #3
    keyiflerolsun adlı üyeden alıntı: mesajı görüntüle
    Merhabalar, piyasayı tradingview üzerinden takip edip yalnızca işlemi binance üzerinden yaparsanız daha sağlıklı bir çalışma olabilir..
    sü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.
  • 16-08-2021, 10:28:20
    #4
    fsahinoglu adlı üyeden alıntı: mesajı görüntüle
    sü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.
    bahsettiğim şuydu aslında; https://pypi.org/project/tradingview-ta/
  • 16-08-2021, 10:37:51
    #5
    keyiflerolsun adlı üyeden alıntı: mesajı görüntüle
    bahsettiğim şuydu aslında; https://pypi.org/project/tradingview-ta/
    veridiğ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....
    #! /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:22
    #6
    fsahinoglu adlı üyeden alıntı: mesajı görüntüle
    veridiğ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....
    #! /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.
    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.
  • 20-08-2021, 12:48:40
    #7
    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()
  • 20-08-2021, 14:32:43
    #8
    fsahinoglu 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()
    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()
  • 21-08-2021, 15:23:01
    #9
    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.