Ë
    t�£j   ã                   óÈ  — U d dl m Z mZ d dlmZmZmZmZ d dlZd dlZd dl	m
Z
 ddlmZmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZ d dl m!Z! d dl"m#Z#  ede¬«      Z$i Z%e&e'e&f   e(d<   i Z)e&e'e*e   f   e(d<   i Z+e&e,e&f   e(d<   e$j[                  d«      d„ «       Z. G d„ de
«      Z/ G d„ de
«      Z0dede,dz  de,dz  fd„Z1e$je                  d«       ed«      fde,dz  fd„«       Z3e$ji                  d «       ed«       ed«      fd!e*e/   ded"e,dz  d#e,dz  fd$„«       Z5e$ji                  d%«       ed«       ed«      fd&e0ded"e,dz  d#e,dz  fd'„«       Z6e$ji                  d(«       ed«       ed«      fded"e,dz  d#e,dz  fd)„«       Z7e$je                  d*«       ed«      fde,dz  fd+„«       Z8e$je                  d,«       ed«      fde,dz  fd-„«       Z9 G d.„ d/e
«      Z: G d0„ d1e
«      Z;e$ji                  d2«       ed«       ed«      fd&e;ded"e,dz  d#e,dz  fd3„«       Ze$ji                  d,«       ed«       ed«      fd&e:ded"e,dz  d#e,dz  fd4„«       Zy)5é    )ÚdatetimeÚtimezone)ÚFastAPIÚHeaderÚHTTPExceptionÚRequestN)Ú	BaseModelé   )ÚCandleÚHORIZONSÚENGINE_VERSIONÚgenerateÚresample)Úverify)Ú	CandleRowÚ
FeatureRowÚ	SignalRowÚSessionÚinit_dbÚEngineVersion)ÚBacktestRun)Úwalk_forward)Úfetch)Úinsert)ÚselectzAST Trading Decision Engine)ÚtitleÚversionÚSYMBOLSÚCANDLESÚSIGNALSÚstartupc                  óæ  — t        «        t        j                  «       5 } | j                  t	        t
        «      j                  t        ddddœt        dœd¬«      j                  dg¬	«      «       | j                  t        t        «      j                  t        j                  d
