Ë
    Bp±jôU  ã                   ó„  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m	Z	 dZ
dZdZdZdZd	gZg d
¢ZdZddiZg d¢Zh d£Zh d£Zh d£Zdedefd„Zdedefd„Zdedefd„Zdededefd„Zdedefd„Zdefd„Zdefd„Z d(de!fd„Z"d)de!fd„Z#d*de!fd „Z$d!edefd"„Z%d#ed$e&ddfd%„Z'g a(g a)d&„ Z*e+d'k(  r e*«        yy)+aB  
Generate Pine Script preset block for strategy_mlp_scores.pine from trained MLP artifacts.

Reads strategies/params/mlp/mlp_weights_COINBASE_BTCUSD_{TF}.json and
optionally results/winners/optimization_winner_strategy_mlp_scores_COINBASE_BTCUSD_{TF}.csv
(for post-sweep thresholds; falls back to artifact's recommended_thresholds if missing).

Rewrites the auto-generated sentinel block inside strategy_mlp_scores.pine in-place.

Usage:
    python3 tools/generate_pine_mlp_presets.py [--dry-run]

After running, paste strategy_mlp_scores.pine into TradingView to compile-test.
é    N)Údatetimez#strategies/strategy_mlp_scores.pinezstrategies/params/mlpzresults/winnersu$   // â”€â”€ AUTO-GENERATED MLP PRESETSu   // â”€â”€ END AUTO-GENERATEDÚCOINBASE_BTCUSD)Ú4HÚ6HÚ8HÚ12HÚ1DzCOINBASE_BTCUSD 12HzCOINBASE_BTCUSD 1D)Ú!i_long_entry_activation_thresholdÚ i_long_exit_activation_thresholdÚ-i_long_exit_activation_confirmation_thresholdÚi_use_long_exit_confirmationÚi_use_long_entry_confirmationÚi_trailing_stop_thresholdÚi_regime_windowÚi_regime_entry_min_scoreÚi_mvrv_suppress_bearÚi_exit_score_windowÚi_entry_score_window>   r   r   r   >   r   r   r   >   ú% In MarketúTotal P&L %úCalmar RatioúP&L/DD RatioúSharpe RatioúTotal TradesúSortino RatioúMax Drawdown %ÚverifiedÚ	CPU_ScoreÚ	CompositeÚ	GPU_ScoreÚ	WFO_ScoreÚcomposite_scoreÚWFO_Fold_CalmarsÚ_pnl_dd_percentileÚsubperiod_consistentÚvÚreturnc                 ó(   — | d›}d|vr	d|vr|dz  }|S )z˜Format float to 7 significant figures for Pine weight literals.
    Matches float32 training precision; ~3 fewer digits/weight vs prior 10g format.
    z.7gÚ.Úeú.0© )r&   Úss     úp/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tools/generate_pine_mlp_presets.pyÚ
fmt_float9r/   N   s(   € ð ˆSˆ'€AØ
�!�|˜ 1™Ø	ˆT‰	ˆØ€Hó    Únamec           	      ó2  — | t         v rFt        |t        «      r$|j                  «       j	                  «       dv rdS dS t        |«      dkD  rdS dS | t        v r&t        t        t        t        |«      «      «      «      S t        |«      d›}d|vr	d|vr|dz  }|S )	zIFormat threshold param value as Pine literal (4-sig float, int, or bool).)ÚtrueÚ1Úyesr3   Úfalseg      à?z.4gr)   r*   r+   )	Ú_BOOL_PARAMSÚ
isinstanceÚstrÚstripÚlowerÚfloatÚ_INT_PARAMSÚintÚround)r1   r&   r-   s      r.   Úfmt_thresholdr@   X   s‘   € àŒ|ÑÜ�aœÔØŸW™W›YŸ_™_Ó.Ð2FÑF�6ÐSÈGÐSÜ˜q› CšˆvÐ4¨WÐ4ØŒ{ÑÜ”3”uœU 1›X“Ó'Ó(Ð(Ü�‹8�Cˆ.€AØ
�!�|˜ 1™Ø	ˆT‰	ˆØ€Hr0   c                 ó(   — | t         v ry| t        v ryy)NÚboolr>   r<   )r7   r=   )r1   s    r.   Ú	pine_typerC   f   s   € ØŒ|ÑØØŒ{ÑØØr0   ÚassetÚtfc                 ó   — | › d|› �S )NÚ r,   )rD   rE   s     r.   Ú
preset_keyrH   n   s   € ØˆW�A�b�Tˆ?Ðr0   Úpathc                 óÎ   — 	 t        | d«      5 }t        j                  |j                  «       «      j	                  «       d d cd d d «       S # 1 sw Y   y xY w# t
        $ r Y yw xY w)NÚrbé   z????????)ÚopenÚhashlibÚsha256ÚreadÚ	hexdigestÚOSError)rI   Úfs     r.   Ú_sha8rT   r   sR   € ðÜ�$˜Ô Ü—>‘> !§&¡&£(Ó+×5Ñ5Ó7¸¸Ð;÷ ×Òûäò Ùðús.   ‚A Ž4AÁ	A ÁAÁA ÁA Á	A$Á#A$c                  óX  — ddl } ddlm} i }i }t        j                  d«      }t
        j                  j                  t        «      �rt        t        j                  t        «      «      D ]â  }|j                  |«      }|sŒ|j                  d«      |j                  d«      }}|t        vs|t        vrŒJt
        j                  j                  t        |«      }	t!        |	d¬«      5 }
