Ë
    a¨£jb  ã                  ó  — d dl mZ d dlmZmZ d dlmZmZ d dlmZ d dl	m
Z
mZ d dlmZ dZdd	d
dœZdZ ed¬«       G d„ d«      «       Z ed¬«       G d„ d«      «       Zdd„Zddd„Zddd„Zddd„Zdd„Zdd d„Zd!d„Zy)"é    )Úannotations)ÚasdictÚ	dataclass)ÚdatetimeÚtimezone)Úsqrt)ÚmeanÚpstdev)ÚIterablezrules-v1i„  i  i@8  )Ú15mÚ1hÚ4h)é   é   é
   é   T)Úfrozenc                  óN   — e Zd ZU ded<   ded<   ded<   ded<   ded<   dZd	ed
<   y)ÚCandleÚintÚ	timestampÚfloatÚopenÚhighÚlowÚcloseNúfloat | NoneÚvolume)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © ó    ú:/var/www/html/allstocktrading-app/trading-ai/app/engine.pyr   r      s%   … àƒNØ
ƒKØ
ƒKØ	ƒJØƒLØ€FˆLÔr$   r   c                  óè   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   d	ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dd„Zy)ÚSignalr   Ú	symbol_idÚstrÚsymbolÚhorizonÚ	directionr   Úentryr   Ú	stop_lossÚtake_profitÚ
confidenceÚexpected_moveÚexpected_volatilityÚmax_adverse_moveÚrisk_rewardÚscoreÚregimeÚrecommended_leveragez	list[str]ÚreasonsÚdictÚfeature_snapshotÚengine_versionÚcandle_timestampÚgenerated_atÚ
expires_atc                ó   — t        | «      S ©N)r   )Úselfs    r%   ÚpayloadzSignal.payload.   s   € Ü�d‹|Ðr$   N)Úreturnr9   )r   r    r!   r"   rB   r#   r$   r%   r'   r'      s}   … àƒNØƒKØƒLØƒNØƒLØÓØÓØÓØÓØÓØÓØÓØƒLØƒKØÓØÓØÓØÓØÓØÓØƒOôr$   r'   c                óV   — | syd|dz   z  | d   }}| dd  D ]  }||z  d|z
  |z  z   }Œ |S )Nç        é   r   r   r#   )ÚvaluesÚperiodÚalphaÚvalueÚpoints        r%   ÚemarL   1   sI   € Ù˜#Ø˜ ™
Ñ# V¨A¡Yˆ5€EØ˜˜�ÒHˆ U¨U¡]°a¸%±iÀ5Ñ5HÑ%H™UÐHØ€Lr$   c           
     ó6  — t        | | dz
  d | | d  «      D ��cg c]
  \  }}||z
  ‘Œ }}}|syt        |D �cg c]  }t        |d«      ‘Œ c}«      t        |D �cg c]  }t        | d«      ‘Œ c}«      }}|dk(  ryddd||z  z   z  z
  S c c}}w c c}w c c}w )Nr   éÿÿÿÿg      I@r   ç      Y@éd   )Úzipr	   Úmax)rG   rH   ÚaÚbÚchangesÚxÚgainsÚlossess           r%   ÚrsirY   7   s¥   € Ü! &¨&¨°©°2Ð"6¸À¸w¸xÐ8HÓI×J‘s�q˜ˆq�‹sÐJ€GÑJÙ˜4Ü¨GÖ4 qœ#˜a �(Ò4Ó5´tÐPWÖ<XÈ1¼SÀ!ÀÀA½YÒ<XÓ7Yˆ6€EØ�‚{˜5Ø�˜˜E &™LÑ(Ñ)Ñ)Ð)ùó	 Kùâ4ùÒ<Xs   ›B¹BÁB
