
    'i_J                     8   d dl mZmZmZmZ d dlZd dlmZmZmZm	Z	 d dl
Zd dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZ  G d	 d
e      Zej@                  dz  Z!ddZ" G d de      Z# G d de      Z$ G d d ee$e            Z%y)    )absolute_importdivisionprint_functionunicode_literalsN)datedatetimetime	timedelta)	TimeFramePosition)DataBase)
MetaParams)MAXINTrangequeuestring_typeswith_metaclass)AutoDictc                       e Zd Zg dZd Zy)_SymInfo)TypeDescriptionDecimals
TimeOffset
PointValueMinMovementc           	      T    | j                   D ]  }t        | |t        ||              y N)_fieldssetattrgetattr)selfsyminfofs      W/var/www/app/trading-bot/venv/lib/python3.12/site-packages/backtrader/stores/vcstore.py__init__z_SymInfo.__init__.   s(     	2AD!WWa01	2    N)__name__
__module____qualname__r   r&    r'   r%   r   r   )   s    ,G2r'   r      c           
      .   ,t         j                  j                  j                  dddd      t	              }d}fd} t        j
                  t         j                  t         j                        |      }t         j                  j                  j                  |d       	 	  |        }|dkD  r|dz  }t        |      }	 t         j                  j                  j                  dt        |      t        |      |t        j                  t        j                                      }t         j                  j                  j#                         t         j                  j                  j                  |d       t$        # t        $ r | }Y w xY w# t&        $ rz}|j(                  d   |k(  r| |        Y d}~t         j                  j                  j#                         t         j                  j                  j                  |d        d}~ww xY w)	a$  This following code waits for 'timeout' seconds in the way
    required for COM, internally doing the correct things depending
    on the COM appartment of the current thread.  It is possible to
    terminate the message loop by pressing CTRL+C, which will raise
    a KeyboardInterrupt.
    NTFic                 d    | dk(  r*t         j                  j                  j                         yyNr   r,   )ctypeswindllkernel32SetEvent)
dwCtrlTypehevts    r%   HandlerRoutinez"PumpEvents.<locals>.HandlerRoutine^   s(    ?MM""++D1r'   r,   r   i  )r0   r1   r2   CreateEventA_handles_typeWINFUNCTYPEc_intc_uintSetConsoleCtrlHandler	TypeErrorintoledllole32CoWaitForMultipleHandleslenbyrefc_ulongCloseHandleKeyboardInterruptWindowsErrorargs)	timeoutr5   cbhandlesRPC_S_CALLPENDINGr6   tmoutresdetailss	    `       r%   
PumpEventsrP   8   s   > |}}%%224udKD!G# 	86<<7G  MM00C
	IE 19TMEE
	$--%%>>E
GV^^-.C* MM""..t4MM""88K##?  	E	"  
	||A"33>D &&2248&&<<^QO
	s2   &F  A$F  FF	HH;AHHc                   $    e Zd Zd Zd Zd Zd Zy)RTEventSinkc                 B    || _         |j                  | _        d | _        y r   )storevcrtmodlastconn)r"   rT   s     r%   r&   zRTEventSink.__init__   s    
}}r'   c                      y r   r+   )r"   
ArrayTickss     r%   
OnNewTickszRTEventSink.OnNewTicks       r'   c                 b    | j                   j                  | j                   j                         y r   )rT   _vcrt_connection_RT_SHUTDOWNr"   s    r%   OnServerShutDownzRTEventSink.OnServerShutDown   s    

##DJJ$;$;<r'   c                     |dk7  ry || j                   k(  ry || _         | j                  j                  | j                  j                  |z
         y )Nr,   )rV   rT   r\   _RT_BASEMSG)r"   p1p2p3s       r%   OnInternalEventzRTEventSink.OnInternalEvent   sE    7 	

