This repository was archived by the owner on Jan 18, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathposition.py
More file actions
91 lines (79 loc) · 3.05 KB
/
Copy pathposition.py
File metadata and controls
91 lines (79 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import time
import threading
import logging
from binance import ThreadedWebsocketManager
from config import _client, _api_call, _api_key, _api_secret
logger = logging.getLogger("Position")
_position_direction = None
def _rest():
global _position_direction
if _client is None:
return
try:
_position_info = _api_call(_client.futures_position_information, symbol="BTCUSDT")
if _position_info is None:
logger.error("Rest failed, API error. (Position:1)")
return
_position_amount = sum(float(p.get("positionAmt", 0)) for p in _position_info or [])
if abs(_position_amount) < 1e-8:
_position_direction = "NONE"
return
elif _position_amount > 0:
_position_direction = "LONG"
return
elif _position_amount < 0:
_position_direction = "SHORT"
return
except Exception as e:
logger.error("Rest error: %s. (Position:2)", e)
return
def _on_message(_message):
global _position_direction
try:
if _message['e'] == 'ACCOUNT_UPDATE':
for _position_info in _message['a']['P']:
if _position_info['s'] == 'BTCUSDT':
_position_amount = float(_position_info['pa'])
if abs(_position_amount) < 1e-8:
_position_direction = "NONE"
elif _position_amount > 0:
_position_direction = "LONG"
elif _position_amount < 0:
_position_direction = "SHORT"
logger.info("Websocket ~ direction: %s. (Position:3)", _position_direction)
return
except Exception as e:
logger.error("Websocket message error: %s. (Position:4)", e)
def _init_rest():
while _position_direction is None:
try:
_rest()
except Exception as e:
logger.error("Init rest error: %s. (Position:5)", e)
time.sleep(1)
def _websocket():
while True:
try:
_threaded_websocket_manager = ThreadedWebsocketManager(api_key=_api_key, api_secret=_api_secret)
_threaded_websocket_manager.start()
_threaded_websocket_manager.start_futures_user_socket(callback=_on_message)
logger.info("Websocket connected. (Position:6)")
while True:
time.sleep(1)
except Exception as e:
logger.error("Websocket loop error: %s. (Position:7)", e)
_threaded_websocket_manager.stop()
def _rest_loop():
_init_rest()
while True:
try:
_rest()
except Exception as e:
logger.error("Rest loop error: %s. (Position:8)", e)
time.sleep(5)
def _get_position_direction():
return _position_direction
def _position_thread_daemon():
threading.Thread(target=_websocket, daemon=True, name="_websocket").start()
threading.Thread(target=_rest_loop, daemon=True, name="_rest_loop").start()
logger.info("Position thread daemon started. (Position:9)")