c                óD  — | | dz
  d  }t        ||dd  «      D ��cg c]i  \  }}t        |j                  |j                  z
  t	        |j                  |j
                  z
  «      t	        |j                  |j
                  z
  «      «      ‘Œk }}}|rt        |«      S dS c c}}w )Nr   rE   )rQ   rR   r   r   Úabsr   r	   )ÚcandlesrH   ÚrowsÚprevÚcurÚtrs         r%   Úatrra   >   s‘   € Ø�F�7˜1‘9�:Ð€DÜcfÐgkÐmqÐrsÐrtÐmuÓcv×	wÑW_ÐW[Ð\_Œ#ˆc�h‰h�s—w‘wÑ¤ C§H¡H¨T¯Z©ZÑ$7Ó 8¼#¸c¿g¹gÀdÇjÁjÑ>PÓ:QÕ
RÐ	w€BÑ	wÙŒ4�‹8Ð"˜sÐ"ùó 
xs   œA.Bc                ó0  — | | dz
  d  }t        ||dd  «      D ��cg c]'  \  }}t        |j                  |j                  z
  «      ‘Œ) }}}t        |«      }|r8t	        dt        |d   j                  |d   j                  z
  «      |z  dz  «      S dS c c}}w )Nr   rO   rN   r   rP   rE   )rQ   r[   r   ÚsumÚmin)r\   rH   r]   rS   rT   ÚmovesÚpaths          r%   Ú	adx_proxyrg   C   s‘   € Ø�F�7˜1‘9�:Ð€DÜ-0°°t¸A¸B°xÓ-@×A¡c a¨ŒS�—‘˜Ÿ™‘Õ!ÐA€EÑAÜˆu‹:€DÙKOŒ3ˆu”s˜4 ™8Ÿ>™>¨$¨q©'¯-©-Ñ7Ó8¸4Ñ?À#ÑEÓGÐXÐUXÐXùó Bs   œ,Bc                óš  ‡— t        | «      dk  rt        d«      ‚| D �cg c]  }|j                  ‘Œ c}Št        ‰dd ‰dd  «      D ��cg c]  \  }}|sŒ	||z  dz
  ‘Œ }}}ˆfd„dD «       \  }}}}t	        ‰d	«      t	        ‰d
«      z
  }	t        | «      }t        ‰dd  «      t        ‰dd  «      }}
| dd  D �cg c]  }|j                  €Œ|j                  ‘Œ }}t        d„ | dd  D «       «      t        d„ | dd  D «       «      }}i d‰d   ‰d   z  dz
  “d‰d   ‰d   z  dz
  “d‰d   ‰d   z  dz
  “d‰d   ‰d   z
  ‰d   ‰d   z
  z
  “d|“d|“d|“d|“dt        ‰«      “d|	“d|“dt        | «      “d|
rd|z  |
z  nd“d |rt        |«      t        d!«      z  nd“d"|r,t        |«      r!t        d#„ | dd  D «       «      t        |«      z  n‰d   “d$t        |«      dkD  r%t        |d d «      r|d   t        |d d «      z  dz
  nd“d%|“|‰d   |z
  ‰d   z  |‰d   z
  ‰d   z  t        d&„ |D «       d¬'«      d(œ¥S c c}w c c}}w c c}w ))NéÒ   z(At least 210 closed candles are requirediëÿÿÿrN   iìÿÿÿr   c              3  ó6   •K  — | ]  }t        ‰|«      –— Œ y ­wr@   )rL   )Ú.0ÚpÚclosess     €r%   ú	<genexpr>zfeatures.<locals>.<genexpr>M   s   øè ø€ ÒA¨Aœ˜V QŸÑAùs   ƒ)é   é2   rP   éÈ   é   é   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr@   ©r   ©rk   Úcs     r%   rn   zfeatures.<locals>.<genexpr>R   s   è ø€ Ò;¨˜aŸe�eÑ;ùó   ‚iÎÿÿÿc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr@   ©r   rv   s     r%   rn   zfeatures.<locals>.<genexpr>R   s   è ø€ Ò@_ÈAÀÇÅÑ@_ùrx   Úreturn_1éþÿÿÿÚmomentum_10iõÿÿÿÚroc_20Úprice_accelerationéýÿÿÿÚema20Úema50Úema100Úema200Úrsi14ÚmacdÚatr14Úadx14Úbollinger_widthé   r   Úrealized_volatilityro   Úvwap20c              3  óV   K  — | ]!  }|j                   |j                  xs d z  –— Œ# y­w©r   N)r   r   rv   s     r%   rn   zfeatures.<locals>.<genexpr>Y   s!   è ø€ ÒE°!�a—g‘g˜qŸx™xš}¨1Õ-ÑEùs   ‚')Úvolume_accelerationÚsupportc              3  ó>   K  — | ]  }|d k  sŒ	t        |«      –— Œ y­wrŽ   )r[   ©rk   rV   s     r%   rn   zfeatures.<locals>.<genexpr>]   s   è ø€ Ò(J°AÀAÈÃE¬¨Q¯Ñ(Jùs   ‚
�)Údefault)Ú
resistanceÚsupport_distanceÚresistance_distanceÚmaximum_adverse_movement)ÚlenÚ
ValueErrorr   rQ   rL   ra   r	   r
   r   rd   rR   rY   rg   r   rc   )r\   rw   rS   rT   ÚreturnsÚe20Úe50Úe100Úe200r†   Úbb_midÚbb_stdÚvolumesr�   r”   rm   s                  @r%   Úfeaturesr¢   I   s+  ø€ Ü