t#        t%        j&                  |
«      «      }ddd«       sŒ¥|d   j)                  «       D ��ci c]  \  }}|t*        vsŒ||“Œ }}}||t-        ||«      <   Œä t        D �](  }t        D �]  }t-        ||«      }t
        j                  j                  t.        d	|› d
|› d�«      }||v r\||   j1                  dd«      j3                  «       }|r7t
        j                  j5                  |«      r|}t6        j9                  |d«       t
        j                  j5                  |«      s#t;        d|› d|› d�t<        j>                  ¬«       ŒÝ	  ||«      }i }|d   j1                  di «      j1                  di «      }||v rx||   }tB        D �ci c]%  }||j1                  ||j1                  |d«      «      “Œ' }}t;        d|› dt
        j                  jE                  |«      › �t<        j>                  ¬«       ny|rDtB        D �ci c]  }||j1                  |d«      “Œ }}t;        d|› d�t<        j>                  ¬«       n3tB        D �ci c]  }|d“Œ }}t;        d|› d�t<        j>                  ¬«       ||d   |d   |tG        |«      dœ||<   �Œ �Œ+ t        D ]E  }t        D ]:  }t-        ||«      |vsŒt;        dt-        ||«      › d �t<        j>                  ¬«       Œ< ŒG |S # 1 sw Y   �ŒÏxY wc c}}w # t@        $ r-}t;        d|› d|› d�t<        j>                  ¬«       Y d}~�Œ¶d}~ww xY wc c}w c c}w c c}w )!zµ
    Returns {preset_key: {"thresholds": {...}, "layers": [(W,b),...], "arch": [...],
                           "artifact_path": str, "artifact_sha8": str}} for found presets.
    r   N)Úload_mlp_artifactzHoptimization_winner_strategy_mlp_scores_([A-Z0-9_]+)_([A-Z0-9HD]+)\.csv$é   é   Ú )ÚnewlineÚmlp_weights_Ú_z.jsonÚmlp_weights_filez  WARNING: no artifact for z (u   ) â€” skipping©Úfilez  WARNING: cannot load z: u    â€” skippingÚmetaÚtrainingÚrecommended_thresholdsç        z  z): using winner CSV thresholds + artifact z': using artifact recommended_thresholdsu%   : no thresholds found â€” using zerosÚlayersÚarch)Ú
thresholdsrd   re   Úartifact_pathÚartifact_sha8z  WARNING: preset z will use fallback defaults)$ÚnumpyÚstrategies.strategy_mlp_scoresrV   ÚreÚcompileÚosrI   ÚisdirÚWINNERS_DIRÚsortedÚlistdirÚmatchÚgroupÚ_ASSETSÚ_TFSÚjoinrM   ÚlistÚcsvÚ
DictReaderÚitemsÚ_METRIC_COLSrH   ÚWEIGHTS_DIRÚgetr:   ÚexistsÚ_PRESET_WEIGHT_ALIASESÚpopÚprintÚsysÚstderrÚ	ExceptionÚ_THRESHOLD_PARAMSÚbasenamerT   )ÚnprV   ÚpresetsÚwinner_thresholdsÚwinner_patternÚfnameÚmrD   rE   ÚfpathrS   ÚrowsÚkr&   ÚrowÚkeyrg   Úcsv_weightsÚartr*   ÚthrÚrecÚw_rowÚps                           r.   Úload_presetsr˜   |   sÐ  € ó
 Ý@à€Gð ÐÜ—Z‘ZØSó€Nô 