##DJJ$:$:R$?@r'   N)r(   r)   r*   r&   rY   r_   re   r+   r'   r%   rR   rR      s    
=
Ar'   rR   c                   ,     e Zd ZdZ fdZ fdZ xZS )MetaSingletonz1Metaclass to make a metaclassed class a singletonc                 >    t         t        |   |||       d | _        y r   )superrg   r&   
_singleton)clsnamebasesdct	__class__s       r%   r&   zMetaSingleton.__init__   s    mS*4<r'   c                 d    | j                   t        t        |   |i || _         | j                   S r   )rj   ri   rg   __call__)rk   rH   kwargsro   s      r%   rq   zMetaSingleton.__call__   s4    >>!mS2DCFC N ~~r'   )r(   r)   r*   __doc__r&   rq   __classcell__)ro   s   @r%   rg   rg      s    ; r'   rg   c                   j   e Zd ZdZdZdZdZej                   e	dd      z
  Z
ej                   e	d      z
  ZdZdZdZd	Zd
ZdZdZdZdZed        Zed        ZdZdZg dg dg dfZdZdZdZd Zd Zd Z d Z!d Z"d.dZ#d Z$d  Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+d' Z,d( Z-d) Z.d* Z/	 	 d/d+Z0d, Z1d- Z2y)0VCStorezSingleton class wrapping an ibpy ibConnection instance.

    The parameters can also be specified in the classes which use this store,
    like ``VCData`` and ``VCBroker``

    Nir,   )daysseconds)rx      i i i  i i c                 &     | j                   |i |S )z%Returns ``DataCls`` with args, kwargs)DataClsrk   rH   rr   s      r%   getdatazVCStore.getdata   s     s{{D+F++r'   c                 &     | j                   |i |S )zAReturns broker with *args, **kwargs from registered ``BrokerCls``)	BrokerClsr~   s      r%   	getbrokerzVCStore.getbroker   s     s}}d-f--r'   )zVCDataSource64.dllzVCRealTimeLib64.dllzCOMTraderInterfaces64.dll)zVCDataSource.dllzVCRealTimeLib.dllzCOMTraderInterfaces.dll)z&{EB2A77DC-A317-4160-8833-DECF16275A05}r,   r   )z&{86F1DB04-2591-4866-A361-BB053D77FA18}r,   r   )z&{20F8873C-35BE-4DB4-8C2A-0A8D40F8AEC3}r,   r   z"SOFTWARE\VCG\Visual Chart 6\Config	Directorybinc                    dd l }d }|j                  |j                  fD ]@  }	 |j                  || j                        }	 |j                  || j                        \  }} n || j                  S t        j                  j                  || j                        }| j                  | j                  fD ]x  }g }	|D ]T  }
t        j                  j                  ||
      }t        j                  j                  |      s n|	j!                  |       V t#        |	      t#        |      k(  sv|	c S  | j                  S # t
        $ r}Y d }~)d }~ww xY w# t
        $ r}Y d }~@d }~ww xY w)Nr   )_winregHKEY_CURRENT_USERHKEY_LOCAL_MACHINEOpenKey
VC_KEYNAMErG   QueryValueEx	VC_KEYVALVC_TLIBSospathjoin
VC_BINPATH	VC64_DLLSVC_DLLSisfileappendrB   )r"   r   vcdirrkeyvckeye_vcbindllsdfounddllfpaths               r%   find_vchartzVCStore.find_vchart   sG    	 ..0J0JL 	Ddoo>
"//t~~Fq 	 ===  UDOO4 ^^T\\3 		DF %UC0ww~~e,e$	% 6{c$i'		 }}=      s#   D9 E9	EE	E$E$c                 x    	 dd l }|| _         ddlm}m}m} || _        || _        || _        y# t
        $ r Y yw xY w)Nr   )CreateObject	GetEvents	GetModuleFT)comtypescomtypes.clientr   r   r   ImportError)r"   r   r   r   r   s        r%   _load_comtypeszVCStore._load_comtypes   sF    		$DMJJ ,D&DN&DN   		s   *- 	99c                 6   d| _         t        j                         | _        d | _        t        j                         | _        t               | _        t               | _        | j                         s$d}| j                  |f} | j                  |g|  y | j                         }	 | j                  |d         | _        | j                  |d         | _        | j                  |d         | _        	 | j)                  | j                  j*                        | _        | j)                  | j                   j.                        | _        d| _         t               | _        t7        | j                        D ]7  }|j9                  d	      s|| j4                  t;        | j                  |      <   9 t<        j>                  | j                  j@                  dft<        jB                  | j                  j@                  dft<        jD                  | j                  j@                  dft<        jF                  | j                  jH                  dft<        jJ                  | j                  jL                  dft<        jN                  | j                  jP                  dft<        jR                  | j                  jT                  dft<        jV                  | j                  jT                  d
