Ë
    sw±jS  ã                   óˆ  — d dl Zd dlmc m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mZmZmZmZ ej$                  j'                  ej$                  j)                  ej$                  j+                  e«      d«      «      Zej$                  j)                  eddd«      Zej$                  j)                  eddd	«      Zd
„ Zd„ Zd„ Zd„ Zd„ Zej>                  jA                  ej$                  jC                  e«       d¬«      d„ «       Z"ej>                  jA                  ej$                  jC                  e«       d¬«      d„ «       Z#y)é    N)Úapply_pine_time_gateÚcheck_tv_entry_markersÚrun_python_strategyÚstrategy_stemÚtv_score_columnz..ÚdataÚmlpzCOINBASE_BTCUSD, 1D.csvÚresultsÚwinnersz>optimization_winner_strategy_mlp_scores_COINBASE_BTCUSD_1D.csvc                  ó   — d} t        | «      }d}||k(  }|sÉt        j                  d|fd||f«      dt        j                  «       v st        j
                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x} x}x}}d	} t        | «      }d
}||k(  }|sÉt        j                  d|fd||f«      dt        j                  «       v st        j
                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x} x}x}}y )Nzstrategy_activation_scores.pyÚactivation_scores©ú==©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   ©Úpy0Úpy2Úpy4Úpy7úassert %(py9)sÚpy9ústrategy_mlp_scores.pyÚ
mlp_scores)	r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Ú@py_assert1Ú@py_assert3Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10s         úm/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tests/test_tv_parity_tooling.pyÚ4test_strategy_stem_supports_activation_and_mlp_filesr)      s  € Ø8ÐPŒ=Ð8Ó9ÐPÐ=PÐPÐ9Ð=PÑP×P×PÕPÐ9Ð=P×P×P×P×P×PÑPŒ=×P×PÓPŒ=×P×PÔPÐ8×P×PÒPÐ9×P×PÒPÐ=P×P×P×P×P×P×PÕPØ1ÐBŒ=Ð1Ó2ÐB°lÐBÐ2°lÑB×B×BÕBÐ2°l×B×B×B×B×BÑBŒ=×B×BÓBŒ=×B×BÔBÐ1×B×BÒBÐ2×B×BÒB°l×B×B×B×B×B×BÖBó    c            
      óÒ  — t         j                  } ddgi} | |«      }t        |«      }d}||k(  }|�s:t        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x} x}x}x}x}}t         j                  } d