‡w�w‡}�}”[Õ!ÜœBŸJ™J¤{Ó3Ö4ˆEØ×$Ñ$ UÓ+ˆAÙØØŸ™ ›
 A§G¡G¨A£J�2ˆEØœGÑ# r´¡~ØÜ—G‘G—L‘L¤¨eÓ4ˆEÜ�e RÕ(¨AÜœCŸN™N¨1Ó-Ó.�÷ )áØØ$(¨¡G§M¡M¤OÔM¡O™D˜A˜q°qÄÒ7L�1�a‘4 OˆCÑMØ7:Ðœj¨°Ó3Ò4ð 5÷ �ˆß�$ˆBÜ˜U BÓ'ˆCô ŸG™GŸL™L¬¸ÀUÀGÈ1ÈRÈDÐPUÐ6VÓWˆMØÐ'Ñ'Ø/°Ñ4×8Ñ8Ð9KÈRÓP×VÑVÓX�Ù¤2§7¡7§>¡>°+Ô#>Ø$/�Mô +×.Ñ.¨s°DÔ9ä—7‘7—>‘> -Ô0ÜÐ3°C°5¸¸=¸/ÈÐXÜŸ:™:õ'àðÙ'¨Ó6�ð ˆCØ�f‘+—/‘/ *¨bÓ1×5Ñ5Ð6NÐPRÓSˆCØÐ'Ñ'à)¨#Ñ.�ÝARÓSÑAR¸A�q˜%Ÿ)™) A s§w¡w¨q°#£Ó7Ñ7ÐAR�ÐSÜ˜˜3˜%ÐHÌÏÉ×IYÑIYÐZgÓIhÐHiÐjÜŸ:™:ö'áÝ3DÓEÑ3D¨a�q˜#Ÿ'™' ! S›/Ñ)Ð3D�ÐEÜ˜˜3˜%ÐFÐGÌcÏjÉjÖYå'8Ó9Ñ'8 !�q˜#‘vÐ'8�Ð9Ü˜˜3˜%ÐDÐEÌCÏJÉJÕWð "Ø˜h™-Ø˜F™Ø!.Ü!& }Ó!5ñˆG�C‹LòS ð ÷d ˆßˆBÜ˜% Ó$¨GÒ3ÜÐ*¬:°e¸RÓ+@Ð*AÐA\Ð]ÜŸ:™:ö'ñ ð ð €N÷ )Ñ(üó Nøô0 ò ÜÐ/°¨¸bÀÀÀ=ÐQÜŸ:™:õ'åûðüò Tùò Fùò :sB   Ã%OÄ%OÄ6OÈ=O$É=*PË2P"Ì6
P'ÏO	Ï$	PÏ-"PÐPc                 ó>   — ddj                  d„ | D «       «      z   dz   S )z0Emit a list of floats as Pine array.from() call.zarray.from(ú, c              3   óD   K  — | ]  }t        t        |«      «      –— Œ y ­w©N)r/   r<   )Ú.0r&   s     r.   Ú	<genexpr>z_row_literal.<locals>.<genexpr>Ú   s   è ø€ Ð$JÁ6¸a¤Z´°a³×%9Á6ùs   ‚ Ú))rv   )Úvaluess    r.   Ú_row_literalr¡   Ø   s!   € à˜4Ÿ9™9Ñ$JÁ6Ó$JÓJÑJÈSÑPÐPr0   c                 ó�  — g }|j                  |› d�«       |j                  |› ddj                  d„ | D «       «      › �«       t        t        | «      dz
  «      D ]X  }| |   | |dz      }}|j                  |› d|dz   › d||z  › d|dz   › d	|› d
