tradx 0.8.2__py3-none-any.whl → 0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tradx/algoContainer.py +82 -2
- tradx/baseClass/baseAlgo.py +24 -9
- tradx/baseClass/{order.py → interactive/order.py} +6 -0
- tradx/baseClass/{orderEvent.py → interactive/orderEvent.py} +3 -1
- tradx/baseClass/{position.py → interactive/position.py} +8 -1
- tradx/interactiveEngine.py +197 -58
- tradx/marketDataEngine.py +254 -76
- {tradx-0.8.2.dist-info → tradx-0.9.dist-info}/METADATA +1 -1
- tradx-0.9.dist-info/RECORD +33 -0
- tradx-0.8.2.dist-info/RECORD +0 -33
- /tradx/baseClass/{positionEvent.py → interactive/positionEvent.py} +0 -0
- /tradx/baseClass/{tradeConversionEvent.py → interactive/tradeConversionEvent.py} +0 -0
- /tradx/baseClass/{tradeEvent.py → interactive/tradeEvent.py} +0 -0
- /tradx/baseClass/{candleData.py → market/candleData.py} +0 -0
- /tradx/baseClass/{cmInstrument.py → market/cmInstrument.py} +0 -0
- /tradx/baseClass/{futureInstrument.py → market/futureInstrument.py} +0 -0
- /tradx/baseClass/{index.py → market/index.py} +0 -0
- /tradx/baseClass/{instrumentPropertyChangeData.py → market/instrumentPropertyChangeData.py} +0 -0
- /tradx/baseClass/{ltpData.py → market/ltpData.py} +0 -0
- /tradx/baseClass/{ltpPartialData.py → market/ltpPartialData.py} +0 -0
- /tradx/baseClass/{marketDepthData.py → market/marketDepthData.py} +0 -0
- /tradx/baseClass/{marketStatusData.py → market/marketStatusData.py} +0 -0
- /tradx/baseClass/{openInterestData.py → market/openInterestData.py} +0 -0
- /tradx/baseClass/{openInterestPartialData.py → market/openInterestPartialData.py} +0 -0
- /tradx/baseClass/{optionsInstrument.py → market/optionsInstrument.py} +0 -0
- /tradx/baseClass/{touchLineData.py → market/touchLineData.py} +0 -0
- /tradx/baseClass/{touchLinePartialData.py → market/touchLinePartialData.py} +0 -0
- {tradx-0.8.2.dist-info → tradx-0.9.dist-info}/WHEEL +0 -0
tradx/interactiveEngine.py
CHANGED
@@ -1,18 +1,24 @@
|
|
1
|
+
# Importing from xts_api_client
|
1
2
|
from xts_api_client.xts_connect_async import XTSConnect
|
2
3
|
from xts_api_client.interactive_socket_client import InteractiveSocketClient
|
3
4
|
from xts_api_client.interactive_socket import OrderSocket_io
|
4
|
-
|
5
|
-
|
6
|
-
import asyncio
|
7
|
-
import shortuuid
|
5
|
+
|
6
|
+
# Importing from self module
|
8
7
|
from tradx.logger.logger import *
|
9
8
|
from tradx.baseClass.baseAlgo import BaseAlgo as bA
|
10
|
-
from tradx.baseClass.orderEvent import OrderEvent
|
11
|
-
from tradx.baseClass.positionEvent import PositionEvent
|
12
|
-
from tradx.baseClass.tradeEvent import TradeEvent
|
13
|
-
from tradx.baseClass.tradeConversionEvent import TradeConversionEvent
|
9
|
+
from tradx.baseClass.interactive.orderEvent import OrderEvent
|
10
|
+
from tradx.baseClass.interactive.positionEvent import PositionEvent
|
11
|
+
from tradx.baseClass.interactive.tradeEvent import TradeEvent
|
12
|
+
from tradx.baseClass.interactive.tradeConversionEvent import TradeConversionEvent
|
13
|
+
|
14
|
+
# Importing other python module
|
14
15
|
from datetime import datetime
|
15
16
|
import os
|
17
|
+
from decimal import Decimal
|
18
|
+
from typing import Dict, Any
|
19
|
+
import asyncio
|
20
|
+
import shortuuid
|
21
|
+
|
16
22
|
|
17
23
|
class interactiveEngine(InteractiveSocketClient):
|
18
24
|
"""
|
@@ -89,15 +95,17 @@ class interactiveEngine(InteractiveSocketClient):
|
|
89
95
|
self.shortuuid: shortuuid = shortuuid
|
90
96
|
self.set_interactiveToken: str = None
|
91
97
|
self.set_iuserID: str = None
|
98
|
+
self.set_isInvestorClient: str = None
|
92
99
|
self.funds: int = None
|
93
100
|
self.strategy_to_id: Dict[str, bA] = {}
|
94
101
|
self.position_diary_engine = {}
|
95
102
|
self.isConnected: bool = False
|
103
|
+
self.isLive: bool = False
|
96
104
|
self.user_logger = user_logger
|
97
105
|
if user_logger:
|
98
106
|
self.user_logger.info(
|
99
107
|
"Interactive Engine Object initialized.",
|
100
|
-
caller="
|
108
|
+
caller=f"{self.set_iuserID}.__init__",
|
101
109
|
)
|
102
110
|
|
103
111
|
async def market_order(
|
@@ -126,9 +134,9 @@ class interactiveEngine(InteractiveSocketClient):
|
|
126
134
|
- The disclosed quantity, limit price, and stop price are set to 0.
|
127
135
|
- Logs the response if user_logger is available.
|
128
136
|
"""
|
129
|
-
assert (
|
130
|
-
|
131
|
-
), f"Interactive Engine is not connected, Rejecting order with orderID: {orderUniqueIdentifier}."
|
137
|
+
# assert (
|
138
|
+
# self.isConnected is True
|
139
|
+
# ), f"Interactive Engine is not connected, Rejecting order with orderID: {orderUniqueIdentifier}."
|
132
140
|
allowed_exchange_segments = [
|
133
141
|
XTSConnect.EXCHANGE_NSECM,
|
134
142
|
XTSConnect.EXCHANGE_BSECM,
|
@@ -171,7 +179,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
171
179
|
if self.user_logger:
|
172
180
|
self.user_logger.info(
|
173
181
|
f"Place Order: {response}",
|
174
|
-
caller="
|
182
|
+
caller=f"{self.set_iuserID}.market_order",
|
175
183
|
)
|
176
184
|
|
177
185
|
async def stop_market_order(
|
@@ -248,7 +256,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
248
256
|
if self.user_logger:
|
249
257
|
self.user_logger.info(
|
250
258
|
f"Place Order: {response}",
|
251
|
-
caller="
|
259
|
+
caller=f"{self.set_iuserID}.stop_market_order",
|
252
260
|
)
|
253
261
|
|
254
262
|
async def limit_order(
|
@@ -312,7 +320,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
312
320
|
timeInForce=self.xt.TimeinForce_DAY,
|
313
321
|
disclosedQuantity=0,
|
314
322
|
orderQuantity=abs(orderQuantity),
|
315
|
-
limitPrice=limitPrice,
|
323
|
+
limitPrice=limitPrice.to_eng_string(),
|
316
324
|
stopPrice=0,
|
317
325
|
orderUniqueIdentifier=orderUniqueIdentifier,
|
318
326
|
clientID=self.set_iuserID,
|
@@ -320,7 +328,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
320
328
|
if self.user_logger:
|
321
329
|
self.user_logger.info(
|
322
330
|
f"Place Order: {response}",
|
323
|
-
caller="
|
331
|
+
caller=f"{self.set_iuserID}.limit_order",
|
324
332
|
)
|
325
333
|
|
326
334
|
async def stop_limit_order(
|
@@ -408,7 +416,35 @@ class interactiveEngine(InteractiveSocketClient):
|
|
408
416
|
if self.user_logger:
|
409
417
|
self.user_logger.info(
|
410
418
|
f"Place Order: {response}",
|
411
|
-
caller="
|
419
|
+
caller=f"{self.set_iuserID}.stop_limit_order",
|
420
|
+
)
|
421
|
+
|
422
|
+
async def modify_order(
|
423
|
+
self,
|
424
|
+
appOrderID: int,
|
425
|
+
modifiedProductType: str,
|
426
|
+
modifiedOrderType: str,
|
427
|
+
modifiedOrderQuantity: int,
|
428
|
+
modifiedLimitPrice: Decimal,
|
429
|
+
modifiedStopPrice: Decimal,
|
430
|
+
orderUniqueIdentifier: str,
|
431
|
+
):
|
432
|
+
response = await self.xt.modify_order(
|
433
|
+
appOrderID=appOrderID,
|
434
|
+
modifiedProductType=modifiedProductType,
|
435
|
+
modifiedOrderType=modifiedOrderType,
|
436
|
+
modifiedOrderQuantity=modifiedOrderQuantity,
|
437
|
+
modifiedDisclosedQuantity=0,
|
438
|
+
modifiedLimitPrice=modifiedLimitPrice.to_eng_string(),
|
439
|
+
modifiedStopPrice=modifiedStopPrice.to_eng_string(),
|
440
|
+
modifiedTimeInForce=self.xt.TimeinForce_DAY,
|
441
|
+
orderUniqueIdentifier=orderUniqueIdentifier,
|
442
|
+
clientID=self.set_iuserID,
|
443
|
+
)
|
444
|
+
if self.user_logger:
|
445
|
+
self.user_logger.info(
|
446
|
+
f"Modified Order: {response}",
|
447
|
+
caller=f"{self.set_iuserID}.modify_order",
|
412
448
|
)
|
413
449
|
|
414
450
|
async def initialize(self) -> None:
|
@@ -424,6 +460,55 @@ class interactiveEngine(InteractiveSocketClient):
|
|
424
460
|
await self.login()
|
425
461
|
await self.getBalance()
|
426
462
|
|
463
|
+
async def initializeClient(self, response: dict) -> None:
|
464
|
+
"""
|
465
|
+
Initializes the trading client using an explicitly supplied login response.
|
466
|
+
|
467
|
+
This method connects the trading socket (`XTSConnect`) using the provided
|
468
|
+
API credentials and sets common session variables such as token, user ID,
|
469
|
+
and investor client status. It is intended to be called when the login
|
470
|
+
response has already been obtained externally (for example, from `login()`
|
471
|
+
or shared from another session).
|
472
|
+
|
473
|
+
Args:
|
474
|
+
response (dict): A dictionary containing login information with keys:
|
475
|
+
- "token" (str): The session token for authentication.
|
476
|
+
- "userID" (str): The user identifier.
|
477
|
+
- "isInvestorClient" (bool): Whether the client is an investor.
|
478
|
+
|
479
|
+
Returns:
|
480
|
+
None
|
481
|
+
|
482
|
+
Raises:
|
483
|
+
KeyError: If required keys are missing from the response dictionary.
|
484
|
+
Exception: If initialization of XTSConnect fails.
|
485
|
+
|
486
|
+
Example:
|
487
|
+
```
|
488
|
+
# Using external login response
|
489
|
+
login_response = {
|
490
|
+
"token": "abc123token",
|
491
|
+
"userID": "USER001",
|
492
|
+
"isInvestorClient": True
|
493
|
+
}
|
494
|
+
await interactive_engine.initializeClient(login_response)
|
495
|
+
```
|
496
|
+
|
497
|
+
Note:
|
498
|
+
- This method sets `isConnected = True` immediately upon initialization
|
499
|
+
- The socket connection is not established in this method
|
500
|
+
- Use `initialize()` for complete setup including login and socket connection
|
501
|
+
- Useful for shared sessions or when login is handled by external systems
|
502
|
+
"""
|
503
|
+
self.xt = XTSConnect(
|
504
|
+
self._api_key, self._api_password, self._source, self._root
|
505
|
+
)
|
506
|
+
self.isConnected = True
|
507
|
+
self.xt._set_common_variables(
|
508
|
+
response["token"], response["userID"], response["isInvestorClient"]
|
509
|
+
)
|
510
|
+
print("Intialized interactive client.")
|
511
|
+
|
427
512
|
async def on_order(self, message: str) -> None:
|
428
513
|
"""
|
429
514
|
Handles incoming order messages.
|
@@ -444,7 +529,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
444
529
|
if self.user_logger:
|
445
530
|
self.user_logger.info(
|
446
531
|
__,
|
447
|
-
caller="
|
532
|
+
caller=f"{self.set_iuserID}.on_order",
|
448
533
|
)
|
449
534
|
|
450
535
|
async def on_connect(self) -> None:
|
@@ -459,7 +544,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
459
544
|
if self.user_logger:
|
460
545
|
self.user_logger.info(
|
461
546
|
"Interactive socket connected successfully!",
|
462
|
-
caller="
|
547
|
+
caller=f"{self.set_iuserID}.on_connect",
|
463
548
|
)
|
464
549
|
|
465
550
|
async def on_message(self, xts_message: Any) -> None:
|
@@ -475,7 +560,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
475
560
|
if self.user_logger:
|
476
561
|
self.user_logger.info(
|
477
562
|
f"Received a message: {xts_message}",
|
478
|
-
caller="
|
563
|
+
caller=f"{self.set_iuserID}.on_message",
|
479
564
|
)
|
480
565
|
|
481
566
|
async def on_error(self, xts_message: Any) -> None:
|
@@ -488,7 +573,8 @@ class interactiveEngine(InteractiveSocketClient):
|
|
488
573
|
"""
|
489
574
|
if self.user_logger:
|
490
575
|
self.user_logger.error(
|
491
|
-
f"Received a error: {xts_message}",
|
576
|
+
f"Received a error: {xts_message}",
|
577
|
+
caller=f"{self.set_iuserID}.on_error",
|
492
578
|
)
|
493
579
|
|
494
580
|
async def on_joined(self, data: Any) -> None:
|
@@ -503,7 +589,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
503
589
|
if self.user_logger:
|
504
590
|
self.user_logger.info(
|
505
591
|
f"Interactive socket joined successfully! {data}",
|
506
|
-
caller="
|
592
|
+
caller=f"{self.set_iuserID}.on_joined",
|
507
593
|
)
|
508
594
|
|
509
595
|
async def on_messagelogout(self, data: Any) -> None:
|
@@ -518,9 +604,49 @@ class interactiveEngine(InteractiveSocketClient):
|
|
518
604
|
"""
|
519
605
|
if self.user_logger:
|
520
606
|
self.user_logger.info(
|
521
|
-
f"logged out! {data}", caller="
|
607
|
+
f"logged out! {data}", caller=f"{self.set_iuserID}.on_messagelogout"
|
522
608
|
)
|
609
|
+
|
523
610
|
async def reconnect(self):
|
611
|
+
"""
|
612
|
+
Attempts to reconnect the interactive trading socket after a disconnection.
|
613
|
+
|
614
|
+
This method recreates the OrderSocket_io connection using existing session
|
615
|
+
credentials (token and user ID) without performing a new login. It is typically
|
616
|
+
called automatically by the `on_disconnect()` event handler during market hours
|
617
|
+
to restore trading connectivity.
|
618
|
+
|
619
|
+
Process:
|
620
|
+
1. Reinitializes the OrderSocket_io object with existing session credentials
|
621
|
+
2. Attempts to establish the socket connection
|
622
|
+
3. Logs the reconnection attempt status
|
623
|
+
4. Handles any connection errors gracefully
|
624
|
+
|
625
|
+
Raises:
|
626
|
+
Exception: If socket initialization or connection fails. The exception
|
627
|
+
is logged but not re-raised to allow retry attempts.
|
628
|
+
|
629
|
+
Returns:
|
630
|
+
None
|
631
|
+
|
632
|
+
Notes:
|
633
|
+
- Uses existing session token (`self.set_interactiveToken`) and user ID
|
634
|
+
- Does not perform a new API login, assumes existing session is valid
|
635
|
+
- Called automatically during market hours when `isLive = True`
|
636
|
+
- Logs both successful reconnection and any errors encountered
|
637
|
+
- Does not update `self.isConnected` flag (handled by socket events)
|
638
|
+
|
639
|
+
Example:
|
640
|
+
```
|
641
|
+
# Automatic reconnection in on_disconnect()
|
642
|
+
if current_time < market_close_time and self.isLive:
|
643
|
+
await self.reconnect()
|
644
|
+
```
|
645
|
+
See Also:
|
646
|
+
- `on_disconnect()`: Main disconnection handler that calls this method
|
647
|
+
- `login()`: Initial login and connection establishment
|
648
|
+
- `on_connect()`: Event handler for successful connections
|
649
|
+
"""
|
524
650
|
try:
|
525
651
|
# Initialize and connect OrderSocket_io object
|
526
652
|
self.socket = OrderSocket_io(
|
@@ -532,14 +658,15 @@ class interactiveEngine(InteractiveSocketClient):
|
|
532
658
|
# Log successful login
|
533
659
|
if self.user_logger:
|
534
660
|
self.user_logger.info(
|
535
|
-
f"Login successful.", caller="
|
661
|
+
f"Login successful.", caller=f"{self.set_iuserID}.reconnect"
|
536
662
|
)
|
537
663
|
|
538
664
|
await self.socket.connect()
|
539
|
-
|
665
|
+
|
540
666
|
except Exception as e:
|
541
667
|
if self.user_logger:
|
542
|
-
self.user_logger.error(e, caller="
|
668
|
+
self.user_logger.error(e, caller=f"{self.set_iuserID}.reconnect")
|
669
|
+
|
543
670
|
async def on_disconnect(self) -> None:
|
544
671
|
"""
|
545
672
|
Callback for handling disconnection events.
|
@@ -552,39 +679,47 @@ class interactiveEngine(InteractiveSocketClient):
|
|
552
679
|
if self.user_logger:
|
553
680
|
self.user_logger.info(
|
554
681
|
"Interactive Socket disconnected!",
|
555
|
-
caller="
|
682
|
+
caller=f"{self.set_iuserID}.on_disconnect",
|
556
683
|
)
|
557
684
|
current_time = datetime.now().time()
|
558
685
|
cnt: int = 0
|
559
|
-
if current_time < datetime.strptime("15:
|
560
|
-
while not self.isConnected and
|
561
|
-
print(
|
686
|
+
if current_time < datetime.strptime("15:30", "%H:%M").time():
|
687
|
+
while not self.isConnected and self.isLive:
|
688
|
+
print(
|
689
|
+
"Attempting to reconnect as the time is before 3:30 PM and isConnected is False for interactive Socket."
|
690
|
+
)
|
562
691
|
if self.user_logger:
|
563
692
|
self.user_logger.info(
|
564
|
-
"Attempting to reconnect as the time is before 3:
|
565
|
-
caller="
|
693
|
+
"Attempting to reconnect as the time is before 3:30 PM and isConnected is False.",
|
694
|
+
caller=f"{self.set_iuserID}.on_disconnect",
|
566
695
|
)
|
567
696
|
await self.reconnect()
|
568
697
|
await asyncio.sleep(3)
|
569
698
|
cnt += 1
|
570
699
|
if not self.isConnected and self.user_logger:
|
571
|
-
print(
|
700
|
+
print(
|
701
|
+
f"Reconnection attempt {cnt} failed for interactive socket. Retrying..."
|
702
|
+
)
|
572
703
|
self.user_logger.warning(
|
573
704
|
f"Reconnection attempt {cnt} failed. Retrying...",
|
574
|
-
caller="
|
705
|
+
caller=f"{self.set_iuserID}.on_disconnect",
|
575
706
|
)
|
707
|
+
|
708
|
+
"""
|
576
709
|
if cnt >= 8:
|
577
710
|
if self.user_logger:
|
578
711
|
self.user_logger.error(
|
579
712
|
f"Reconnection attempts failed. Please check the network connection.",
|
580
|
-
caller="
|
713
|
+
caller=f"{self.set_iuserID}.on_disconnect",
|
581
714
|
)
|
582
|
-
print(
|
715
|
+
print(
|
716
|
+
"Interactive Socket reconnection failed, emergency square off triggered."
|
717
|
+
)
|
583
718
|
# Log the initiation of the liquidation process
|
584
719
|
if self.user_logger:
|
585
720
|
self.user_logger.info(
|
586
721
|
f"Socket Disconnected, emergency square off triggered.",
|
587
|
-
caller="
|
722
|
+
caller=f"{self.set_iuserID}.on_disconnect",
|
588
723
|
)
|
589
724
|
|
590
725
|
# Retrieve day-wise positions
|
@@ -620,7 +755,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
620
755
|
lambda future: (
|
621
756
|
self.user_logger.info(
|
622
757
|
f"Place Order: {future.result()}",
|
623
|
-
caller="
|
758
|
+
caller=f"{self.set_iuserID}.on_disconnect",
|
624
759
|
)
|
625
760
|
if self.user_logger
|
626
761
|
else None
|
@@ -636,14 +771,14 @@ class interactiveEngine(InteractiveSocketClient):
|
|
636
771
|
lambda future: (
|
637
772
|
self.user_logger.info(
|
638
773
|
f"Cancel Order: {future.result()}",
|
639
|
-
caller="
|
774
|
+
caller=f"{self.set_iuserID}.Liquidate",
|
640
775
|
)
|
641
776
|
if self.user_logger
|
642
777
|
else None
|
643
778
|
)
|
644
779
|
)
|
645
780
|
os._exit(0)
|
646
|
-
|
781
|
+
"""
|
647
782
|
|
648
783
|
async def on_trade(self, xts_message: str) -> None:
|
649
784
|
"""
|
@@ -664,7 +799,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
664
799
|
__ = TradeEvent(xts_message)
|
665
800
|
if self.user_logger:
|
666
801
|
self.user_logger.info(
|
667
|
-
f"Received a trade: {__}", caller="
|
802
|
+
f"Received a trade: {__}", caller=f"{self.set_iuserID}.on_trade"
|
668
803
|
)
|
669
804
|
if __.OrderUniqueIdentifier != "Liquidated":
|
670
805
|
strategy_id = __.OrderUniqueIdentifier[:4]
|
@@ -680,13 +815,16 @@ class interactiveEngine(InteractiveSocketClient):
|
|
680
815
|
Returns:
|
681
816
|
None
|
682
817
|
"""
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
self.user_logger
|
687
|
-
|
688
|
-
|
689
|
-
|
818
|
+
print(f"Position Event received with message: {xts_message}")
|
819
|
+
try:
|
820
|
+
__ = PositionEvent(xts_message)
|
821
|
+
if self.user_logger:
|
822
|
+
self.user_logger.info(
|
823
|
+
f"Received a position: {__}",
|
824
|
+
caller=f"{self.set_iuserID}.on_position",
|
825
|
+
)
|
826
|
+
except Exception as e:
|
827
|
+
print(f"Error in position event {xts_message}: {e}")
|
690
828
|
"""Update Interactive Engine Position Diary."""
|
691
829
|
# ExchangeInstrumentID = int(on_position["ExchangeInstrumentID"])
|
692
830
|
# if ExchangeInstrumentID not in self.position_diary_engine:
|
@@ -710,7 +848,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
710
848
|
if self.user_logger:
|
711
849
|
self.user_logger.info(
|
712
850
|
f"Received a trade conversion: {__}",
|
713
|
-
caller="
|
851
|
+
caller=f"{self.set_iuserID}.on_tradeconversion",
|
714
852
|
)
|
715
853
|
|
716
854
|
async def login(self) -> None:
|
@@ -738,13 +876,14 @@ class interactiveEngine(InteractiveSocketClient):
|
|
738
876
|
|
739
877
|
# Perform interactive login
|
740
878
|
response = await self.xt.interactive_login()
|
879
|
+
|
741
880
|
self.set_interactiveToken = response["result"]["token"]
|
742
881
|
self.set_iuserID = response["result"]["userID"]
|
743
|
-
|
882
|
+
self.set_isInvestorClient = response["result"]["isInvestorClient"]
|
744
883
|
# Log successful login
|
745
884
|
if self.user_logger:
|
746
885
|
self.user_logger.info(
|
747
|
-
f"Login successful.", caller="
|
886
|
+
f"Login successful.", caller=f"{self.set_iuserID}.login"
|
748
887
|
)
|
749
888
|
|
750
889
|
# Initialize and connect OrderSocket_io object
|
@@ -760,7 +899,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
760
899
|
except Exception as e:
|
761
900
|
# Log and re-raise any exceptions
|
762
901
|
if self.user_logger:
|
763
|
-
self.user_logger.error(e, caller="
|
902
|
+
self.user_logger.error(e, caller=f"{self.set_iuserID}.login")
|
764
903
|
raise (e)
|
765
904
|
|
766
905
|
async def shutdown(self) -> None:
|
@@ -782,7 +921,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
782
921
|
# Log the start of the shutdown process
|
783
922
|
if self.user_logger:
|
784
923
|
self.user_logger.info(
|
785
|
-
"Entering shut down mode.", caller="
|
924
|
+
"Entering shut down mode.", caller=f"{self.set_iuserID}.shutdown"
|
786
925
|
)
|
787
926
|
|
788
927
|
# Disconnect the socket connection
|
@@ -795,13 +934,13 @@ class interactiveEngine(InteractiveSocketClient):
|
|
795
934
|
if self.user_logger:
|
796
935
|
self.user_logger.info(
|
797
936
|
f"Logged Out.",
|
798
|
-
caller="
|
937
|
+
caller=f"{self.set_iuserID}.shutdown",
|
799
938
|
)
|
800
939
|
|
801
940
|
except Exception as e:
|
802
941
|
# Log and re-raise any exceptions
|
803
942
|
if self.user_logger:
|
804
|
-
self.user_logger.error(e, caller="
|
943
|
+
self.user_logger.error(e, caller=f"{self.set_iuserID}.shutdown")
|
805
944
|
raise (e)
|
806
945
|
|
807
946
|
async def getBalance(self) -> int:
|
@@ -849,7 +988,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
849
988
|
if self.user_logger:
|
850
989
|
self.user_logger.info(
|
851
990
|
f"Cancel open order and square off position for {exchangeSegment}",
|
852
|
-
caller="
|
991
|
+
caller=f"{self.set_iuserID}.Liquidate",
|
853
992
|
)
|
854
993
|
|
855
994
|
# Cancel all open orders for the specified exchange segment
|
@@ -859,7 +998,7 @@ class interactiveEngine(InteractiveSocketClient):
|
|
859
998
|
if self.user_logger:
|
860
999
|
self.user_logger.info(
|
861
1000
|
response,
|
862
|
-
caller="
|
1001
|
+
caller=f"{self.set_iuserID}.Liquidate",
|
863
1002
|
)
|
864
1003
|
|
865
1004
|
# Retrieve day-wise positions
|
@@ -900,5 +1039,5 @@ class interactiveEngine(InteractiveSocketClient):
|
|
900
1039
|
if self.user_logger:
|
901
1040
|
self.user_logger.info(
|
902
1041
|
f"Cancel Order: {response}",
|
903
|
-
caller="
|
1042
|
+
caller=f"{self.set_iuserID}.cancel_order",
|
904
1043
|
)
|