StatArb / StatBot / Execution / func_execution_calls.py
func_execution_calls.py
Raw
from config_execution_api import session_private
from config_execution_api import limit_order_basis
#from config_ws_connect import ws_public            # <- original code websocket method
from config_ws_connect import ws_public_get_orderbook   # <- new websocket method
from func_calcultions import get_trade_details
from exceptions import FailedRequestError, InvalidRequestError
from requests.exceptions import ConnectionError, Timeout, RequestException
from json.decoder import JSONDecodeError
# from simplejson.errors import JSONDecodeError

# Set leverage
def set_leverage(ticker):

    # Setting the leverage
    try:
        leverage_set = session_private.cross_isolated_margin_switch(
            symbol=ticker,
            is_isolated=True,
            buy_leverage=1,
            sell_leverage=1
        )
    # except (ConnectionError, Timeout, RequestException) as e:
    #     print(e)
    except Exception as e:
        pass
    # Return
    return


# Place limit or market order
def place_order(ticker, price, quantity, direction, stop_loss):

    exception = True
    try:
        # Set variables
        if direction == "Long":
            side = "Buy"
        else:
            side = "Sell"

        # Place limit order
        # if limit_order_basis:
        #     order = session_private.place_active_order(
        #         symbol=ticker,
        #         side=side,
        #         order_type="Limit",
        #         qty=quantity,
        #         price=price,
        #         time_in_force="PostOnly",
        #         reduce_only=False,
        #         close_on_trigger=False,
        #         stop_loss=stop_loss
        #     )
        # else:
        #     order = session_private.place_active_order(
        #         symbol=ticker,
        #         side=side,
        #         order_type="Market",
        #         qty=quantity,
        #         time_in_force="GoodTillCancel",
        #         reduce_only=False,
        #         close_on_trigger=False,
        #         stop_loss=stop_loss
        #     )

        # Place limit order - WITHOUT stop loss which will be managed by close profit/loss in main function
        if limit_order_basis:
            order = session_private.place_active_order(
                symbol=ticker,
                side=side,
                order_type="Limit",
                qty=quantity,
                price=price,
                time_in_force="PostOnly",
                reduce_only=False,
                close_on_trigger=False
            )
        else:
            order = session_private.place_active_order(
                symbol=ticker,
                side=side,
                order_type="Market",
                qty=quantity,
                time_in_force="GoodTillCancel",
                reduce_only=False,
                close_on_trigger=False
            )


        print("\n")
        print('-------------------------------------------------------------------')
        print("Place Order")
        print(order)
        print('-------------------------------------------------------------------')
        print("\n")
        
        exception = False
        # Return order
        return (order,exception)
    except (ConnectionError, Timeout, RequestException, JSONDecodeError, FailedRequestError, InvalidRequestError) as e:
        print(e)
        return ({},exception)

# Initialise execution
def initialise_order_execution(ticker, direction, capital):
    exception = True
    exception1 = False
    try:
        #orderbook = ws_public.fetch(f"orderBookL2_25.{ticker}")    # <- original code websocket method
        orderbook = ws_public_get_orderbook(ticker)         # <- new websocket method
        if orderbook:
            mid_price, stop_loss, quantity = get_trade_details(orderbook, direction, capital)
            if quantity > 0:
                order,exception1 = place_order(ticker, mid_price, quantity, direction, stop_loss)

                print("\n")
                print('-------------------------------------------------------------------')
                print("Initialise Order Execution")
                print(f"order: {order} exception1: {exception1}")
                print('-------------------------------------------------------------------')
                print("\n")
                
                if exception1:
                    return ("","",0,exception)
                if "result" in order.keys():
                    if "order_id" in order["result"] and len(order)>0:
                        exception = False
                        print("order status: ", order["result"]["order_id"],order["result"]["created_time"],quantity,exception)
                        return (order["result"]["order_id"],order["result"]["created_time"],quantity,exception)
        return ("","",0,exception)
    except (ConnectionError, Timeout, RequestException, JSONDecodeError, FailedRequestError, InvalidRequestError) as e:
        return ("","",0,exception)