dgi} | |«      }t        |«      }d
}||k(  }|�s:t        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x} x}x}x}x}}t         j                  } ddgi} | |«      }t        |«      }d }||u }|�s:t        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x} x}x}x}x}}y )NÚactivation_score_pocç      ð?r   )zn%(py9)s
{%(py9)s = %(py0)s(%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.DataFrame
}(%(py5)s)
})
} == %(py12)sr   Úpd)r   Úpy1Úpy3Úpy5r   r   Úpy12zassert %(py14)sÚpy14Ú	mlp_scoreÚclose)Úis)zn%(py9)s
{%(py9)s = %(py0)s(%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.DataFrame
}(%(py5)s)
})
} is %(py12)s)r.   Ú	DataFramer   r   r   r   r   r   r   r    r!   )Ú@py_assert2Ú@py_assert4r$   Ú@py_assert8Ú@py_assert11Ú@py_assert10Ú@py_format13Ú@py_format15s           r(   Ú3test_tv_score_column_prefers_available_export_scorer?       sŒ  € ÜŸ<™<ÐcÐ)?À#ÀÐ(GÐc™<Ð(GÓHÐcŒ?ÐHÓIÐcÐMcÐcÐIÐMcÑc×c×cÖcÐIÐMc×c×c×c×c×cÑcŒ?×c×cÓcŒ?×c×c×c×c×cÒcœ2×c×cÓcœ2×c×cÔc˜<×c×cÒcÐ(G×c×cÒcÐH×c×cÒcÐI×c×cÒcÐMc×c×c×c×c×c×c×cÑcÜŸ<™<ÐM¨°s°eÐ(<ÐM™<Ð(<Ó=ÐMŒ?Ð=Ó>ÐMÀ+ÐMÐ>À+ÑM×M×MÖMÐ>À+×M×M×M×M×MÑMŒ?×M×MÓMŒ?×M×M×M×M×MÒMœ2×M×MÓMœ2×M×MÔM˜<×M×MÒMÐ(<×M×MÒMÐ=×M×MÒMÐ>×M×MÒMÀ+×M×M×M×M×M×M×MÑMÜŸ<™<ÐB¨°3°%Ð(8ÐB™<Ð(8Ó9ÐBŒ?Ð9Ó:ÐB¸dÐBÐ:¸dÐB×B×BÖBÐ:¸d×B×B×B×B×BÑBŒ?×B×BÓBŒ?×B×B×B×B×BÒBœ2×B×BÓBœ2×B×BÔB˜<×B×BÒBÐ(8×B×BÒBÐ9×B×BÒBÐ:×B×BÒB¸d×B×B×B×B×B×B×BÒBr*   c            	      ó  — t        j                  t        j                  g d¢«      g d¢g d¢dœ«      } dt        j                  d«      ddœg}t	        || d	t        j                  d
«      t        j                  d«      «      }|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }t        |«      }d}	||	k(  }
|
sÉt        j                  d|
fd||	f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	|d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }t        j                  d
«      g}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )N)ú2020-01-01 00:00z2020-01-01 06:00ú2020-01-01 12:00)r-   ç        r-   )rC   rC   r-   )Útimezentry (standard)zmissed entryé   rB   F)Ú	trade_numÚentry_dtÚ	is_marginÚ6HrA   Útv_with_markerr   r   )z%(py1)s == %(py4)s)r/   r   zassert %(py6)sÚpy6Útv_without_markerr   Úlenr   r   r   Úchart_exec_countÚchart_without_tv)r.   r7   Úto_datetimeÚ	Timestampr   r   r   r   r    r!   rM   r   r   r   )ÚsignalsÚ	tv_tradesÚresultÚ@py_assert0r#   r8   Ú@py_format5Ú@py_format7r"   r$   r%   r&   r'   s                r(   Ú2test_tv_entry_marker_check_detects_export_mismatchrX   &   s  € Ü�l‰lÜ—‘ò  
ó ò
 ,Ú'ñó €Gð Ü—L‘LÐ!3Ó4Øñð €Iô $ØØØÜ
�‰Ð'Ó(Ü
�‰Ð'Ó(ó€Fð Ð"Ñ#Ð( qÐ(Ð# qÑ(×(×(Õ(Ð# q×(×(Ó(Ð#×(×(Ò( q×(×(×(×(×(×(Ó(ØÐ)Ñ*Ð0Œ3Ð*Ó+Ð0¨qÐ0Ð+¨qÑ0×0×0Õ0Ð+¨q×0×0×0×0×0Ñ0Œ3×0×0Ó0Œ3×0×0Ô0Ð*×0×0Ò0Ð+×0×0Ò0¨q×0×0×0×0×0×0Õ0ØÐ$Ñ%Ð*¨Ð*Ð%¨Ñ*×*×*Õ*Ð%¨×*×*Ó*Ð%×*×*Ò*¨×*×*×*×*×*×*Ó*ØÐ$Ñ%ÐK¬"¯,©,Ð7IÓ*JÐ)KÐKÐ%Ð)KÑK×K×KÕKÐ%Ð)K×K×KÓKÐ%×K×KÒKÐ)K×K×K×K×K×K×KÔKr*   c            
      óÀ  — t        j                  t        j                  g d¢«      g d¢g d¢g d¢dœ«      } t        | ddddd	d
dœt        j                  d«      «      }|d   }|j
                  } |«       }g d¢}||k(  }|s”t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|d   }|j
                  } |«       }g d¢}||k(  }|s”t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )N)z2017-11-29 00:00z2017-11-30 00:00z2017-12-01 00:00z2017-12-01 12:00z2017-12-02 00:00)ç      Y@ç     @oÀrZ   r[   g     ÀrÀ)rZ   g     €V@rZ   g     €[@g      ^@)rD   Úactivation_scorer5   Úhighg      iÀg      I@g     ÀlÀTFrC   )Ú!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_thresholdz