k(  «      j                  t        j                   t        j"                  «      «      D ]{  }t$        j'                  |j                   g «      j)                  t+        |j"                  |j,                  |j.                  |j0                  |j2                  |j4                  «      «       Œ} | j                  t        t6        «      j                  t6        j8                  j;                  «       «      «      D ]9  }|j                   › d|j<                  › �}|t>        vsŒ'|j@                  t>        |<   Œ; 	 d d d «       y # 1 sw Y   y xY w)NéF   éA   g      ø?)ÚscoreÚ
confidenceÚrisk_reward)ÚgateÚhorizonsT)r   ÚrulesÚactiver   ©Úindex_elementsÚ1mú:)!r   r   ÚbeginÚexecuter   r   Úvaluesr   r   Úon_conflict_do_nothingÚscalarsr   r   ÚwhereÚ	timeframeÚorder_byÚ	symbol_idÚ	timestampr   Ú
setdefaultÚappendr   ÚopenÚhighÚlowÚcloseÚvolumer   Úgenerated_atÚdescÚhorizonr    Úpayload)ÚdbÚrowÚkeys      útrading-ai/app/main.pyr!   r!      s®  € ä„IÜ	�‰‹ð <˜BØ
�
‰
”6œ-Ó(×/Ñ/¼Ð^`Ðnpð  @Cñ  VDô  PXñ  NYð  aeÐ/ó  f÷  }ñ  }ð  NWð  MXð  }ó  Yô  	ZØ—:‘:œf¤YÓ/×5Ñ5´i×6IÑ6IÈ4Ñ6OÓP×YÑYÔZc×ZmÑZmÔnw÷  oBñ  oBó  Có  Dò 	~ˆCÜ×Ñ˜sŸ}™}¨RÓ0×7Ñ7¼¸s¿}¹}ÈSÏXÉXÐVY×V^ÑV^Ð_b×_fÑ_fÐgj×gpÑgpÐqt×q{Ñq{Ó8|Õ}ð	~à—:‘:œf¤YÓ/×8Ñ8¼×9OÑ9O×9TÑ9TÓ9VÓWÓXò 	<ˆCØ—=‘=�/  3§;¡; -Ð0ˆCØœ'Ò!°·±¤7¨3¢<ñ	<÷	<÷ <ñ <ús   ŸF(G'ÇG'Ç'G0c                   óN   — e Zd ZU eed<   eed<   dZedz  ed<   eed<   dZeed<   y)ÚSymbolPayloadÚidÚsymbolNÚfeedÚcategoryTÚeligible)	Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__ÚstrrM   rO   Úbool© ó    rH   rJ   rJ      s%   … Ø
ƒF�3‹J d˜˜S ™XÓ*°S«LÈ¸(À4Ô:LrX   rJ   c                   ó@   — e Zd ZU eed<   eed<   eed<   dZedz  ed<   y)ÚTickPayloadr8   r9   ÚpriceNr@   )rP   rQ   rR   rS   rT   Úfloatr@   rW   rX   rH   rZ   rZ       s   … ØƒM˜S“=¨£+À¨v°e¸D±jÔ/ErX   rZ   Úrequestr9   Ú	signaturec              ƒ   ó‚   K  — | j                  «       ƒ d {  –—† }t        |xs d||xs d«      st        dd«      ‚y 7 Œ&­w)NÚ é‘  zInvalid service signature)Úbodyr   r   )r]   r9   r^   rb   s       rH   Úauthenticatedrc   #   s=   è ø€ Ø�|‰|‹~×	€DÜ�)’/˜r $ y¢°BÔ7¼}ÈSÐQlÓ?mÐ9mÐ7ð 
ús   ‚?–=—'?z
/v1/healthÚx_ast_tokenc                 óæ  — t        j                  | xs dt        j                  dd«      «      st	        dd«      ‚t
        j                  «       D ��cg c]  \  }}|j                  d«      sŒ|‘Œ }}}| xs t        d„ |D «       «      }|rdndt        t        t
        «      t        |«      t        t        «      t        j                  t        j                  «      j!                  «       d	œS c c}}w )
Nr`   ÚTRADING_AI_SHARED_SECRETra   úInvalid service tokenrO   c              3   ó`   K  — | ]&  }t        t        j                  |g «      «      d k\  –— Œ( y­w)éÒ   N)Úlenr   Úget)Ú.0Úsids     rH   ú	<genexpr>zhealth.<locals>.<genexpr>+   s%   è ø€ ÒPÀœc¤'§+¡+¨c°"Ó"5Ó6¸Õ;ÑPùs   ‚,.ÚreadyÚ
collecting)ÚstatusÚengine_versionÚsymbolsÚeligible_symbolsÚsignalsÚtime)ÚhmacÚcompare_digestÚosÚgetenvr   r   Úitemsrk   Úallr   rj   r    r   Únowr   ÚutcÚ	isoformat)rd   rm   ÚmetarO   ro   s        rH   Úhealthr�   '   s  € ä×Ñ˜{Ò0¨b´·±Ð;UÐVXÓ1YÔZÔboÐpsð  uLó  cMð  ]MÜ")§-¡-£/×J‘h�c˜$°T·X±X¸jÕ5IŠcÐJ€HÑJØˆ,Ò
Pœ#ÑPÀxÔPÓP€EÙ %‘W¨<ÌÔbeÔfmÓbnô  CFð  GOó  CPô  [^ô  _fó  [gô  ow÷  o{ñ  o{ô  |D÷  |Hñ  |Hó  oI÷  oSñ  oSó  oUñ  Vð  Vùó Ks   ÁC-Á,C-z/v1/symbolsr{   Úx_ast_timestampÚx_ast_signaturec              ƒ   ó¢   K  — t        |||«      ƒ d {  –—†  | D ]#  }|j                  «       t        |j                  <   Œ% dt	        | «      iS 7 Œ9­w)NÚaccepted)rc   Ú
model_dumpr   rK   rj   )r{   r]   r‚   rƒ   Úitems        rH   rs   rs   .   sL   è ø€ ä
˜ °Ó
@×@Ð@ØÒ9ˆ¨¯©Ó(9”w˜tŸw™wÒ'Ð9Ø”s˜5“zÐ"Ð"ð Aús   ‚A“A”:Az	/v1/ticksr‡   c              ƒ   óª  K  — t        |||«      ƒ d {  –—†  | j                  dz  dz  }t        j                  | j                  g «      }|rž|d   j                  |k(  rŒ|d   }t        ||j                  t        |j                  | j                  «      t        |j                  | j                  «      | j                  |j                  xs d| j                  xs dz   xs d «      |d<   nQ|j                  t        || j                  | j                  | j                  | j                  | j                  «      «       |dd  t        | j                  <   t        j                  «       5 }t!        t"        «      j%                  | j                  d||d   j                  |d   j                  |d   j                  |d   j&                  |d   j                  d¬«	      j)                  g d¢|d   j                  |d   j                  |d   j&                  |d   j                  d	œ¬
«      }|j+                  |«       d d d «       ddiS 7 �Œ.# 1 sw Y   ddiS xY w­w)Né<   éÿÿÿÿr   é°<ÿÿr.   Ú
twelvedata)	r8   r6   r9   r<   r=   r>   r?   r@   Úprovider)r8   r6   r9   )r=   r>   r?   r@   )r-   Úset_r…   T)rc   r9   r   r:   r8   r   r<   Úmaxr=   r[   Úminr>   r@   r;   r   r0   r   r   r2   r?   Úon_conflict_do_updater1   )	r‡   r]   r‚   rƒ   ÚminuteÚrowsÚoldrE   Ústmts	            rH   Útickr–   4   sì  è ø€ ä
˜ °Ó
@×@Ð@Ø�>‰>˜2Ñ˜bÑ €F¤w×'9Ñ'9¸$¿.¹.ÈÓ'L $Ù��R‘×"Ñ" FÒ*Ø�‰Hˆœv f¨S¯X©X´c¸#¿(¹(À4Ç:Á:Ó6NÌsÐSV×SZÑSZÐ[_×[eÑ[eÓOfÐgk×gqÑgqÐsv×s}Ñs}ò  tCð  BCð  FJ÷  FQñ  FQò  FVð  UVñ  sWò  s_ð  [_ó   `�d˜2’hØ
�+‰+”f˜V D§J¡J¨t¯z©z¸$¿*¹*ÀTÇZÁZÐPT×P[ÑP[Ó\Ô
]Ø   ˜M„GˆD�N‰NÑÜ	�‰‹ð ˜BÜ”IÓ×%Ñ%°·±ÈÐX^ÐdhÐikÑdl×dqÑdqÐw{Ð|~Ñw÷  xEñ  xEð  JNð  OQñ  JR÷  JVñ  JVð  ]að  bdñ  ]e÷  ]kñ  ]kð  swð  xzñ  s{÷  sBñ  sBð  LXÐ%ó  Y÷  oñ  oò  dð  rvð  wyñ  rz÷  rñ  rð  FJð  KMñ  FN÷  FRñ  FRð  [_ð  `bñ  [c÷  [iñ  [ið  swð  xzñ  s{÷  sBñ  sBñ  jCð  oó  DˆØ
�
‰
�4Ô÷ð �tÐÐð Aù÷ð �tÐÐüs)   ‚I“I”EIÅ%CIÈ5IÉIÉ	
Iz/v1/generatec              ƒ   óp  K  — t        | ||«      ƒ d {  –—†  g }t        t        j                  t        j
                  «      j                  «       «      }t        j                  «       D �]¬  \  }}|j                  d«      sŒt        j                  «       D �]|  \  }}t        t        j                  |g «      |«      }	|	D �
cg c]  }
|
j                  |z   |k  sŒ|
‘Œ }	}
t        |	«      dk  rŒXt        ||d   ||	«      j                  «       }|› d|› �}|t         |<   |j#                  |«       |› d|› d|d   › dt$        › �}t'        j(                  «       5 }|j+                  t-        ||t$        t        j.                  |d   «      |d   ¬«      «       |j1                  t3        t4        «      j7                  ||||d	   |d
   |t        j.                  |d   «      t        j.                  |d   «      ¬«      j9                  dg¬«      «       d d d «       �Œ �Œ¯ t$        |dœS 7 �Œc c}
w # 1 sw Y   �ŒžxY w­w)NrO   ri   rL   r/   Úcandle_timestamprA   Úfeature_snapshot)r8   rC   rr   rA   ÚfeaturesÚ	directionr%   Ú
expires_at)Úexternal_keyr8   rC   r›   r%   rD   rA   rœ   r�   r,   ©rr   ru   )rc   rS   r   r}   r   r~   r9   r   r{   rk   r   r   r   rj   r   rD   r    r;   r   r   r0   Úaddr   Úfromisoformatr1   r   r   r2   r3   )r]   r‚   rƒ   Úcreatedr}   rm   r€   rC   Úsecondsr“   rF   ÚsignalrG   ÚexternalrE   s                  rH   Úrunr¥   A   sË  è ø€ ä
˜ °Ó
@×@Ð@È"À'ÔRUÔV^×VbÑVbÔck×coÑcoÓVp×VzÑVzÓV|ÓR}ÈcÜ—M‘M“Oó 
Y‰ˆˆDØ�x‰x˜
Ô# XÜ'Ÿ~™~Ó/ó 	Y‰OˆG�GÜœ'Ÿ+™+ c¨"Ó-¨gÓ6ˆDØ!%ÖD˜#¨¯©°wÑ)>ÀÓ)C’#ÐDˆDÐDÜ�4‹y˜Š}˜hÜ˜C  X¡¨w°tÓ<×DÑDÓFˆFÈsÈeÐSTÐU\ÐT]ÐL^ÈÐmsÔ`gÐhkÑ`lÐu|÷  vDñ  vDð  EKô  vLØ�u˜A˜g˜Y a¨Ð/AÑ(BÐ'CÀ1Ä^ÐDTÐUˆHÜ—‘“ð Y BØ—‘”z¨C¸Ì~Ôks÷  lBñ  lBð  CIð  JXñ  CYó  lZð  djð  k}ñ  d~ô  ô  @Ø—
‘
œ6¤)Ó,×3Ñ3ÀÐTWÐ`gÐrxð  zEñ  sFð  MSð  T[ñ  M\ð  ekô  yA÷  yOñ  yOð  PVð  Weñ  Pfó  ygô  s{÷  sIñ  sIð  JPð  Q]ñ  J^ó  s_Ð3ó  `÷  wñ  wð  HVð  GWð  wó  Xô  Y÷Yñ Yò	Yð
Yô ,°gÑ>Ð>ð Aûò
 E÷Yñ YüsB   ‚H6“H!”B,H6Ã H$ÃH$ÃA9H6ÅB5H)È
H6È$H6È)H3È.H6z/v1/opportunitiesc                 óÆ   — t        j                  | xs dt        j                  dd«      «      st	        dd«      ‚t
        t        t        j                  «       d„ d¬«      dœS )	Nr`   rf   ra   rg   c                 ó   — | d   S )Nr%   rW   )Úss    rH   ú<lambda>zopportunities.<locals>.<lambda>T   s   € Ð[\Ð]dÑ[e€ rX   T)rG   Úreverserž   )	rw   rx   ry   rz   r   r   Úsortedr    r2   )rd   s    rH   Úopportunitiesr¬   Q   s\   € ä×Ñ˜{Ò0¨b´·±Ð;UÐVXÓ1YÔZÔboÐpsð  uLó  cMð  ]MÜ+´f¼W¿^¹^Ó=MÑReÐnrÔ6sÑtÐtrX   z/v1/backtestsc                 óR  — t        j                  | xs dt        j                  dd«      «      st	        dd«      ‚t        «       5 }|j                  t        t        «      j                  t        j                  j                  «       «      j                  d«      «      j                  «       }d|D �cg c]U  }|j                  |j                  |j                   |j"                  |j$                  |j                  j'                  «       dœ‘ŒW c}icd d d «       S c c}w # 1 sw Y   y xY w)Nr`   rf   ra   rg   é2   Úruns)rK   rr   rq   Ú
