
    9j
                       d Z ddlmZ ddlZddlZddlmZ ddlZddl	Z
 ee      j                         j                  j                  ZddlZej                   j#                  d ee             ddlmZmZmZmZmZmZ ddlmZmZ ddlmZmZm Z  ddZ!dd	Z"dd
Z#dddZ$ddZ%ddZ&	 	 	 	 	 	 ddZ'ddZ(ddZ)e*dk(  r e+ e)             y)ax  Fixed, non-promoting experiments for MLP-score swing structure on one timeframe.

This runner deliberately does not optimize thresholds, MLP weights, or pivot
windows.  It compares the promoted winner with a fixed confirmation ablation
and with three causal score-structure overlays.  A pivot is acted upon only on
its right-hand confirmation bar, preventing look-ahead bias.
    )annotationsN)Path)	OOS_STARTSCORE_START	TRAIN_END	WFO_FOLDSWFO_MIN_OOS_TRADESWFO_MIN_VALID_FOLDS)ScoreStructureconfirmed_score_structure)_score_to_signalscalculate_metricsgenerate_signalsc                .    t         dz  dz  d|  d| dz  S )Nresultswinners(optimization_winner_strategy_mlp_scores__.csvREPO)assettfs     S/Users/jameslopez/projects/TradingBot25/tools/run_mlp_score_structure_experiment.py_winner_pathr      s-    )i',TUZT[[\]_\``d*eee    c                B    dddddd}t         dz  dz  |  d	||    d
z  S )N2403604807201D)4H6H8H12Hr"   datamlpz, r   r   )r   r   periodss      r   
_data_pathr*       s7    %uU$OG&=5 eWBwr{m4#@@@r   c                N   t        | |      j                         5 }t        t        j                  |            }d d d        t        j                               D ]*  \  }}|j                  d      s|dvst        |      ||<   , |d   dv |d<   |d   dv |d<   |d   dv |d<   t        t        |d               }|j                         s>dt        |      v r1t        t        |      j                  dd	      d	   z  }t        d
z  |z  }t        |      |d<   |S # 1 sw Y   xY w)Ni_>   i_mvrv_suppress_beari_use_long_exit_confirmationi_use_long_entry_confirmationr.   >   1Truetruer/   r-   mlp_weights_filezstrategies/   
strategies)r   opennextcsv
DictReaderlistitems
startswithfloatr   strexistsr   split)r   r   handlerowkeyvalueweights_paths          r   _load_winnerrF   %   s1   	eR	 	%	%	'63>>&)* 
(399;'
U>>$C  0I  %IU|CH ( +..L*MQf*fC&'+./N+OSh+hC'("%&<"=AV"VCC 2345L ]c,6G%Gc,/55mQGJJl*\9!,/CJ 
(	's   DD$c                ~    || n| | d   t        j                  |      k     }t        |j                         |d      S )Ntimer4   )score_start
min_trades)pd	Timestampr   copy)signalsstartendframes       r   _metricsrR   6   s:    {G2<<PSCT0T(UEUZZ\uKKr   c                f   g }t         D ]=  \  }}}t        | ||      }|d   t        k\  s!|j                  t	        |d                ? t        |      t        k\  }|sddt        |      dfS t	        t        j                  |            t	        t        j                  |            t        |      dfS )NTotal TradesCalmar Ratio        g     XFT)
r   rR   r	   appendr=   lenr
   npmeanmin)rN   fold_calmarsr   rO   rP   foldeligibles          r   _wfor_   ;   s     "L"5#,#55d>&: ;< # < $77HE3|,e33&'rvvl/C)Dc,FWY]]]r   c                (   t        ||d   t        j                  t              k     t              }t        |t
              }|d   dk(  rt        |      }dD ]  }d||<   	 t        |      \  }}}}| |d   |d   |d   |d   |||||d   |d   |d   d	S )
NrH   rT   r   )rU   Total P&L %rV   rU   ra   zMax Drawdown %)
experiment	is_calmar
is_pnl_pctis_max_dd_pct	is_tradeswfo_mean_calmarwfo_min_calmarwfo_valid_foldswfo_eligible
oos_calmaroos_pnl_pct
oos_trades)rR   rK   rL   r   r   r   dictr_   )	namerN   
is_metricsoos_metricsrC   wfo_meanwfo_min	wfo_foldsrj   s	            r   _summaryru   G   s    ''&/R\\)5L"LM{[J7I.K >"a';'2C"K 315g.Hgy,/ /#$45/#!$$!.1"=1!.1 r   c          	     &   t        | j                         || d   j                         | d   j                  t        j                        | d   j                  t        j                        |r|j
                  nd |r|j                        S d       S )Nstoch_peak_normclosehigh)
