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.
Files changed (28) hide show
  1. tradx/algoContainer.py +82 -2
  2. tradx/baseClass/baseAlgo.py +24 -9
  3. tradx/baseClass/{order.py → interactive/order.py} +6 -0
  4. tradx/baseClass/{orderEvent.py → interactive/orderEvent.py} +3 -1
  5. tradx/baseClass/{position.py → interactive/position.py} +8 -1
  6. tradx/interactiveEngine.py +197 -58
  7. tradx/marketDataEngine.py +254 -76
  8. {tradx-0.8.2.dist-info → tradx-0.9.dist-info}/METADATA +1 -1
  9. tradx-0.9.dist-info/RECORD +33 -0
  10. tradx-0.8.2.dist-info/RECORD +0 -33
  11. /tradx/baseClass/{positionEvent.py → interactive/positionEvent.py} +0 -0
  12. /tradx/baseClass/{tradeConversionEvent.py → interactive/tradeConversionEvent.py} +0 -0
  13. /tradx/baseClass/{tradeEvent.py → interactive/tradeEvent.py} +0 -0
  14. /tradx/baseClass/{candleData.py → market/candleData.py} +0 -0
  15. /tradx/baseClass/{cmInstrument.py → market/cmInstrument.py} +0 -0
  16. /tradx/baseClass/{futureInstrument.py → market/futureInstrument.py} +0 -0
  17. /tradx/baseClass/{index.py → market/index.py} +0 -0
  18. /tradx/baseClass/{instrumentPropertyChangeData.py → market/instrumentPropertyChangeData.py} +0 -0
  19. /tradx/baseClass/{ltpData.py → market/ltpData.py} +0 -0
  20. /tradx/baseClass/{ltpPartialData.py → market/ltpPartialData.py} +0 -0
  21. /tradx/baseClass/{marketDepthData.py → market/marketDepthData.py} +0 -0
  22. /tradx/baseClass/{marketStatusData.py → market/marketStatusData.py} +0 -0
  23. /tradx/baseClass/{openInterestData.py → market/openInterestData.py} +0 -0
  24. /tradx/baseClass/{openInterestPartialData.py → market/openInterestPartialData.py} +0 -0
  25. /tradx/baseClass/{optionsInstrument.py → market/optionsInstrument.py} +0 -0
  26. /tradx/baseClass/{touchLineData.py → market/touchLineData.py} +0 -0
  27. /tradx/baseClass/{touchLinePartialData.py → market/touchLinePartialData.py} +0 -0
  28. {tradx-0.8.2.dist-info → tradx-0.9.dist-info}/WHEEL +0 -0
@@ -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
- from decimal import Decimal
5
- from typing import Dict, Any
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="interactiveEngine.__init__",
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
- self.isConnected is True
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="interactiveEngine.market_order",
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="interactiveEngine.stop_market_order",
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="interactiveEngine.limit_order",
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="interactiveEngine.stop_limit_order",
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="interactiveEngine.on_order",
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="interactiveEngine.on_connect",
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="interactiveEngine.on_message",
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}", caller="interactiveEngine.on_error"
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="interactiveEngine.on_joined",
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="interactiveEngine.on_messagelogout"
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="interactiveEngine.reconnect"
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="interactiveEngine.reconnect")
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="interactiveEngine.on_disconnect",
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:20", "%H:%M").time():
560
- while not self.isConnected and cnt < 8:
561
- print("Attempting to reconnect as the time is before 3:20 PM and isConnected is False for interactive Socket.")
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:20 PM and isConnected is False.",
565
- caller="interactiveEngine.on_disconnect",
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( f"Reconnection attempt {cnt} failed for interactive socket. Retrying...")
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="interactiveEngine.on_disconnect",
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="interactiveEngine.on_disconnect",
713
+ caller=f"{self.set_iuserID}.on_disconnect",
581
714
  )
582
- print("Interactive Socket reconnection failed, emergency square off triggered.")
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="interactiveEngine.on_disconnect",
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="interactiveEngine.on_disconnect",
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="interactiveEngine.Liquidate",
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="interactiveEngine.on_trade"
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
- __ = PositionEvent(xts_message)
685
- if self.user_logger:
686
- self.user_logger.info(
687
- f"Received a position: {__}",
688
- caller="interactiveEngine.on_position",
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="interactiveEngine.on_tradeconversion",
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="interactiveEngine.login"
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="interactiveEngine.login")
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="interactiveEngine.shutdown"
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="interactiveEngine.shutdown",
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="interactiveEngine.shutdown")
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="interactiveEngine.Liquidate",
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="interactiveEngine.Liquidate",
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="interactiveEngine.cancel_order",
1042
+ caller=f"{self.set_iuserID}.cancel_order",
904
1043
  )