parametersÚmetricsÚ
created_at)rw   rx   ry   rz   r   r   r4   r   r   r7   r²   rB   Úlimitr|   rK   rr   rq   r°   r±   r   )rd   rE   r“   Úxs       rH   Ú	backtestsrµ   V   s/  € ä×Ñ˜{Ò0¨b´·±Ð;UÐVXÓ1YÔZÔboÐpsð  uLó  cMð  ]MÜ	‹ð |�bØ�Z‰Zœœ{Ó+×4Ñ4´[×5KÑ5K×5PÑ5PÓ5RÓS×YÑYÐZ\Ó]Ó^×bÑbÓdˆØð  vzö  {ð  qr˜aŸd™d°A×4DÑ4DÈaÏhÉhÐde×dpÑdpÐ{|÷  |Eñ  |Eð  ST÷  S_ñ  S_÷  Siñ  Sió  Skó  lò  {ð  |÷|ñ |ùò {÷|ð |ús    ÁA,DÂ1ADÄDÄDÄD&c                   óZ   — e Zd ZU eed<   eed<   dZeed<   dZeed<   dZ	eed<   dZ
eed	<   y
)ÚBacktestPayloadr8   rC   é   Ú
spread_bpsÚslippage_bpsr
   Úfee_bpsr   Úfunding_bpsN)rP   rQ   rR   rS   rT   rU   r¹   r\   rº   r»   r¼   rW   rX   rH   r·   r·   ]   sG   … ¨C£-¸³Èq¸jÈÓ>PÐefÐR^Ð_dÓRfÐvwÐhoÐpuÓhwð  LMð  zEð  FKô  zMrX   r·   c                   ó&   — e Zd ZU eed<   dZeed<   y)ÚBackfillPayloadr8   éˆ  Ú
outputsizeN)rP   rQ   rR   rS   rT   rÀ   rW   rX   rH   r¾   r¾   ^   s   … ¨C£-À°¸CÔ1DrX   r¾   z/v1/backfillc              ƒ   óÂ  K  — t        |||«      ƒ d {  –—†  t        j                  | j                  «      }|r|j                  d«      st	        dd«      ‚|j                  d«      }|st	        dd«      ‚t        | j                  |t        dt        | j                  d«      «      «      ƒ d {  –—† }t        «       5 }|j                  t        t        «      j                  t        j                  | j                  k(  t        j                  dk(  «      j                  t        j                   «      «      j#                  «       }|D �	cg c]N  }	t%        |	j                   |	j&                  |	j(                  |	j*                  |	j,                  |	j.                  «      ‘ŒP c}	d	d  t0        | j                  <   d d d «       | j                  ||d
œS 7 �Œµ7 �Œc c}	w # 1 sw Y   Œ$xY w­w)NrO   é¦  zSymbol is not eligiblerM   z!Symbol has no Twelve Data mappingr
   r¿   r.   r‹   )r8   rM   Úimported)rc   r   rk   r8   r   Úfetch_backfillr�   r�   rÀ   r   r4   r   r   r5   r6   r7   r9   r|   r   r<   r=   r>   r?   r@   r   )