ˆ7ƒ|�cÒ¤Ð,VÓ!WÐWØ&Ö'˜!ˆa�g‹gÒ'€FÜ"% f¨S° n°f¸S¸T°lÓ"C×I™3˜1˜QÂq��!‘�Q‹wÐI€GÑIÛA°ÔAÑ€CˆˆD�Üˆv�b‹>œ#˜f R›.Ñ(€DÜˆG‹€AÜ˜&  ˜,Ó'¬°°s°t°Ó)=ˆF€FØ!(¨¨ ÖG˜A°!·(±(Ñ2Fˆq�x‹xÐG€GÐGÜÑ;¨W°S°T¨]Ô;Ó;¼SÑ@_ÐQXÐY\ÐY]ÐQ^Ô@_Ó=_ˆZ€GðØ�F˜2‘J˜v b™zÑ)¨!Ñ+ðØ-:¸FÀ2¹JÀvÈcÁ{Ñ<RÐSTÑ<Tðà�&˜‘*˜V C™[Ñ(¨Ñ*ðà,@À6È"Á:ÈfÐUWÉjÑCXÐ[aÐbdÑ[eÐflÐmoÑfpÑ[pÑBqðð 	�ðð ˜sðð %-¨dðð 5=¸dðð ELÌSÐQWË[ðð 	�ð	ð ˜qð	ð #*¬9°WÓ+=ð	ð
 	±˜A˜f™H VšO¸Aðð
 @UÑryÔV\Ð]dÓVeÔfjÐkmÓfnÒVnð  @Aðð 	ÑV]ÔbeÐfmÔbn”#ÑE°w¸s¸t°}ÔEÓEÄcÈ'ÃlÒRÐtzÐ{}Ñt~ðð 	ÄSÈÃ\ÐRSÂ^ÔX\Ð]dÐehÐfhÐ]iÔXj ¨¡¬D°¸¸"°Ó,>Ñ >¸qÒ @Ðpqðð 	�7ðð +5Ø# B™Z¨Ñ/°¸±Ñ;ÐU_Ð`fÐgiÑ`jÑUjÐlrÐsuÑlvÑTvÜ$'Ñ(J¸Ô(JÐSTÔ$Uòð ùò (ùÛIùò
 Hs   ŸH=Á

IÁ
IÂ9IÃINc                óB  ‡— t        |«      |xs# t        j                  t        j                  «      }}t        |«      |d   j                  }}d}||d   |d   kD  rdndz  }||d   |d   kD  rdnd	z  }|t        d
t        d|d   dz  «      «      z  }||d   dkD  rdndz  }|d|d   cxk  rdk  rn ndnd|d   cxk  rdk  rn ndndz  }|||d   dz  k\  rdn||d   dz  k  rdndz  }|r|d   |z  nd}	|d   dk\  r
|dkD  rd nd!}
n1|d"   d#kD  rd$}
n&||d   dz  k\  s||d   dz  k  rd%}
n|d"   d&k  rd'}
nd(}
t        |«      }t        t        d)t        d*d*|d+z  z   «      «      d,«      }t        t        d-|d.z  |d/z  z   t        d|	d0z  «      z
  «      d,«      }|dkD  rd1nd2}t        |d   d3z  |d4z  «      }|d1k(  r||z
  n||z   }|d1k(  r||d5z  z   n||d5z  z
  }d5}|d6k  s|d7k  s
