
    'iW                         d dl mZmZmZmZ d dlmZmZmZ d dlZ	d dlm
Z
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 d dlmZ  G d	 d
ej0                        Z G d d eee            Zy)    )absolute_importdivisionprint_functionunicode_literals)datetime	timedeltatzinfoN)	TimeFramedate2numnum2date)DataBase)
MetaParams)integer_typesqueuestring_typeswith_metaclass)vcstorec                        e Zd Z fdZ xZS )
MetaVCDatac                 Z    t         t        |   |||       | t        j                  _        y)z+Class has already been created ... registerN)superr   __init__r   VCStoreDataCls)clsnamebasesdct	__class__s       U/var/www/app/trading-bot/venv/lib/python3.12/site-packages/backtrader/feeds/vcdata.pyr   zMetaVCData.__init__&   s&     	j#'eS9 #&    )__name__
__module____qualname__r   __classcell__r   s   @r    r   r   %   s    & &r!   r   c                   P    e Zd ZdZdZ e       Z ed      \  ZZ	Z
 edddddd      Z ed	      Zd
Zddddddddddd
Zddddddddddd
ZdZej&                   ed      ej(                   ed      ej*                   ed      ej,                   ed       ej.                   ed!      ej0                   ed"      ej2                   ed#      ej4                   ed$      iZd% Zd& Zd5d'Zd( Zd) Z  fd*Z! fd+Z" fd,Z#d- Z$d. Z%d/ Z&d0 Z'd5d1Z(d2 Z)	 d3 Z+d4 Z, xZ-S )6VCDataa;  VisualChart Data Feed.

    Params:

      - ``qcheck`` (default: ``0.5``)
        Default timeout for waking up to let a resampler/replayer that the
        current bar can be check for due delivery

        The value is only used if a resampling/replaying filter has been
        inserted in the data

      - ``historical`` (default: ``False``)
        If no ``todate`` parameter is supplied (defined in the base class),
        this will force a historical only download if set to ``True``

        If ``todate`` is supplied the same effect is achieved

      - ``milliseconds`` (default: ``True``)
        The bars constructed by *Visual Chart* have this aspect:
        HH:MM:59.999000

        If this parameter is ``True`` a millisecond will be added to this time
        to make it look like: HH::MM + 1:00.000000

      - ``tradename`` (default: ``None``)
        Continous futures cannot be traded but are ideal for data tracking. If
        this parameter is supplied it will be the name of the current future
        which will be the trading asset. Example:

        - 001ES -> ES-Mini continuous supplied as ``dataname``

        - ESU16 -> ES-Mini 2016-09. If this is supplied in ``tradename`` it
          will be the trading asset.

      - ``usetimezones`` (default: ``True``)
        For most markets the time offset information provided by *Visual Chart*
        allows for datetime to be converted to market time (*backtrader* choice
        for representation)

        Some markets are special (``096``) and need special internal coverage
        and timezone support to display in the user expected market time.

        If this parameter is set to ``True`` importing ``pytz`` will be
        attempted to use timezones (default)

        Disabling it will remove timezone usage (may help if the load is
        excesive)
    ))qcheck      ?)
historicalF)millisecondT)	tradenameN)usetimezonesT   ik        r   i  )microsecondsg      9@)011024027036049092114033034035043054096300)005006008012013014015017019025029030037038052053060061072073074075080093094097111112113)031)032)044)045)046)047)003004009010028040041055090095099)001002020021022023056)
Europe/LondonEurope/Berlinz
Asia/TokyozAustralia/MelbourneAmerica/Argentina/Buenos_AiresAmerica/Sao_PaulozAmerica/Mexico_CityzAmerica/Santiago
US/Easternz
US/Centralrv   rw   zAsia/Hong_Kongry   rx   rz   )
z096.FTSEz	096.FTEU3z	096.MIB30z096.SSMIz096.HSIz096.BVSPz
096.MERVALz096.DJIz096.IXICz096.NDX)r?      days   im  i  i!  i  c                     | j                   S )zAReturns the calculated time offset local equipment -> data server)_TOFFSETselfs    r    _timeoffsetzVCData._timeoffset   s    }}r!   c                 &    | j                  d      S )z3Returns the timezone to consider for the input dataT)tzin)_gettzr   s    r    _gettzinputzVCData._gettzinput   s    {{{%%r!   c                 
   | j                   j                  }t        |t              }|+|s)t        j
                  j                  j                  |      S | j                  | j                  k(  ry| j                   j                  sy	 ddl}|r|}nd}|sE| j                   j                  | j                  v r#| j                  | j                   j                     }|4| j                  j!                         D ]  \  }}| j"                  |v s|} n |yt        |t$              r)t        j
                  j                  j                  |      S |r	 |j'                  |      }|S y# t        $ r Y yw xY w# |j(                  $ r Y yw xY w)zReturns the default output timezone for the data

        This defaults to be the timezone in which the market is traded
        Nr   )ptz