r‡   r]   r‚   rƒ   r€   rM   rÃ   rE   r“   r´   s
             rH   ÚbackfillrÅ   `   s�  è ø€ ä
˜ °Ó
@×@Ð@Ü	�‰�T—^‘^Ó	$€DÙ�t—x‘x 
Ô+´=ÀÐE]Ó3^Ð-^Ø	�‰�&Ó	€DÙ”} SÐ)LÓMÐMÜ! $§.¡.°´c¸!¼CÀÇÁÐPTÓ<UÓ6VÓW×W€HÜ	‹ð r�bØ�Z‰ZœœyÓ)×/Ñ/´	×0CÑ0CÀTÇ^Á^Ñ0SÔT]×TgÑTgÐimÑTmÓn×wÑwô  yB÷  yLñ  yLó  Mó  N÷  Rñ  Ró  TˆØcgÖ hÐ^_¤¨¯©°A·F±F¸1¿6¹6À!Ç%Á%ÈÏÉÐPQ×PXÑPXÕ!YÒ hÐioÐipÐ qŒ�—‘Ñ÷rð Ÿ™¨d¸hÑGÐGð Aùð
 Xûò !i÷rð rüsN   ‚G“G”BGÂ-GÂ.GÂ<B
GÅAGÆGÆ0GÇGÇGÇGÇGc           
   ƒ   óÎ  K  — t        |||«      ƒ d {  –—†  | j                  t        vrt        dd«      ‚t	        t
        j                  | j                  g «      t        | j                     «      }t        j                  | j                  «      }|rt        |«      dk  rt        dd«      ‚| j                  «       }t        | j                  |d   | j                  || j                  | j                  | j                  | j                  «      }t!        j"                  «       5 }|j%                  t'        t(        d||¬«      «       d d d «       dt(        |dœS 7 �ŒC# 1 sw Y   ŒxY w­w)	NrÂ   zUnsupported horizonéæ   zInsufficient candle historyrL   Úcomplete)rr   rq   r°   r±   )rq   rr   r±   )rc   rC   r   r   r   r   rk   r8   r   rj   r†   r   r¹   rº   r»   r¼   r   r0   rŸ   r   r   )	r‡   r]   r‚   rƒ   r“   r€   Úparamsr±   rE   s	            rH   ÚbacktestrÊ   m   sO  è ø€ ä
˜ °Ó
@×@Ð@Ø‡|�|œ8Ñ#¬=¸Ð=RÓ+SÐ%SÜ	”'—+‘+˜dŸn™n¨RÓ0´¸$¿,¹,Ñ1GÓ	H€DÌwÏ{É{Ð[_×[iÑ[iÓOjÈ$Ù”3�t“9˜S’=¬°cÐ:WÓ(XÐ"XØ�?‰?Ó€F¤l°4·>±>À$ÀxÁ.ÐQU×Q]ÑQ]Ð^bÐcg×crÑcrÐsw÷  tEñ  tEð  FJ÷  FRñ  FRð  SW÷  Scñ  Scó  'd˜gÜ	�‰‹ð  G˜B §¡¤{Ä.ÐXbÐntð  ~Eô  (Fô  !G÷  GØ´È'ÑRÐRð Aù÷
 Gð  Güs(   ‚E%“E”DE%Ä!#EÅE%ÅE"ÅE%)<r   r   Úfastapir   r   r   r   ry   rw   Úpydanticr	   Úenginer   r   r   r   r   Úsecurityr   Údatabaser   r   r   r   r   r   r   rÊ   r   rÅ   r   rÄ   Úsqlalchemy.dialects.postgresqlr   Ú
sqlalchemyr   Úappr   ÚdictrS   rT   r   Úlistr    rU   Úon_eventr!   rJ   rZ   rc   rk   r�   Úpostrs   r–   r¥   r¬   rµ   r·   r¾   rW   rX   rH   ú<module>r×      sX  ðß 'Ð 'ß ;Ó ;ß Ý ß HÕ HÝ ß R× RÝ !Ý "Ý -Ý 1Ý áÐ1¸>ÔJ€Ø€ˆˆc�$ˆh‰Ó Ø"$€ˆˆc�$�v‘,ÐÑ	Ó $Ø€ˆˆc�$ˆh‰Ó à‡�ˆiÓñ<ó ð<ôM�Iô MôF�)ô Fðn ð n°3°t±8ð nÀsÈ4Áxó nð ‡�ˆÓÙ & t£ñ V�s˜4‘xò Vó ðVð ‡�ˆ-ÓÙU[Ð\`ÓUañ  |Bð  CGó  |Hñ #˜˜]Ñ+ð #°Gð #ÈCÐPTÉHð #ÐruÐvzÑrzò #ó ð#ð
 ‡�ˆ+ÓÙIOÐPTËÑouÐvzÓo{ñ 
�Kð 
¨ð 
ÀÀDÁð 
ÐfiÐjnÑfnò 
ó ð
ð ‡�ˆ.ÓÙ7=¸d³|Ñ]cÐdhÓ]iñ ?�gð ?¨c°$©hð ?ÐTWÐX\ÑT\ò ?ó ð?ð ‡�Ð	ÓÙ'-¨d£|ñ u˜c $™hò uó ðuð ‡�ˆÓÙ#)¨$£<ñ |˜#˜d™(ò |ó ð|ô M�iô  MÜ D�iÔ Dà‡�ˆ.ÓÙQWÐX\ÓQ]Ñw}ð  Có  xDñ 
H˜ð 
H°ð 
HÈÈDÉð 
HÐnqÐrvÑnvò 
Hó ð
Hð ‡�ˆ/ÓÙQWÐX\ÓQ]Ñw}ð  Có  xDñ S˜ð S°ð SÈÈDÉð SÐnqÐrvÑnvò Só ñSrX   