|d3k  s|
d(k(  rd8\  }}}t        d9t        d:t        d9t        |	d;z  d<«      z  «      «      «      }|d=k\  r|d>k\  rd:n|dk\  r|d?k\  rdnd@}|dAk7  rt        ||«      nd9Št        ˆfdB„t        D «       «      }t        |   }dC|dkD  rdDndE› �dF|d   dG›�dH|
› �g}t        | |||||||t        |d   «      |dI   |dJ   |||
|||t        |d   j                   |j#                  «       t        j$                  |j!                  «       |z   t        j                  ¬K«      j#                  «       «      S )LNrN   rE   r�   r‚   é   iîÿÿÿr„   rr   iôÿÿÿiñÿÿÿé   r}   iô  r†   r   r   iöÿÿÿé4   r…   éH   é   é   é0   iøÿÿÿr”   g+‡ÙÎ÷ï?r�   gj¼t“ð?r‡   rˆ   é-   zbullish trendzbearish trendr‰   g¸…ëQ¸®?zhigh volatilityÚbreakoutg¸…ëQ¸Ž?zlow volatilityÚrangeéZ   rp   gáz®GáÚ?rF   rP   gÍÌÌÌÌÌì?g      à?i�  ÚLONGÚSHORTg      ø?g{®Gázd?g      ü?éF   éA   )ÚNO_TRADENNr   r   rŠ   g{®Gáz¤?éN   éX   éP   r   r³   c              3  ó.   •K  — | ]  }|‰k  sŒ	|–— Œ y ­wr@   r#   )rk   rV   Úmax_leverages     €r%   rn   zgenerate.<locals>.<genexpr>|   s   øè ø€ Ò=˜¨1°Ó+<”1Ñ=ùs   ƒ
ŽzEMA trend is ÚbullishÚbearishzRSI is z.1fzRegime: r‹   r—   )Útz)Úlistr   Únowr   Úutcr¢   r   rR   rd   r[   Úroundr   Ú	LEVERAGESÚHORIZONSr'   ÚENGINE_VERSIONr   Ú	isoformatÚfromtimestamp)r(   r*   r+   r\   r½   r]   ÚfÚpriceÚbullÚvol_pctr6   Údirectionalr0   r5   r,   Ústop_distanceÚstopÚtargetÚrrÚvolatility_capÚquality_capÚleverageÚsecondsr8   r¸   s                           @r%   ÚgeneraterÒ   `   sT  ø€ Ü�W“˜sÒ@¤h§l¡l´8·<±<Ó&@ˆ#€DÜ˜‹~˜t B™xŸ~™~€u€AØ€DØ�!�G‘*˜q ™zÒ)‰B¨sÑ2€DØ�!�G‘*˜q ™{Ò*‰B°Ñ3€DØŒC�”C˜˜1˜]Ñ+¨CÑ/Ó0Ó1Ñ1€DØ�!�F‘)˜a’-‰B SÑ(€DØ��q˜‘zÔ' RÕ'‰A°B¸!¸G¹*Ô4JÈÕ4J©bÐPQÑR€DØ�˜!˜L™/¨$Ñ.Ò.‰A¸5ÀAÀiÁLÐQVÑDVÒ;V±RÐ\]Ñ^€DÙ"'ˆa�‰j˜Ò¨Q€GØˆ�z�RÒ°T¸A²X¡/À?™Ø	
ÐÑ	 Ò	#Ð.?¡VØ	�!�L‘/ $Ñ&Ò	&¨%°1°Y±<ÀÑ3EÒ*EÐPZÁvØ	
ÐÑ	 Ò	$Ð/?¡fØˆ&Ü�d“)€KÜ”s˜2œc " R¨°C©Ñ%7Ó8Ó9¸!Ó<€JÜ”#�c˜+ b™.¨:°b©=Ñ8¼3¸rÀ'È#Á+Ó;NÑNÓOÐPQÓR€EØ š(‘¨€IÜ˜˜'™
 3™¨¨e©Ó4€MØ"+¨VÒ"3ˆ5�Ò¸¸}Ñ9L€DØ)2°FÒ):ˆU�= Ñ%Ò%ÀÀmÐTXÑFXÑ@X€FØ	€BØˆr‚z�Z "’_¨¨Sª°F¸gÒ4EÐ_sÑG\ÀyÐQUÐV\Ü˜œ3˜r¤# a¬¨G°A©I°cÓ(:Ñ&:Ó";Ó<Ó=€NØ" bÒ(¨U°bª[‘"ÀZÐSUÒEUÐZ_ÐceÒZe¹rÐkl€KØ6?À:Ò6M”3�~ kÔ2ÐST€LÜÓ=œiÔ=Ó=€HÜ�wÑ€GØ¨D°ªF™y¸	ÐBÐCÀwÈqÐQXÉzÐZ]ÐN^ÐE_ÐckÐlrÐksÐatÐu€GÜ�)˜F 7¨9°U¸4ÀÀzÔRUÐVWÐXeÑVfÓRgÐhiÐjñ  iAð  BCð  D^ñ  B_ð  `bð  chð  ioð  pxð  y@ð  ABô  CQð  RVð  WYñ  RZ÷  Rdñ  Rdð  eh÷  erñ  eró  etô  u}÷  uKñ  uKð  LO÷  LYñ  LYó  L[ð  \cñ  Lcô  go÷  gsñ  gsô  ut÷  u~ñ  u~ó  u@ó  Að  Ar$   c                ó˜  — i }t        | d„ ¬«      D ]3  }|j                  |j                  |z  |z  g «      j                  |«       Œ5 |j	                  «       D ��cg c]c  \  }}t        ||d   j                  t        d„ |D «       «      t        d„ |D «       «      |d   j                  t        d„ |D «       «      xs d «      ‘Œe c}}S c c}}w )Nc                ó   — | j                   S r@   )r   )rw   s    r%   ú<lambda>zresample.<locals>.<lambda>ƒ   s
   € ¨a¯k©k€ r$   )Úkeyr   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr@   rz   r’   s     r%   rn   zresample.<locals>.<genexpr>„   s   è ø€ Ò&<°! q§v¥vÑ&<ùrx   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr@   ru   r’   s     r%   rn   zresample.<locals>.<genexpr>„   s   è ø€ Ò@UÈ1ÀÇÅÑ@Uùrx   rN   c              3  ó<   K  — | ]  }|j                   xs d –— Œ y­wrŽ   )r   r’   s     r%   rn   zresample.<locals>.<genexpr>„   s)   è ø€ ò  iFÐ{|Ðij×iqÑiqÒivÐuvÓivñ  iFùs   ‚)ÚsortedÚ
setdefaultr   ÚappendÚitemsr   r   rR   rd   r   rc   )r\   rÑ   ÚbucketsÚcandleÚtsr]   s         r%   Úresamplerá   �   s
  € Ø&(€GÜ˜Ñ%9Ô:ò  Dˆ¸G×<NÑ<NÈv×O_ÑO_ÐahÑOhÐipÑOpÐqsÓ<t×<{Ñ<{ð  }Cõ  =Dð  Dð _f÷  _lñ  _ló  _n÷  oñ  T[ð  TVð  W[ŒF�2�d˜1‘g—l‘l¤3Ñ&<°tÔ&<Ó#<¼SÑ@UÐPTÔ@UÓ=UÐVZÐ[]ÑV^×VdÑVdÔehñ  iFð  AEô  iFó  fFò  fNð  JNõ  Oó  oð  oùó  os   ÁA(C)rG   zlist[float]rH   r   rC   r   )é   )r\   úlist[Candle]rH   r   rC   r   )r\   rã   rC   r9   r@   )r(   r   r*   r)   r+   r)   r\   zIterable[Candle]r½   zdatetime | NonerC   r'   )r\   rã   rÑ   r   rC   rã   )Ú
__future__r   Údataclassesr   r   r   r   Úmathr   Ú
statisticsr	   r
   Útypingr   rÂ   rÁ   rÀ   r   r'   rL   rY   ra   rg   r¢   rÒ   rá   r#   r$   r%   ú<module>ré      sŽ   ðÝ "ç )ß 'Ý ß #Ý à€Ø˜d¨%Ñ0€Ø€	á
�$Ô÷ ð  ó ð ñ �$Ô÷ð ó ðó4ô*ô#ô
Yóô.AôBor$   