isinstancer   btutilsdate	Localizer_state_ST_NOTFOUNDr.   pytzImportErrordataname_TZOUT_TZSitems_mktcoder	   timezoneUnknownTimeZoneError)	r   r   ptztzstrr   tzsmktzmktcodesr   s	            r    r   zVCData._gettz   sY    ffii3-?588==**3//;;$+++vv""	
 CC66??dkk1++dffoo6C{&*iioo&7 ND(}}0"
 {#v&xx}}..s33]]3' 	 ?  		8 ,, s$   E! E0 !	E-,E-0FFc                      y)z`Returns ``True`` to notify ``Cerebro`` that preloading and runonce
        should be deactivatedT r   s    r    islivezVCData.islive   s     r!   c                    t        j                  di || _        | j                  j                  }|d   j                         r|dd |dd  z   }|| j                  _        d| j                  j                  z   | _        | j                  j                  dd | _        | j                  j                  xs | j                  x| _	        }|d   j                         r|dd |dd  z   }|| _	        y y )Nr/   r   r~      rg   r   )
r   r   storer   r   isspace	_datanamer   r-   
_tradename)r   kwargsr   r-   s       r    r   zVCData.__init__   s    __.v.
 66??A; !}x|3H&DFFO0!,&*ff&6&6&H$..H)Q<!!!A126I'DO "r!   c                 b    t         t        |   |       |j                  | j                         y)zWReceives an environment (cerebro) and passes it over to the store it
        belongs toN)r   r(   setenvironmentaddstorer   )r   envr   s     r    r   zVCData.setenvironment  s$     	fd*3/TZZ r!   c           	      V   t         t        |           | j                  | _        d| _        | j                  | _        d| _        d| _	        d| _
        d| _        d| _        | j                  j                         s-| j                  | j                          | j"                  | _        y| j                  | j$                         t'        j(                         | _        | j                  j-                  | | j.                         | j*                  j1                         }|sH| j                  | j2                         | j                  | j                          | j"                  | _        y| j4                  r8| j6                  j8                  | j6                  j:                  c| _        | _        n#| j@                  | jB                  c| _        | _        | j                  jE                  | j<                        | _"        | j                  jG                  | j.                        x| _$        }tK        |jL                        | _
        | j6                  jN                  r+| jD                  s| xj                  | jP                  z  c_
        | j                  | _        | jR                  | jT                  v r| xj                  tK        d      z  c_
        | j                  | j                  z
  | _        | j                  | j                  k(  r| j                  | jV                         | j                  jY                  | | j.                  | j<                  | j>                  | j6                  jZ                  | j6                  j\                  | j6                  j^                        | _	        | j`                  | _        yy)z]Starts the VC connecction and gets the real contract and
        contractdetails if it existsTr{   Nseconds  )1r   r(   start	_ST_STARTr   	_newticksPING_TIMEOUT
_pingtmoutidxq
_mktoffset_mktoff1_mktoffdiffr   	connectedput_notificationDISCONNECTEDr   	CONNECTEDr   Queueqrt_rtdatar   getNOTSUBSCRIBED	replayingr   	timeframecompression_tf_comp
_timeframe_compression_ticking_symboldata_syminfor   
TimeOffsetr,   MILLISECONDr   _EXTRA_TIMEOFFSETDELAYED_directdatafromdatetodater+   _ST_FEEDING)r   symfoundsyminfor   s      r    r   zVCData.start  s    	fd!#nn++ zz##%!!$"3"34++DKdnn-;;=

4088<<>!!$"4"45!!$"3"34++DK>> $(66#3#3TVV5G5G DHdj $(??D4E4E DHdj

++DHH5"&**"8"8"HH  $G,>,>?66dmmOOt///O==D222 OOy66O??T]]:;;$..(!!$,,/ ZZ++$**!!#DF **DK )r!   c                     t         t        |           | j                  r&| j                  j                  | j                         yy)z!Stops and tells the store to stopN)r   r(   stopr   r   _canceldirectdata)r   r   s    r    r   zVCData.stopj  s2    fd "66JJ((0 r!   c                     || _         y N)_serie)r   series     r    	_setseriezVCData._setseriep  s	    r!   c                 P    | j                   | j                  k(  xr | j                  S r   )_laststatusLIVEr   r   s    r    haslivedatazVCData.haslivedatat  s     499,77r!   c                 H   | j                   | j                  k(  ry	 	 | j                  t        | j                        z  }| j
                  j                  |      }|y|| j                  j                  k(  r| j                  | j                         y|| j                  j                  k(  r| j                  | j                         || j                  j                  k(  r7| j                  | j                          | j                  | j"                         || j                  j$                  k(  r6| j&                  | j(                  k7  r| j                  | j(                         L|| j                  j*                  k(  r6| j&                  | j"                  k7  r| j                  | j"                         t-        |t.              r| j                  | j0                  |       |}|j2                  | j4                  j6                  d<   |j8                  | j4                  j:                  d<   |j<                  | j4                  j>                  d<   |j@                  | j4                  jB                  d<   |jD                  | j4                  jF                  d<   |jH                  | j4                  jJ                  d<   | jL                  tO        |jP                        z   | jR                  z
  }tU        |      | j4                  jV                  d<   y# t        j                  $ r Y y w xY w)NFT)timeoutr   r|   ),r   r   _qcheckbool
resamplingr   r   r   Emptyr   _RT_SHUTDOWNr   r   _RT_DISCONNECTED
CONNBROKEN_RT_CONNECTEDr   r   _RT_LIVEr   r   _RT_DELAYEDr   r   UNKNOWNOpenlinesopenHighhighLowlowClosecloseVolumevolumeOpenInterestopeninterestNULLDATEr   Dater   r   r   )r   tmoutmsgbardts        r    _loadzVCData._loadw  s[   ;;$+++tDOO'<<ffjjj/ {djj---%%d&7&78djj111%%doo6djj...%%dnn5%%dll3djj)))##tyy0))$))4djj,,,##t||3))$,,7#}-%%dllC8 C "%DJJOOA!$DJJOOA #DJJNN1"%))DJJQ#&::DJJa ),)9)9DJJ##A& !99DOOKB%-b\DJJ"a ;; s   >L L! L!c                 4    | j                   ry| j                  S )aB  Returns the actual ping timeout for PumpEvents to wake up and call
        ping, which will check if the not yet delivered bar can be
        delivered. The bar may be stalled because vc awaits a new tick and
        during low negotiation hour this can take several seconds after the
        actual expected delivery time)r   r   r   s    r    _getpingtmoutzVCData._getpingtmout  s     ==r!   c                    |j                   }|| j                  z
  dkD  rH| j                  | j                  k7  r/| j                  j                  | j                  j                         ||xs | j                  z  }t        | j                  |      D ].  }|j                  |      }| j                  j                  |       0 |s
| j                  s|rt        j                         | j                  z
  }|j                  |      }| j                  t        |j                         z   | j"                  z
  }||k  rd| j                  | j$                  k7  r/| j                  j                  | j                  j&                         ||z
  j)                         dz   | _        n1| j,                  | _        | j                  j                  |       |dz  }t/        d|      | _        y Nr{   r|   r*   )Sizer   r   r   r   putr   r   r   rangeGetBarValuesr   nowr   r   r   r   r   r   r   total_secondsr   r   max)r   	DataSerie	forcepushssizer   r  dtnowr  s           r    OnNewDataSerieBarzVCData.OnNewDataSerieBar  so    488a4<</

4::112 	+dmm+5) 	C((-CFFJJsO	 5LLNT]]2E((/C!99D<L<LLBrz##tyy0FFJJtzz223 $&:"<"<">"D #'"3"3

3
 q%=r!   c                    | j                   j                  }| j                  |kD  ry | j                  | j                  k(  r| j
                  | _        y t        j                         | j                  z
  }t        | j                  |dz         D ]  }| j                   j                  | j                        }| j                  t        |j                        z   | j                  z
  }||k  r||z
  j!                         dz   | _         y | j
                  | _        | j"                  j%                  |       | xj                  dz  c_         y 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  s         r    pingzVCData.ping  s      88et."//DO. 519- 	C++**4884C!99D<L<LLBrz#%:"<"<">"D #//DOFFJJsOHHMH	r!   c                 V   |d   }t               }|D ]  }|||j                  <    | j                  j                  j                  |v ri| j
                  r\d| _        t        |j                  | j                  j                  j                  d            }| j                  j                  |       y y 	 || j                  j                  j                     }|j                  dk(  r| j                  | j                  t!        |j"                        z   | j                  z   }t%        j&                         |z
  | _        | j*                  | j,                  v r| xj(                  t!        d      z  c_        | j.                  j1                  | j2                  d       y y y # t        $ r Y y w xY w)Nr   Fr|   r   r   )dictFieldr   vcrtmodField_Descriptionr   r   r   
Field_Dater   r  
Field_TimeKeyError	TickIndexr   r   r   r   r   r  r   r   r   _vcrtCancelSymbolFeedr   )r   
ArrayTicksatickstickstickhasdatedtticks          r    
OnNewTickszVCData.OnNewTicks  sa     A 	%D $E$**	% :://58~~!&uyy););)F)FNOW%	 TZZ//::; ~~"t}}'@--)*CC--( !) 7==D$:$::
 MMYt%<<M 

++DNNEB (A"  s   2#F 	F('F(c                    t        dd       |D ]8  }t        d       t        d|j                  j                  dd             | j                  j                  j                  |j                  |j                        }t        dj                  ||j                               t        d|j                         |j                  }|r#| j                  t        |j                  	      z   }t        d
|       t        d|j                         t        d|j                         t        d|j                  j                  dd             ; y )Nz2**************************************************zDEBUG OnNewTicksz(----------------------------------------ztick.SymbolCodeasciiignorez  tick.Field   : {} ({})z  tick.FieldEx :r|   z  tick.Date    :z  tick.Index   :z  tick.Value   :z  tick.Text    :)print
SymbolCodeencoder   
vcrtfieldsr   r  formatFieldExr   r   r   r!  ValueText)r   r&  r'  fnametdates        r    debug_tickszVCData.debug_ticksD  s    h*+ 	KD(O#T__%;%;GX%NOJJ))--djj$**EE,33E4::FG$dll3IIE	tyy(AA$e,$dnn5$djj1$dii&6&6w&IJ	Kr!   )F).r"   r#   r$   __doc__paramsr   r   r  r   r   r   r   r   r   r   r   r   r   r
   TicksMicroSecondsSecondsMinutesDaysWeeksMonthsYears_TIMEFRAME_BACKFILLr   r   r   r   r   r   r   r   r   r   r  r  r  r  OnInternalEventr*  r8  r%   r&   s   @r    r(   r(   /   s   /`F {H ,18(I{L b"aA.H .K LL" '*2%'$-H)D2 $$$##'6 F ! 	*	q 19!,9!,	s+.)//	&;z
($!Z+x189|	$!L< 1CfKr!   r(   )
__future__r   r   r   r   r   r   r	   
backtraderr   r
   r   r   backtrader.feedr   backtrader.metabaser   backtrader.utils.py3r   r   r   r   backtrader.storesr   r   r   r(   r   r!   r    <module>rK     s^   ** * 1 0  4 4 $ *2 2 &&## &dK^J1 dKr!   