|› d�«       |j                  |› d|dz   › d|› d�«       ŒZ |j                  d«       |S )zrEmit 'var float[]' declarations for all weight/bias arrays (must appear before any if-block that assigns to them).zP// MLP weight arrays (populated on barstate.isfirst from the preset block below)z// Architecture: u    â†’ c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrœ   ©r9   ©r�   Úds     r.   rž   z(emit_var_declarations.<locals>.<genexpr>á   s   è ø€ Ð9OÉ$ÀQ¼#¸a¿&É$ùó   ‚rW   zvar float[] _wz = array.new_float(z, 0.0)  // Wz [ô   Ã—Ú]zvar float[] _bz, 0.0)rY   )Úappendrv   ÚrangeÚlen)re   ÚindentÚlinesÚiÚn_inÚn_outs         r.   Úemit_var_declarationsr²   Ý   sð   € à€EØ	‡L�L�F�8ÐkÐlÔmØ	‡L�L�F�8Ð,¨W¯\©\Ñ9OÉ$Ó9OÓ-OÐ,PÐQÔRÜ”3�t“9˜q‘=Ö!ˆØ˜1‘g˜t A¨¡E™{ˆeˆØ�‰˜�x˜~¨a°©c¨UÐ2EÀeÈdÁlÀ^ÐS_Ð`aÐbcÑ`cÐ_dÐdfÐglÐfmÐmoÐptÐouÐuvÐwÔxØ�‰˜�x˜~¨a°©c¨UÐ2EÀeÀWÈFÐSÕTð "ð 
‡L�L�ÔØ€Lr0   c           	      ó˜  — ddl }|j                  | |j                  ¬«      } |› d�g}| j                  dk(  s!| j                  dk(  rB| j                  d   dk(  r0| j                  «       }|j                  |› t        |«      › �«       |S | j                  d   }|j                  |› dt        | d   «      › �«       |j                  |› dt        | d   «      › �«       |j                  |› d	�«       t        d|«      D ]8  }|j                  |› d
t        | |   «      › �«       |j                  |› d	�«       Œ: |j                  |› d�«       |S )uL  
    Emit a Pine named function that builds ONE weight matrix or bias vector and returns it.
    Moving data into functions keeps the main script body small (Pine's main-body size limit
    is separate from per-function limits).

    The function has no arguments and returns the array â€” caller does:
        _w1 := fn_name()
    r   N©Údtypez() =>rW   rX   úfloat[] _tw = úfloat[] _tr = úarray.concat(_tw, _tr)ú_tr := Ú_tw)	ri   ÚasarrayÚfloat64ÚndimÚshapeÚravelrª   r¡   r«   )ÚarrÚfn_namer­   r‡   r®   r�   r±   Úrow_is           r.   Úemit_weight_fnrÃ   ê   s@  € ó Ø
�*‰*�S §
¡
ˆ*Ó
+€CØˆy˜ÐÐ€Eà
‡x�x�1‚}˜Ÿ™ Qš¨3¯9©9°Q©<¸1Ò+<à�i‰i‹kˆØ�‰˜�x¤¨SÓ 1Ð2Ð3Ô4ð €Lð —	‘	˜!‘ˆØ�‰˜�x˜~¬l¸3¸q¹6Ó.BÐ-CÐDÔEØ�‰˜�x˜~¬l¸3¸q¹6Ó.BÐ-CÐDÔEØ�‰˜�xÐ5Ð6Ô7Ü˜1˜e–_ˆEØ�L‰L˜F˜8 7¬<¸¸E¹
Ó+CÐ*DÐEÔFØ�L‰L˜F˜8Ð#9Ð:Õ;ð %ð 	�‰˜�x˜s�^Ô$à€Lr0   c           
      ó¤  — ddl }g }d}d}t        | «      D �]¶  \  }\  }}	|j                  ||j                  ¬«      }|j                  |	|j                  ¬«      }	|j                  \  }
}d|dz   › �}d|dz   › �}|
dk(  r&|j                  |› |› dt        |d   «      › �«       �n|r#|j                  |› d	t        |d   «      › �«       n$|j                  |› d
t        |d   «      › �«       d}|
dkD  r¤|r#|j                  |› dt        |d   «      › �«       n$|j                  |› dt        |d   «      › �«       d}|j                  |› d�«       t        d|
«      D ]8  }|j                  |› dt        ||   «      › �«       |j                  |› d�«       Œ: |j                  |› |› d�«       |j                  |› |› dt        |	«      › �«       �Œ¹ |S )a{  
    Return list of Pine lines that initialize _w1/_b1/.._b3 from the given layers.

    Uses row-by-row array.from() calls with array.concat() to build each W matrix,
    avoiding any single very-large array.from() call.

    _tw/_tr are declared with 'float[]' only on first use; subsequent layers reuse
    them with ':=' to avoid duplicate-declaration errors in Pine v6.
    r   NFr´   Ú_wrW   Ú_bz := z_tw := r¶   Tr¹   r·   r¸   rX   z := _tw)ri   Ú	enumerater»   r¼   r¾   rª   r¡   r«   )rd   re   r­   r‡   r®   Útw_declaredÚtr_declaredÚliÚWÚbr±   r°   Úw_varÚb_varrÂ   s                  r.   Úemit_weight_initrÏ   
  sé  € ó à€EØ€KØ€Kä ×'‰