2017-12-01Úexecute_entry)FFFTFr   ©zE%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.tolist
}()
} == %(py8)s©r/   r0   r1   Úpy8úassert %(py10)sÚpy10Úexecute_exit)FFFFT)r.   r7   rP   r   rQ   Útolistr   r   r   r    r!   ©	rR   ÚreplayedrU   r8   r9   Ú@py_assert7r$   Ú@py_format9Ú@py_format11s	            r(   Ú.test_pine_time_gate_starts_flat_at_score_startrq   D   sq  € Ü�l‰lÜ—‘ò  
ó ò CÚ3Ú2ñó €Gô $Øà17Ø04Ø=CØ,0Ø-2Ø),ñ	
ô 	�‰�\Ó"ó€Hð �OÑ$ÐSÐ$×+Ñ+ÐSÑ+Ó-ÐSÒ1SÐSÐ-Ð1SÑS×S×SÕSÐ-Ð1S×S×SÓSÐ$×S×SÒSÐ+×S×SÒSÐ-×S×SÒSÐ1S×S×S×S×S×S×S×SØ�NÑ#ÐRÐ#×*Ñ*ÐRÑ*Ó,ÐRÒ0RÐRÐ,Ð0RÑR×R×RÕRÐ,Ð0R×R×RÓRÐ#×R×RÒRÐ*×R×RÒRÐ,×R×RÒRÐ0R×R×R×R×R×R×R×RÐRr*   c                  óf  — t        j                  t        j                  g d¢«      g d¢g d¢g d¢g d¢dœ«      } d| j                  d<   t	        | dd	d
ddddddœt        j
                  d«      «      }|d   }|j                  } |«       }g d¢}||k(  }|s”t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )N)rA   z2020-01-01 08:00ú2020-01-01 16:00z2020-01-02 00:00)ç      i@rt   rC   rC   )rZ   g     @Y@g     €Y@g     ÀY@)rC   rC   rC   rC   )rD   r\   r5   r]   Ústoch_peak_normr   r   rZ   g      Œ@g      ŒÀTFé   rC   )r^   r_   r`   ra   rb   Úi_entry_score_windowÚi_exit_score_windowrc   rs   rd   )FFFTr   re   rf   rh   ri   )r.   r7   rP   Úattrsr   rQ   rk   r   r   r   r    r!   rl   s	            r(   Ú1test_pine_time_gate_preserves_mlp_entry_smoothingrz   c   s  € Ü�l‰lÜ—‘ò  
ó ò 5Ú-Ú,Ú/ñó €Gð &2€G‡M�M�/Ñ"ä#Øà16Ø05Ø=CØ,0Ø-2Ø$%Ø#$Ø),ñ		
ô 	�‰Ð'Ó(ó€Hð �OÑ$ÐLÐ$×+Ñ+ÐLÑ+Ó-ÐLÒ1LÐLÐ-Ð1LÑL×L×LÕLÐ-Ð1L×L×LÓLÐ$×L×LÒLÐ+×L×LÒLÐ-×L×LÒLÐ1L×L×L×L×L×L×L×LÐLr*   z8real-export integration requires local BTC 1D chart data)Úreasonc                  ó¸  — t        j                  t        «      j                  d   j	                  «       } t        t        | d¬«      }d}|j                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}d}|j                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}d}|j                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }|j                   } |«       }d}||kD  }|s”t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}y )Nr   r   )Ústrategy_filer\   ©Úin)z/%(py1)s in %(py5)s
{%(py5)s = %(py3)s.columns
}rR   ©r/   r0   r1   úassert %(py7)sr   rd   rj   )Ú>)zA%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.sum
}()
} > %(py8)srf   rh   ri   )r.   Úread_csvÚMLP_PARAMS_1DÚilocÚto_dictr   ÚDATA_1DÚcolumnsr   r   r   r   r   r   r    r!   Úsum)ÚparamsrR   rU   r9   r8   Ú@py_format6r&   rn   r$   ro   rp   s              r(   Ú+test_compare_tv_trades_can_run_mlp_strategyrŒ   „   s  € ä�[‰[œÓ'×,Ñ,¨QÑ/×7Ñ7Ó9€FÜ!ÜØØ.ô€Gð Ð0 §¡Ð0Ð Ð0×0×0Õ0Ð ×0×0Ó0Ð×0×0×0×0×0Ð0 ×0×0Ó0 ×0×0Ô0 ×0×0×0×0×0×0Ó0ØÐ-˜gŸo™oÐ-ˆ?˜oÐ-×-×-Õ-ˆ?˜o×-×-Ó-ˆ?×-×-×-×-×-Ð-˜g×-×-Ó-˜g×-×-Ô-˜o×-×-×-×-×-×-Ó-ØÐ,˜WŸ_™_Ð,ˆ>˜_Ð,×,×,Õ,ˆ>˜_×,×,Ó,ˆ>×,×,×,×,×,Ð,˜W×,×,Ó,˜W×,×,Ô,˜_×,×,×,×,×,×,Ó,Ø�?Ñ#Ð-Ð#×'Ñ'Ð-Ñ'Ó)Ð-¨AÐ-Ð)¨AÑ-×-×-Õ-Ð)¨A×-×-Ó-Ð#×-×-Ò-Ð'×-×-Ò-Ð)×-×-Ò-¨A×-×-×-×-×-×-×-Ð-r*   c            
      óø  — t        j                  t        j                  ddt        dddt
        gt        dddd¬	«      } | j                  }d
}||k(  }|sÍt        j                  d|fd||f«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |«      dœz  }t        j                  | j                  «      dz   d|iz  }t!        t        j"                  |«      «      ‚d x}x}}d}| j$                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}}d}| j$                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}}d}| j$                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}}y )Nzstrategies/validate_strategy.pyz--dataz--strategy_filer   z--params_fileTéx   F)ÚcwdÚcapture_outputÚtextÚtimeoutÚcheckr   r   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)srT   )r   r   r1   z
>assert %(py7)sr   zTrade-walk diagnosticsr~   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stdout
}r€   r�   zCanonical optimizer metricsz<Source: strategy.calculate_metrics(signals, score_start=...))Ú
subprocessÚrunÚsysÚ
executabler‡   r„   ÚREPOÚ
returncoder   r   r   r   r   r   Ú_format_assertmsgÚstderrr    r!   Ústdout)rT   r"   r9   r#   r‹   r&   rU   r8   s           r(   Ú7test_validate_strategy_prints_canonical_metrics_sectionr�   “   s  € ä�^‰^ä�N‰NØ-ØÜØØ$ØÜð		
ô ØØØØô€Fð$ ×ÑÐ0 Ð0Ð Ñ!×0×0Õ0Ð ×0×0×0×0×0Ñ0ˆ6×0×0Ó0ˆ6×0×0Ô0Ð×0×0Ò0 ×0×0×0 6§=¡=×0×0×0×0×0×0Ð0Ø#Ð4 v§}¡}Ð4Ð# }Ð4×4×4Õ4Ð# }×4×4Ó4Ð#×4×4×4×4×4Ð4 v×4×4Ó4 v×4×4Ô4 }×4×4×4×4×4×4Ó4Ø(Ð9¨F¯M©MÐ9Ð(¨MÐ9×9×9Õ9Ð(¨M×9×9Ó9Ð(×9×9×9×9×9Ð9¨F×9×9Ó9¨F×9×9Ô9¨M×9×9×9×9×9×9Ó9ØIÐZÈVÏ]É]ÐZÐIÈ]ÐZ×Z×ZÕZÐIÈ]×Z×ZÓZÐI×Z×Z×Z×Z×ZÐZÈV×Z×ZÓZÈV×Z×ZÔZÈ]×Z×Z×Z×Z×Z×ZÔZr*   )$Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   Úosr”   r–   Úpandasr.   ÚpytestÚtools.compare_tv_tradesr   r   r   r   r   ÚpathÚabspathÚjoinÚdirnameÚ__file__r˜   r‡   r„   r)   r?   rX   rq   rz   ÚmarkÚskipifÚexistsrŒ   r�   © r*   r(   Ú<module>r¯      s  ðß  „ ƒ	Û Û 
ã Û ÷õ ð 
‡w�w‡��r—w‘w—|‘| B§G¡G§O¡O°HÓ$=¸tÓDÓE€Ø
�'‰'�,‰,�t˜V UÐ,EÓ
F€Ø—‘—‘ØØØØDó	€òCò
CòLò<Sò>MðB ‡�×Ñ˜Ÿ™Ÿ™ wÓ/Ð/Ð8rÐÓsñ.ó tð.ð ‡�×Ñ˜Ÿ™Ÿ™ wÓ/Ð/Ð8rÐÓsñ[ó tñ[r*   