fi| _        y # t"        $ rQ}d | _        d | _        d | _        dj%                  |      }| j&                  |f} | j                  |g|  Y d }~y d }~ww xY w# t"        $ rQ}dj%                  |      }| j&                  |f} | j                  |g|  d | _        d | _        d | _        Y d }~y d }~ww xY w)NFzFailed to import comtypesr   r,      z%Failed to Load COM TypeLib Modules {}zFailed to Load COM TypeLib Objects but the COM TypeLibs have been loaded. If VisualChart has been recently installed/updated, restarting Windows may be necessary to register the Objects: {}TField   ),
_connectedcollectionsdequenotifst_vcconn_dqsdict_qdatas_tftabler   _RT_COMTYPESput_notificationr   r   vcdsmodrU   vcctmodrG   format_RT_TYPELIBr   DataSourceManagervcdsTradervcctvcrt
vcrtfieldsdir
startswithr!   r   TicksCT_TicksMicroSecondsSecondsMinutes
CT_MinutesDaysCT_DaysWeeksCT_WeeksMonths	CT_MonthsYears)r"   txtmsg
vctypelibsr   rl   s         r%   r&   zVCStore.__init__/  s   !'')  %%'	v""$-C##S(C!D!!#,,%%'
	>>*Q-8DL>>*Q-8DL>>*Q-8DL	))$,,*H*HIDI))$,,*=*=>DI  &% 	DDw'?Cd ;<	D OOdll33Q7""T\\%:%:A$> 5 5q9 7 7;NNT\\1115OOdll33Q7t||55q9OOdll44b9	
G  	DLDLDL9@@CC""C'C!D!!#,,	  
	1 28  ""C'C!D!!#,,DIDIDI
	s4   $AK! 0AL> !	L;*AL66L;>	NANNc                 @    | j                   j                  |||f       y r   )r   r   )r"   r   rH   rr   s       r%   r   zVCStore.put_notificationu  s    Cv./r'   c                     | j                   j                  d       t        | j                   j                  d      D cg c]  }| c}S c c}w )z(Return the pending "store" notificationsN)r   r   iterpopleft)r"   xs     r%   get_notificationszVCStore.get_notificationsx  s9    4  3 3T:;a;;;s   	A
c                 *   | j                   sy | j                  >t        j                  | j                        x| _        }d|_        |j                          |:t        j                  | j                  |f      }d|_        |j                          y y )N)targetT)r   rH   )r   r   	threadingThread_start_vcrtdaemonstart	_t_broker)r"   databrokerts       r%   r   zVCStore.start}  sv    ==  ) 0 08H8H IIDMAAHGGI  fYGAAHGGI r'   c                      y r   r+   r^   s    r%   stopzVCStore.stop  rZ   r'   c                     | j                   S r   )r   r^   s    r%   	connectedzVCStore.connected  s    r'   c                    | j                   j                          | j                  | j                  j                        }t        |       }| j                  ||      }t                | j                   j                          y r   )	r   CoInitializer   rU   RealTimerR   r   rP   CoUninitialize)r"   r   sinkconns       r%   r   zVCStore._start_vcrt  s[    ""$  !6!674 ~~dD)$$&r'   c                     |dk(  rd}n|dk(  rd}n
|dk(  rd}nd}||f} | j                   |g|  | j                  D ]  }|j                  |        y )Nry   )zVisualChart shutting downrz   zVisualChart is Disconnectedr{   zVisualChart is Connectedz&VisualChart unknown connection status )r   r   put)r"   statusr   r   qs        r%   r\   zVCStore._vcrt_connection  sj    W.Cw/Cw,C:C6kc(C( 	AEE&M	r'   c                 4    | j                   |   \  }}|||z  fS r   )r   )r"   	timeframecompression	extracomps       r%   _tf2ctzVCStore._tf2ct  s%    #}}Y7	9+	111r'   c                 X    | j                   |   \  }}|| j                  j                  k(  S r   )r   r   r   )r"   r   vctimeframer   s       r%   _tickingzVCStore._ticking  s)    y1Qdll3333r'   c                     t        j                         }| j                  j                  |       || j                  |<   |S r   )r   Queuer   r   r   )r"   r   r   s      r%   _getqzVCStore._getq  s1    KKM		Qr'   c                 p    | j                   j                  |       | j                  j                  |       y r   )r   remover   popr"   r   s     r%   _delqzVCStore._delq  s&    		r'   c                     t        ||      }t        j                  | j                  |      }d|_        |j                          y )N)r   symbolr   rr   T)r   r   r   	_t_rtdatar   r   )r"   r   r  rr   r   s        r%   _rtdatazVCStore._rtdata  s4    4/DNN6B		r'   c                 "   | j                   j                          | j                  | j                  j                        }| j                  ||      }||_        |j                  |d       t                ~| j                   j                          y NF)
r   r   r   rU   r   r   _vcrtRequestSymbolFeedrP   r   )r"   r   r  r   r   s        r%   r  zVCStore._t_rtdata  sk    ""$  !6!67~~dD)
vu-$$&r'   c                    d| j                   _        | j                   j                  || j                  j                  d| j
                  | j                        }t        |j                               }| j                   j                  |       |S r/   )
