DEV Community

Cover image for Bybit's Pybit: How to subscribe to kline stream via WebSocket
Kyle Foo
Kyle Foo

Posted on • Edited on

Bybit's Pybit: How to subscribe to kline stream via WebSocket

As a beginner crypto trader, I often look at automating my trades so I can sleep at ease. Bybit is one of the exchanges that offers open-sourced API, but its documentation can be outdated at times. Hence, I'm learning via trial and error and finally figured out how to use its WebSocket API.

Bybit's python library had been released with a new version. At the time of writing, Pybit's latest version is v2.1.0

Now, let's look at how to consume Pybit WebSocket API to stream realtime kline data:

from datetime import date, datetime, timedelta
import dateparser
import time
import hmac
import json
from pybit import usdt_perpetual

# Apply for API keys and secrets at  https://testnet.bybit.com/
api_key="xxx"
api_secret="xxx"

# Initialize web socket connection instance
ws = usdt_perpetual.WebSocket(
    test=True,
    api_key=api_key,
    api_secret=api_secret,
)

# Initialize http connection instance
session = usdt_perpetual.HTTP(endpoint="https://api-testnet.bybit.com", api_key=api_key, api_secret=api_secret)

# Define a target price that you want to enter your position
target_price = 40000

# handle_position is a callback that will be triggered on every new websocket event (push frequency can be 1-60s)
def handle_position(message):
    data = message["data"][0]
    if data:
        # check for target_price for entering position, if confirm=True, the data is the final tick for the interval. Otherwise, it is a snapshot.
        if data['close'] >= target_price and data['confirm'] == True:
            print("Buy Order | {} | {}".format(data['close'], time.strftime("%m/%d/%y, %H:%M:%S", time.localtime())))
            tp = target_price + (target_price * 0.05)
            sl = target_price - (target_price * 0.05)
            # Buy at market price to enter Long position
            ret = session.place_active_order(
                symbol="BTCUSDT",
                side="Buy",
                order_type="Market",
                qty=0.001, # amount to buy
                time_in_force="GoodTillCancel",
                reduce_only=False,
                close_on_trigger=False,
                take_profit=tp,
                tp_trigger_by="LastPrice",
                stop_loss=sl,
                sl_trigger_by="LastPrice",
                position_idx=0,
            )
            print("Buy Order Id | {}".format(ret["result"]["order_id"], time.strftime("%m/%d/%y, %H:%M:%S", time.localtime())))

# start kline stream here and pass in callback, symbol and desired kline interval
ws.kline_stream(callback=handle_position, symbol="BTCUSDT", interval="5")

Enter fullscreen mode Exit fullscreen mode

Notes: Do request for free credits on testnet.bybit.com so that you can have imaginary $$ to test your algorithm. Request can be done via live chat support.

Reference to official Pybit's WebSocket example: https://github.com/bybit-exchange/pybit/blob/master/examples/websocket_example.py

Top comments (1)

Collapse
 
mrshoja profile image
karen & kavan • Edited

Hi there,
I tried to convert below sample code from pinescript to pybit that is about trailing stop loss and take profit but I confused
**
actually my main question is:
in trailing tp/sl
What are the equivalent of Pinescript "trail_points" and "trail_offset" parameters in pybit "set_trading_stop" method?
**
please help me.

trail_stop_pct = input.float(0.5, title = "trailing stop activation (%)", group = "Exit Long", inline = "LTS", tooltip = "Trailing Threshold %")
trail_offset_pct = input.float(0.5, title = "trailing offset (%)", group = "Exit Long", inline = "LTS", tooltip = "Trailing offset %")
trail_stop_tick = trail_stop_pct * close / 100
trail_offset_tick = trail_offset_pct * close / 100

sl_pct = input.float(2, title = "SL", group = "SL and TP", inline = "SLTP")
tp_pct = input.float(9, title = "TP", group = "SL and TP", inline = "SLTP")

long_sl_price = strategy.position_avg_price * (1-sl_pct/100)
long_tp_price = strategy.position_avg_price * (1+tp_pct/100)
short_sl_price = strategy.position_avg_price * (1+sl_pct/100)
short_tp_price = strategy.position_avg_price * (1-tp_pct/100)

strategy.exit("Long Exit", "Long", stop = long_sl_price, limit = long_tp_price, trail_points = trail_stop_tick, trail_offset = trail_offset_tick)
strategy.exit("Short Exit", "Short", stop = short_sl_price, limit = short_tp_price, trail_points = trail_stop_tick, trail_offset = trail_offset_tick)

Enter fullscreen mode Exit fullscreen mode