entry_gateadditional_exit)r   rM   to_numpyrY   float64bullish_state
lower_high)baseparams	structuregate_entriesexit_lower_highs        r   _structure_overlayr   b   s    		((*Wrzz*Vbjj).:9**0?	,,  FJ r   c                   t        j                  t        | |            }|j                  j                  j                         j                  j                         |_        t        j                  |d   d      j                  j                  d       |d<   t        | |      }t        |d<   t        |fi |}t        d|      g}t        |      }d|d<   |j                  t        dt        |fi |             g }|D ]  }	t!        |d	   j#                         |	|	
      }
|j                  |	t%        |
j&                  j)                               t%        |
j*                  j)                               d       dD ]8  \  }}}|j                  t        d|	 d|	 d| t-        |||
||                   :  t        j.                  |      t        j.                  |      fS )NrH   T)utc_pine_time_startzbaseline (promoted winner)Fr.   zablation: exit confirmation offactivation_score)leftright)pivot_left_righthigher_lowslower_highs))zentry gate: higher-low stateTF)zexit: confirmed lower highFT)z*combined higher-low gate + lower-high exitTTzpivot /u    — )r   r   )rK   read_csvr*   columnsr>   lowerstripto_datetimedttz_localizerF   r   r   ru   rn   rW   r   r|   int
higher_lowsumr   r   	DataFrame)r   r   pivotsr'   r   r   r   no_exit_confirmationeventspivotr   labelr   r   s                 r   runr   o   s   ;;z%,-D<<##))+//557DL>>$v,D9<<HHNDL%$F!,FD+F+D4d;<G<;@78NN8=?OPT?mXl?mno&(F-d3E.F.O.O.QX]ejk	5YEYEYE]E]E_A`&))*>*>*B*B*D&EG 	H5
0E<
 NN8quUG4"40<o_ 5
	  << ",,v"666r   c                    t        j                         } | j                  dd       | j                  dd       | j                  dt        dg d	       | j                  d
t               | j                         }t        |j                  |j                  |j                        \  }}t        |j                  dd              t        d       t        |j                  d             |j                  r|j                  j                  j                  dd       |j                  j                  d      5 }|j!                  d       |j!                  d       |j!                  d       |j!                  |j                  dd              |j!                  d       |j!                  |j                  d             |j!                  d       d d d        yy# 1 sw Y   yxY w)Nz--assetCOINBASE_BTCUSD)defaultz--tfr$   z--pivots+)         )typenargsr   z--output)r   Fc                
    | dS Nz.3f rD   s    r   <lambda>zmain.<locals>.<lambda>   s
    uSkNr   )indexfloat_formatz"
Confirmed score-structure events:)r   T)parentsexist_okwz"# MLP score-structure experiment

z~This is a fixed historical screen, not an optimization or promotion. Pivots are acted on only after right-hand confirmation.

z## Results

```text
c                
    | dS r   r   r   s    r   r   zmain.<locals>.<lambda>   s    V[\_U`Sar   z#
```

## Confirmed events

```text
z
```
r   )argparseArgumentParseradd_argumentr   r   
parse_argsr   r   r   r   print	to_stringoutputparentmkdirr6   write)parserargsr   r   rA   s        r   mainr      s   $$&F
	+<=
-

CK

.D$**dggt{{;OGV	'

%6R

ST	
/0	&



'({{   =[[c"fLL?@LL W XLL23LL**Ea*bcLLDELL)))67LL# #  # s   <BG  G)__main__)r   r>   r   r>   returnr   )r   r>   r   r>   r   dict[str, object])N)rN   pd.DataFramerO   r>   rP   z
str | Noner   zdict[str, float])rN   r   r   ztuple[float, float, int, bool])ro   r>   rN   r   r   r   )r   r   r   r   r   r   r   boolr   r   r   r   )r   r>   r   r>   r   z	list[int]r   z!tuple[pd.DataFrame, pd.DataFrame])r   r   ),__doc__
__future__r   r   r8   pathlibr   numpyrY   pandasrK   __file__resolver   r   syspathinsertr>   configr   r   r   r   r	   r
   strategies.mlp_score_structurer   r   strategies.strategy_mlp_scoresr   r   r   r   r*   rF   rR   r_   ru   r   r   r   __name__
SystemExitr   r   r   <module>r      s    #  
   H~&&-- 
 3t9 = = T a afA
"L
	^6
%)
<@
EQ
7>2 z
TV
 r   