r   ActiveEventsNewDataSerier   r   MAXDATE1MAXDATE2r   GetSymbolInfoDeleteDataSource)r"   r  serier#   s       r%   _symboldatazVCStore._symboldata  sq     "#		 		&&v'+||';';Q'+}}dmmE 5..01		""5)r'   c                 &    | j                  |       y r   )r  r  s     r%   _canceldirectdatazVCStore._canceldirectdata  s    

1r'   c                    | j                  ||      \  }}t               j                         }|j                  d       | j	                  |      x|d<   }	t        j                  | j                  |      }
d|
_        |
j                          |	S )Nr"   r   r  T)
r   localscopyr   r   r   r   _t_directdatar   r   )r"   r   r  r   r   d1d2
historicalrr   r   r   s              r%   _directdatazVCStore._directdata  sx    
 "&Y!D	;

6**T**saD$6$6vF		 r'   c	                 z   | j                   j                          | j                  | j                  j                        }	|xs |d u}|s#d|	_        | j                  j                  |	_        nd|	_        ||	j                  |||||      }
n|	j                  ||||      }
|j                  |
       |j                  |
|       |r|j                  d        d }n| j                  |	|      }	 t        |j                  |j                         |~|	j!                  |
       | j                   j#                          y )Nr,   r   )	forcepush)rI   rJ   )r   r   r   r   r   r  	EF_Always
EventsTyper  	_setserieOnNewDataSerieBarr   r   rP   _getpingtmoutpingr  r   )r"   r   r  r   r   r  r  r   r  r   r  dsconns               r%   r  zVCStore._t_directdata  s    	""$  !?!?@12T>
 !D"ll44DO !D>%%fib"ME%%fibIEu 	u
;EE$KF^^D$/F 	4--$))< 	e$$$&r'   c                     | j                   j                          | j                  | j                  j                        }| j                  | ||            }t                ~| j                   j                          y r   )r   r   r   r   r   r   rP   r   )r"   r   traderr   s       r%   r   zVCStore._t_broker  sX    ""$""4<<#6#67~~ffVn5$$&r'   )NNr	  )3r(   r)   r*   rs   r   r}   MAXUINTr   maxr
   r  r  r]   ra   _RT_DISCONNECTED_RT_CONNECTED_RT_LIVE_RT_DELAYEDr   _RT_TYPEOBJr   classmethodr   r   r   r   r   r   r   r   r   r   r&   r   r   r   r   r   r   r\   r   r   r   r  r  r  r  r  r  r  r   r+   r'   r%   rv   rv      s?    IG G ||iQ::H||i22HLKMHKKKL, , . .
/I+G
 	988H 7JIJ,\D
L0<
'"2
4
' <@$"%'P'r'   rv   )NN)&
__future__r   r   r   r   r   r   r   r	   r
   os.pathr   r   _timemodr0   
backtraderr   r   backtrader.feedr   backtrader.metabaser   backtrader.utils.py3r   r   r   r   r   backtrader.utilsr   objectr   c_void_pr8   rP   rR   rg   rv   r+   r'   r%   <module>r=     s   ** *  4 4     * $ *2 2 %2v 2 !#S$xA& A2J f'n]F3 f'r'   