ˆ‰FˆQ�Ø�J‰J�q §
¡
ˆJÓ+ˆØ�J‰J�q §
¡
ˆJÓ+ˆØ—g‘g‰ˆˆtØ�R˜‘T�F�ˆØ�R˜‘T�F�ˆà�AŠ:à�L‰L˜F˜8 E 7¨$¬|¸A¸a¹DÓ/AÐ.BÐCÖDñ Ø—‘ ˜x w¬|¸A¸a¹DÓ/AÐ.BÐCÕDà—‘ ˜x ~´lÀ1ÀQÁ4Ó6HÐ5IÐJÔKØ"�à�qŠyÙØ—L‘L F 8¨7´<ÀÀ!ÁÓ3EÐ2FÐ!GÕHà—L‘L F 8¨>¼,ÀqÈÁtÓ:LÐ9MÐ!NÔOØ"&�KØ—‘ ˜xÐ'=Ð>Ô?Ü" 1 ež_�EØ—L‘L F 8¨7´<ÀÀ%ÁÓ3IÐ2JÐ!KÔLØ—L‘L F 8Ð+AÐ!BÕCð -ð �L‰L˜F˜8 E 7¨'Ð2Ô3ð 	�‰˜�x ˜w d¬<¸«?Ð*;Ð<Ö=ð? (ðB €Lr0   rˆ   c                 ó   — t        j                  «       j                  d«      }t        D ��cg c]  }t        D ]  }t        ||«      ‘Œ Œ }}}|D �cg c]	  }|| v sŒ|‘Œ }}g }|j                  t        › d�«       |j                  d«       |j                  d|› dt        |«      › dt        |«      › d�«       |j                  d«       |j                  d	«       |j                  d
«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       t        D ��cg c]  }t        D ]  }t        ||«      ‘Œ Œ }}}ddj                  d„ |D «       «      z   dz   }	|j                  d«       |j                  d|	› d�«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       t        }
|
| vr|r|d   }
|
| v r| |
   d   nt        D �ci c]  }|d“Œ c}}t        D ]Í  }t        |«      }t        ||j                  |d«      «      }|j                  |› d|› d�«       |D ]`  }|| v sŒt        || |   d   j                  |d«      «      }t        j                  |«      }|rd |› �nd}|j                  d!|› d"|› |› �«       Œb |j                  d#|› d$|
› �«       |j                  d«       ŒÏ |r| |d      d%   ng d&¢}g }|D ]e  }| |   d%   |k7  rGt!        d'|› d(| |   d%   › d)|› d*dj                  d+„ |d,d- D «       «      › �t"        j$                  ¬.«       ŒU|j                  |«       Œg |j'                  t)        |«      «       dd l}|D ]õ  }||vrŒ|t        v rŒ| |   }|j-                  dd/«      }t/        |d%   «      }|d0   }|j                  d1|› d2|› d3|› �«       t1        |d4   «      D ]�  \  }\  }}|j'                  t3        |j5                  |«      d5|› d6|d,z   › �«      «       |j                  d«       |j'                  t3        |j5                  |«      d5|› d7|d,z   › �«      «       |j                  d«       Œ’ Œ÷ i }t        j7                  «       D ]&  \  }}|j9                  |g «      j                  |«       Œ( |D �]   }||vrŒ	|t        v rŒ|j-                  dd/«      }t        | |   d4   «      } |j                  |g «      }!d8|› d9�g|!D �"cg c]  }"d8|"› d9�‘Œ
 c}"z   }#d:j                  |#«      }$t        |#«      d,kD  rd;|$› d<�n|$}%|j                  d=|%› �«       t;        | «      D ]D  }|j                  d>|d,z   › d?|› d6|d,z   › d@�«       |j                  dA|d,z   › d?|› d7|d,z   › d@�«       ŒF |j                  d«       �Œ |j                  t<        › dB�«       dCj                  |«      dCz   S c c}}w c c}w c c}}w c c}w c c}"w )DNz%Y-%m-%d %H:%Mu˜    â€” do not edit manually â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€zV// Run tools/generate_pine_mlp_presets.py to regenerate from trained weight artifacts.z// Last generated: z  |  Ú/z presets foundrY   u}   // â”€â”€ Preset auto-detection from chart symbol + timeframe â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€z2_tf_secs  = timeframe.in_seconds(timeframe.period)z&_tf_label = _tf_secs == 86400 ? "1D" :z'             _tf_secs == 14400 ? "4H" :z'             _tf_secs == 21600 ? "6H" :z'             _tf_secs == 28800 ? "8H" :z+             _tf_secs == 43200 ? "12H" : ""z["", rš   c              3   ó(   K  — | ]
  }d |› d �–— Œ y­w)Ú"Nr,   )r�   r�   s     r.   rž   z!generate_block.<locals>.<genexpr>V  s   è ø€ Ð%H¹°1¨¨!¨¨A¤h¹ùs   ‚r©   zCi_preset_override = input.string("", "Force preset (blank = auto)",z    options=Ú,zC    group=group_neural_activation_thresholds, display=display.none)zC_auto_key = syminfo.prefix + "_" + syminfo.ticker + " " + _tf_labelzC_preset   = i_preset_override != "" ? i_preset_override : _auto_keyuê   // â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€r   rf   rc   rG   z = switch _presetz#  // thresholds: own CSV, weights: z    "z" => z    => z  // fallback: re   )é1   é   rL   rW   z  WARNING: skipping u
    â€” arch z != ref z. Retrain with --hidden c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrœ   r¤   r¥   s     r.   rž   z!generate_block.<locals>.<genexpr>€  s   è ø€ Ð1QÁ.¸Q´#°a·&Á.ùr§   rW   éÿÿÿÿr^   r\   rh   z// z  arch: z  artifact: rd   Ú_fw_rÅ   rÆ   z_preset == "rÓ   z or Ú(rŸ   zif barstate.isfirst and z    _wz := _fw_z()z    _buÐ    â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€Ú
)r   ÚnowÚstrftimert   ru   rH   rª   ÚSENTINEL_STARTr¬   rv   Ú_FALLBACK_PRESETr…   rC   r@   r}   r   r�   r‚   rƒ   Úextendr²   ri   Úreplacer9   rÇ   rÃ   r»   rz   Ú
setdefaultr«   ÚSENTINEL_END)&rˆ   Ú	timestampÚarE   Úordered_keysr�   Úpresent_keysr®   Úall_option_keysÚoptions_strÚfallback_keyr—   Úfallback_thrÚparamÚptypeÚfb_valr‘   ÚvalÚ
weight_srcÚ
alias_noteÚref_archÚarch_ok_keysr‡   ÚsafeÚarch_strÚsha8rÊ   rË   rÌ   Úalias_reverseÚ	alias_keyÚ
target_keyÚn_layersÚextra_aliasesÚakÚ
cond_partsÚcondÚcond_strs&                                         r.   Úgenerate_blockr   @  s…  € Ü—‘“×'Ñ'Ð(8Ó9€IÝ/6ÔF©w¨!Ç¸2”J˜q "Õ%ÀÐ%¨w€LÑFÙ+Ó<™|˜!¨q°Gª|’A˜|€LÐ<à€EØ	‡L�L”NÐ#ð  $|ð  }ô  ~Ø	‡L�LÐiÔkØ	‡L�LÐ& y k°´s¸<Ó7HÐ6IÈÌ3È|ÓK\ÐJ]Ð]kÐlÔmØ	‡L�L�Ôð 
‡L�Lð  Qô  RØ	‡L�LÐEÔFØ	‡L�LÐ9Ô:Ø	‡L�LÐ:Ô;Ø	‡L�LÐ:Ô;Ø	‡L�LÐ:Ô;Ø	‡L�LÐ>Ô?Ø	‡L�L�Ôå29ÔI±'¨QÇD¸b”z ! RÕ(ÀDÐ(°'€OÑIØ˜DŸI™IÑ%H¹Ó%HÓHÑHÈ3ÑN€KØ	‡L�LÐVÔXØ	‡L�L�< ˜}¨AÐ.Ô/Ø	‡L�LÐVÔXØ	‡L�L�ÔØ	‡L�LÐVÔWØ	‡L�LÐVÔWØ	‡L�Lð  ~ô  Ø	‡L�L�Ôô $€LØ˜7Ñ"¡|Ø# A‘ˆØ:FÈ'Ñ:Q�7˜<Ñ(¨Ò6ÕhyÓWzÑhyÐcdÐXYÐ[^ÑX^ÐhyÑWz€Lç"ˆÜ˜%Ó ˆÜ˜u l×&6Ñ&6°u¸cÓ&BÓCˆØ�‰˜�w˜a ˜wÐ&7Ð8Ô9ÛˆCà�gŠ~Ü# E¨7°3©<¸Ñ+E×+IÑ+IÈ%ÐQTÓ+UÓV�Ü3×7Ñ7¸Ó<�
ÙS]ÐBÀ:À,ÑOÐce�
Ø—‘˜u S E¨¨s¨e°J°<Ð@ÕAð  ð 	�‰�w˜v˜h o°l°^ÐDÔEØ�‰�RÕð #ñ 4@ˆw�| A‘Ñ'¨Ò/Â^€Hð
 €LÛˆØ�3‰<˜Ñ 8Ò+ÜØ& s e¨:°g¸c±lÀ6Ñ6JÐ5KÈ8ÐT\ÐS]ð ^)Ø),¯©Ñ1QÀ(È1ÈRÁ.Ó1QÓ)QÐ(RðTä—Z‘Zöð ×Ñ Õ$ð ð 
‡L�LÔ& xÓ0Ô1ó ÛˆØ�lÑ"ØØÔ(Ñ(ØØ�C‰LˆØ�{‰{˜3 Ó$ˆÜ�q˜‘y“>ˆØ�Ñ!ˆØ�‰�s˜3˜%˜x¨ z°¸d¸VÐDÔEÜ# A h¡KÖ0‰JˆB‘��AØ�L‰Lœ¨¯
©
°1«¸¸d¸VÀ2ÀbÈÁdÀVÐ7LÓMÔNØ�L‰L˜ÔØ�L‰Lœ¨¯
©
°1«¸¸d¸VÀ2ÀbÈÁdÀVÐ7LÓMÔNØ�L‰L˜Õñ	 1ð ð$ +-€MÜ!7×!=Ñ!=Ö!?Ñˆ	�:Ø× Ñ  ¨RÓ0×7Ñ7¸	ÕBð "@ô ˆØ�lÑ"ØØÔ(Ñ(ØØ�{‰{˜3 Ó$ˆÜ�w˜s‘| HÑ-Ó.ˆà%×)Ñ)¨#¨rÓ2ˆØ$ S E¨Ð+Ð,É}Ó/]É}È°,¸r¸dÀ!Ò0DÈ}Ñ/]Ñ]ˆ
Ø�{‰{˜:Ó&ˆÜ"% j£/°AÒ"5�Q�t�f˜A‘;¸4ˆØ�‰Ð/°¨zÐ:Ô;Ü˜–/ˆBØ�L‰L˜6 " Q¡$  x°¨v°R¸¸1¹°v¸RÐ@ÔAØ�L‰L˜6 " Q¡$  x°¨v°R¸¸1¹°v¸RÐ@ÕAð "ð 	�‰�RÖð! ð$ 
‡L�L”L�>ð  "rð  sô  tà�9‰9�UÓ˜dÑ"Ð"ùók GùÚ<ùó$ Jùò  X{ùòN 0^s#   ­X5Á	X;ÁX;ÅY É
YÕYÚblockÚdry_runc           
      ó  — t         j                  j                  t        «      st	        j
                  dt        › �«       t        t        «      5 }|j                  «       }d d d «       j                  t        «      }|j                  t        «      }|dk(  s|dk(  r+t	        j
                  dt        › dt        › dt        › d�«       |t        t        «      z  }|t        |«      k  r"||   dv r|dz  }|t        |«      k  r||   dv rŒ|j                  d	|j                  t        «      «      }|dk7  r|dz   }nt        |«      }|d | | z   ||d  z   }|r"t        d
«       t        | «       t        d«       y t        t        d«      5 }|j                  |«       d d d «       t        dt        › dt        t        «      › dt        t        «      › d�«       t        d«       t        d«       y # 1 sw Y   �ŒŒxY w# 1 sw Y   Œ`xY w)NzPine file not found: rØ   zSentinel markers not found in z. Expected 'z' and 'z'.u    -â”€	rW   rÛ   u9   â”€â”€ DRY RUN â€” would write the following block â”€â”€u&   â”€â”€ (Pine file not modified) â”€â”€Úwu   âœ… Rewrote z  (rÑ   z	 presets)z-   Next step: paste into TradingView and run:z/       python3 tools/check_pine.py --mark-valid)rm   rI   r~   Ú	PINE_FILEr‚   ÚexitrM   rP   ÚfindrÞ   rã   r¬   r�   ÚwriteÚpresent_keys_globalÚall_keys_global)r  r  rS   ÚcontentÚ	start_idxÚend_idxÚnlÚnew_contents           r.   Úrewrite_piner  ¼  s¼  € Ü�7‰7�>‰>œ)Ô$Ü�‰Ð(¬¨Ð4Ô5Ü	ŒiŒ˜AØ—&‘&“(ˆ÷ 
ð —‘œ^Ó,€IØ—‘œ\Ó*€GØ�B‚˜' Rš-Ü�‰Ð1´)°ð =Ü,Ð-¨W´\°NÀ"ðFô 	Gð Œs”<Ó Ñ €Gà
”C˜“LÒ
  W¨WÑ%5¸Ñ%BØ�1‰ˆð ”C˜“LÒ
  W¨WÑ%5¸Ò%Bð 
�‰�d˜GŸL™L¬Ó6Ó	7€BØ	ˆR‚xØ�q‘&‰ä�g“,ˆà˜*˜9Ð%¨Ñ-°¸¸Ð0AÑA€KáÜÐIÔJÜˆeŒÜÐ6Õ8ä”)˜SÔ! QØ�G‰G�KÔ ÷ "ä�œY˜K s¬3Ô/BÓ+CÐ*DÀAÄcÌ/ÓFZÐE[Ð[dÐeÔfÜÐ=Ô?ÜÐ?ÕA÷A 
‰ú÷8 "Ð!ús   ÁG*ÆG7Ç*G4Ç7H c            
      óT  — t        j                  d¬«      } | j                  ddd¬«       | j                  «       }t        j
                  j                  dt        j
                  j                  t        j
                  j                  t        j
                  j                  t        «      «      «      «       t        dt        j                  ¬	«       t        «       }t        D ��cg c]  }t        D ]  }t!        ||«      ‘Œ Œ c}}at"        D �cg c]	  }||v sŒ|‘Œ c}a|s0t        d
t        j                  ¬	«       t	        j&                  d«       t        dt)        t$        «      › d�t        j                  ¬	«       t+        |«      }t-        ||j.                  «       y c c}}w c c}w )Nz7Regenerate MLP preset block in strategy_mlp_scores.pine)Údescriptionz	--dry-runÚ
store_truez1Print generated block without modifying Pine file)ÚactionÚhelpr   zLoading MLP artifacts...r^   u+   No artifacts found â€” nothing to generate.rW   z
Generating block for z preset(s)...)ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr‚   rI   Úinsertrm   ÚdirnameÚabspathÚ__file__r�   rƒ   r˜   rt   ru   rH   r
  r	  r  r¬   r   r  r  )ÚparserÚargsrˆ   rå   rE   r�   r  s          r.   Úmainr   æ  s1  € ô ×$Ñ$ØMôO€Fà
×Ñ˜¨LØPð ô Rà×ÑÓ€Dô ‡H�H‡O�O�A”r—w‘w—‘¤r§w¡w§¡´r·w±w·±ÄxÓ7PÓ'QÓRÔSä	Ð
$¬3¯:©:Õ6Ü‹n€Gå4;ÔK±G¨qÇdÀœ A rÕ*ÀdÐ*°GÒK€OÝ&5ÓF¡o ¸¸gºš1 oÑFÐáÜÐ;Ä#Ç*Á*ÕMÜ�‰�Œä	Ð#¤CÔ(;Ó$<Ð#=¸]Ð
KÔRU×R\ÑR\Õ]Ü˜7Ó#€EÜ�˜Ÿ™Õ%ùó LùÚFs   Ã$FÄ	F%ÄF%Ú__main__)rY   )z    )z        ),Ú__doc__r  rx   rN   ÚjsonÚmathrm   rk   r‚   r   r  r|   ro   rÞ   rã   rt   ru   rß   r   r…   r7   r=   r{   r<   r9   r/   r@   rC   rH   rT   Údictr˜   r¡   rw   r²   rÃ   rÏ   r   rB   r  r	  r
  r   Ú__name__r,   r0   r.   Ú<module>r'     sˆ  ðñó Û 
Û Û Û Û 	Û 	Û 
Ý ð 5€	Ø&€Ø €à7€Ø/€ð Ð
€Ú
)€à(Ð ð Ð/ðÐ ò
Ð ò i€ÚQ€ò€ð�%ð ˜Có ð˜ð  3ó ð�Cð ˜Có ð�cð ˜sð  só ð�ð ˜ó ðW�dó WðxQ˜Có Qñ

¨dó 
ñ°4ó ñ@1¸ó 1ðlw#˜Dð w# Só w#ðx#B˜ð #B dð #B¨tó #BðL Ð Ø€ò&ð6 ˆzÒÙ…Fð r0   