Files
mt5-tools/__pycache__/view_trade_compare.cpython-314.pyc
T

174 lines
25 KiB
Plaintext
Raw Normal View History

2026-04-12 18:25:46 +10:00
+
PŰi•IăóîRt^RIt^RIt^RIHt^RIt^RI t ]PP^] PP] PP]444^RIHtHtRtRtR#)
pages/trade_compare.py
======================
Side-by-side comparison of two trade history files.
Matches trades by symbol + type + open time within a tolerance window.
Highlights slippage, profit variance, and timing differences.
N)Údetect_and_parseÚ
calc_statscóp\P!VR7p.p\4pVP4EwrgRpV\P!^R7,p VP4Fpwr«WĄ9dK
VR,V R,8wdK$VR,V R,8wdK;\ VR,V R,,
4p WĂ8:gKcWÉ8gKkT p W«3pKr V'gK´Vwr«VP V
4\P !VR,4'dW\P !V R,4'd4\\V R,4\VR,4,
^4MRp
\P !VR,4'dW\P !V R,4'd4\\V R,4\VR,4,
^4MRp\P !VR ,4'dW\P !V R ,4'd4\\V R ,4\VR ,4,
^4MRp\V R,VR,,
P4^<, ^4p\\V PR
^4;'g^4\VPR
^4;'g^4,
^4pVP/R VR,bR VR
,bRVR,bRVR,bRVPR4bRVPR4bRVPR4bRVPR 4bRVPR
4bRV R,bRV R
,bRV R,bRV R,bRV PR4bRV PR4bRV PR4bRV PR 4bRV PR
4R V
R!VR"VR#VR$V/C4E \P!V4#)%z§
Match trades between two DataFrames.
Match criteria: same symbol_base + same type + open_time within tolerance.
Returns DataFrame of matched pairs with diff columns.
)ÚhoursN)ÚsecondsÚ symbol_baseÚtypeÚ open_timeÚ
open_priceÚ close_priceÚ
net_profitÚ duration_minÚ A_open_timeÚ A_close_timeÚ
close_timeÚA_symbolÚsymbolÚA_typeÚA_volumeÚvolumeÚ A_open_priceÚ
A_close_priceÚA_profitÚ
A_durationÚ B_open_timeÚ B_close_timeÚB_symbolÚB_typeÚB_volumeÚ B_open_priceÚ
B_close_priceÚB_profitÚ
B_durationÚ
open_slippageÚclose_slippageÚ
profit_varÚ
time_diff_minÚ
duration_diff)
ÚpdÚ TimedeltaÚsetÚiterrowsÚabsÚaddÚnotnaÚroundÚfloatÚ
total_secondsÚgetÚappendÚ DataFrame)Údf_aÚdf_bÚtolerance_hoursÚtolÚmatchedÚused_bÚ
best_matchÚ
best_deltaÚdeltaÚ open_slipÚ
close_slipr%Ú time_diffÚdur_diffs&&& Ú*C:\Users\pc\MT5Tools\view_trade_compare.pyÚ match_tradesrGsô
Ź,Š,
-€CŘ€GÜ‹e€Fŕ
Ř
Řś2ź<š<°Ô2
ŕ—M‘M–O‰DŚ{ŮŘŐ 1 ]Ő#3ÔŘŤyAfťIÔܨ¨;­Ő8Ž| Ö 2Ř#
Ř f
ń ‰:؉D ŹJ‰JqŚMäXZ×X`ŇX`ĐabĐcoŐap×XqŇXqÔwy×wŇwđABđCOőAP÷xQňxQśśu Q |Ą_Ó¸˝Ó9OŐOĐRSÔX\IÜXZ×X`ŇX`ĐabĐcpŐaq×XrŇXrÔwy×wŇwđABđCPőAQ÷xRňxRśśu Q }Ő%5Ó¸Ő?OÓ9PŐPĐRSÔX\JÜXZ×X`ŇX`ĐabĐcoŐap×XqŇXqÔwy×wŇwđABđCOőAP÷xQňxQśśu Q |Ą_Ó¸˝Ó9OŐOĐRSÔX\  +Ą°°;µŐ ?×PĐSUŐUĐWXÓYśu Q§UˇU¨>¸1Ó%=×%BĐ%BŔÓCÄeČAĎEÉEĐR`ĐbcÓLd×LiĐLiĐhiÓFjŐjĐlmÓn ŹN‰Nđŕ  ;Ąđđ  <Ąđđ  đ đ
  6Ąđ đ  §ˇ xŁđ
𠧡 |Ó!4đđ  §ˇ }Ó!5đ𠧡 |Ó!4đ𠧡 ~Ó!6đđ  ;Ąđđ  <Ąđđ  8Ąđđ  6Ąđđ  §ˇ xŁđ!đ" §ˇ |Ó!4đ#đ$  §ˇ }Ó!5đ%đ& §ˇ |Ó!4đ'đ( §ˇ ~Ó!6ŕ )Ř  *Ř *Ř  (ń5÷
ń5 ôn Ź<Š<Ó Đ ócóĐ(\P!R4\P!RRR7F-pV\P9gKR\PV&K/ \P!R 4\P
!^4wrT;_uu_4\P!R
4\P !R .RĄOR R
7pV'\VP4VP4wrEVeMV\PR&V\PR&\P!R\V4 RV 24M\P!R4\PR,eQ\P!R\PR, R\\PR,4 R24RRR4T;_uu_4\P!R4\P !R.RĄORR
7pV'\VP4VP4wrxVeMV\PR&V\PR&\P!R\V4 RV 24M\P!R4\PR,eQ\P!R\PR, R\\PR,4 R24RRR4\PR,p\PR,pVeVfR#\P!4\P!R4\P
!^4wršp \P
!^4wrÍpV ;_uu_4\P!R4RRR4V ;_uu_4\P!R4RRR4\P
!^4wppppppV;_uu_4VR,P4P!4pVR,P#4P!4p\P$!RVVVRR7p\P$!RVVVR R7pRRR4V;_uu_4\'VR!,P)4P+4P-44p\P.!R"VR#R$7pRRR4V;_uu_4\'VR%,P)4P+4P-44p\P.!R&VR'R$7p\P.!R(R)R*.R+R$7pRRR4V;_uu_4VR,P4P!4pVR,P#4P!4p\P$!R,VVVR-R7p \P$!R.VVVR/R7p!RRR4V;_uu_4\'VR!,P)4P+4P-44p"\P.!R0V"R1R$7p#RRR4V;_uu_4\'VR%,P)4P+4P-44p$\P.!R2V$R3R$7p%\P.!R4R)R*.R5R$7p&RRR4\P!4\P
!^^.4wp'p(V';_uu_4\P0!R6^^^^R7R87p)RRR4V(;_uu_4\P!R9RR7\P2!R:R;RR<7p*RRR4X*'gR=\P9dR#VP54p+V+V+R,P6P XV+R,P6P X8*,,p+X'd V+V+R!,P9V4,p+X'd V+V+R%,P9V4,p+X'd V+V+R>,P9V4,p+VP54p,V,V,R,P6P X 8¬V,R,P6P X!8*,,p,X#'d V,V,R!,P9V#4,p,X%'d V,V,R%,P9V%4,p,X&'d V,V,R>,P9V&4,p,V*'d€\P:!R?4;_uu_4\=V+V,X)4p-RRR4X-\PR=&\V+4\PR@&\V,4\PRA&\PP?R=\@PB!44p-\PP?R@\V+44p.\PP?RA\V,44p/V-e\V-4^8Xd\PD!RB4R#\P!4\P!RC4\P
!^4wp0p1p2p3p4V0PGRDV.4V1PGREV/4V2PGRF\V-44V3PGRGV.\V-4,
4V4PGRHV/\V-4,
4\P!4\P!RI4\P
!^4wp5p6T5;_uu_4\P!RJ4V-RK,PI4p7V-RK,^8„PK4^d,p8V-RK,PK4p9RLV-9dV-RL,PK4MRp:\PF!RMRNV7RO
24\PF!RPV8RQ
RR24\PF!RSRNV9RO
24V:'d\PF!RTV:RU
RV24RRR4T6;_uu_4\P!RW4V-RX,PI4p;V-RX,^8„PK4^d,p<V-RX,PK4p=RYV-9dV-RY,PK4MRp>V;X7,
p?\PF!RMRNV;RO
2V?RZ
R[R\7\PF!RPV<RQ
RR2V<X8,
R]
RR2R[R\7\PF!RSRNV=RO
2V=X9,
RZ
R[R\7V>'d2X:'d*\PF!RTV>RU
RV2V>V:,
R^
RV2R_R\7RRR4\P!4\P!R`4\P
!^4wp@pApBpCV-Ra,PK4pDRbV-9dV-Rb,PK4MV-Rc,PK4pEV-Rd,PK4pFV-Re,PK4pGX@PGRf\@PL!XD4'dXDRg
MRhRiRj7XAPGRk\@PL!XE4'dXERg
MRhRlRj7XBPGRm\@PL!XF4'dRNXFRZ
2MRhRnRj7XCPGRo\@PL!XG4'dXGR^
RV2MRhRpRj7\P!4\P!Rq4V-PORr4pH\PPR!4pIVIPU\PPV!VHRr,VHRK,PY4RsRt\[Ru^Rv7RwRxRy74VIPU\PPV!VHRz,VHRX,PY4RsR{\[R|^Rv7RwR}Ry74VIP]R~RR\[R€RR7\[RR„7\[RRNR…7\[R†R‡7\[^<^^^(R7R‰7\P^!VIRRŠ7\P!R4\PPR!4pJV-Rd,Pa4pKVJPU\PPb!\e\g\V-444V-Rd,VKRŤRŽ74VJP]^úRR\[R€RŹ7\[RRR7\[RRNR…7\[^<^^^(R7R7\P^!VJRRŠ7\P!4\P!R“4R”pLR•pMV-.R¦O,P54pN.R§OVNnF2pOVOXNP
9gKXNXO,PaR4VNVO&K4 FpOXNVO,PaR™4VNVO&K! FpOXNVO,Pa4VNVO&K! \Ph!XNPjPmXL.R«OR7PmXMRR—.R7RRRśRť7\Pn!RžVNPqRźR 7RˇR˘RŁ7R# +'giEL|;i +'giELO;i +'giELĄ;i +'giEL;i +'giELô;i +'giEL ;i +'giEL1;i +'giE
L˛;i +'giE
L^;i +'giE Lď;i +'giE L¤;i +'giE Lt;i +'giE
L;i +'giEL‰;i +'giELS;i)¬u🔄 Trade Compareu/
<div class="info-card">
Compare two trade history files — backtest vs real account, or any two exports.
Trades are matched by symbol, direction, and open time within a configurable
tolerance window to account for gaps, slippage, and market open variations.
</div>
T)Úunsafe_allow_htmlÚtc_df_aÚtc_df_bÚtc_fmt_aÚtc_fmt_bNz
Load Filesu(**File A** — Reference (e.g. Backtest)z
Upload File AÚtc_up_a)rÚkeyuâś“ u trades — zCould not parse File Az
Loaded: **u** · z tradesu-**File B** — Comparison (e.g. Real Account)z
Upload File BÚtc_up_bzCould not parse File BÚFiltersz**File A filters**z**File B filters**r u
A — FromÚ tc_a_from)ÚvalueÚ min_valueÚ max_valuerPuA — ToÚtc_a_toru A — SymbolÚtc_a_sym)rPÚstrategyuA — StrategyÚ
tc_a_stratu
A — TypeÚbuyÚsellÚ tc_a_typeu
B — FromÚ tc_b_fromuB — ToÚtc_b_tou B — SymbolÚtc_b_symuB — StrategyÚ
tc_b_stratu
B — TypeÚ tc_b_typeuJMatch tolerance (hours) — max time difference between A and B open timeszjTrades within this window are considered the same setup. Increase for daily charts, decrease for intraday.)rUrVrTÚstepÚhelpz<br>u🔍 Match TradesÚprimary)rÚuse_container_widthÚ
tc_matchedrzMatching trades...Ú tc_fa_lenÚ tc_fb_lenuVNo matching trades found — try increasing the tolerance window or adjusting filters.z
Match Summaryz
File A Tradesz
File B Tradesz
Matched Pairsz Unmatched Az Unmatched BzAggregate Comparisonz**File A (Reference)**rrz
Net ProfitÚ$z,.2fzWin Ratez.1fÚ%z
Avg Profitz Avg Durationz.0fÚmz**File B (Comparison)**r!r"ú+.2fÚnormal)rAÚ delta_colorz+.1fz+.0fÚoffzSlippage & Variance Summaryr#rCr$r%r&zAvg Entry Slippageú+.5fzN/Az<B open price minus A open price. Positive = B filled higher.)rdzAvg Exit Slippagez"B close price minus A close price.zAvg Profit Variancez*B net profit minus A net profit per trade.zAvg Time Differencez)B open time minus A open time in minutes.zEquity Curve OverlayrÚlineszFile Az#7c6af7)ÚcolorÚwidthÚtozeroyzrgba(124,106,247,0.05))ÚmodeÚnameÚlineÚfillÚ fillcolorrzFile Bz#2dc653zrgba(45,198,83,0.05)i@zrgba(10,10,15,1)z#aaazJetBrains Mono)rsÚfamilyzrgba(255,255,255,0.04))Ú gridcolor)r~Ú
tickprefixzrgba(0,0,0,0.3))Úbgcolor)Útr@)ÚheightÚ plot_bgcolorÚ
paper_bgcolorÚfontÚxaxisÚyaxisÚlegendÚmargin)rfzProfit Variance per TradecóV^dR#R#)ézrgba(45,198,83,0.7)zrgba(230,57,70,0.7)©)Úvs&rFÚ<lambda>Úrender.<locals>.<lambda>Rs¨1°¬6ĐLĐ7LĐLrHzProfit Variance (B - A))rvrwÚ marker_colorry)rszTrade #)r~Útitle)r„r…r†r‡rr‰rzMatched Trade Detailcó†\\V4PRR44pV^8”dR#V^8dR#R# R#;i)Úz color: #2dc653; font-weight: 600z color: #e63946; font-weight: 600z color: #666©r0ÚstrÚreplace©ÚvalrŹs& rFÚ colour_diffÚrender.<locals>.colour_diffisJđ Ü”c#“h×& s¨BÓ01ŚuŃ1ŚuŃ@řđ Ř Ůúó
+;Ż;»Acó†\\V4PRR44pV^8”dR#V^8dR#R# R#;i)Ú,rz$background-color: rgba(0,180,0,0.10)z$background-color: rgba(180,0,0,0.10)r—s& rFÚcolour_profit_cellÚ"render.<locals>.colour_profit_cellrsJđ Ü”c#“h×& s¨BÓ01ŚuŃ1ŚuŃCřđ Ř ŮúržúA ProfitúB ProfitcóF\P!V4'dVR
#R#)z.5fr©r(r.©rvs&rFrrŹs¬ŻŞ°Ż Ş QsĐ;rHcóF\P!V4'dVR
#R#)rmrs&rFrró¤R§X˘X¨a§[˘[4Đ8°bĐ8rHcóF\P!V4'dVR
#R#)rqrs&rFrrrH)Úsubsetiô)rfÚ
hide_indexr„u⬇ Download matched trades CSVF)Úindexztrade_comparison.csvztext/csv)ÚdataÚ file_nameÚmime)rKrLrMrN)ÚhtmlÚhtmÚcsv)rrrrrrrrrr r!r"r#r$r%r&)z A Open TimeÚSymbolÚTypeúA EntryúA ExitrŁzA Dur(m)z B Open TimeúB EntryúB Exitr¤zB Dur(m)ú
Entry Slipú Exit Slipú
Profit Varú Time Diff(m))r¸))))9Ústr“ÚmarkdownÚ
session_stateÚ subheaderÚcolumnsÚ
file_uploaderrÚreadryÚsuccessÚlenÚerrorÚcaptionÚdividerÚminÚdateÚmaxÚ
date_inputÚsortedÚdropnaÚuniqueÚtolistÚ multiselectÚsliderÚbuttonÚcopyÚdtÚisinÚspinnerrGr2r(r4ÚwarningÚmetricÚsumÚmeanr.Ú sort_valuesÚgoÚFigureÚ add_traceÚScatterÚcumsumÚdictÚ
update_layoutÚ plotly_chartÚapplyÚBarÚlistÚrangeÚ dataframeÚstyleÚmapÚdownload_buttonÚto_csv)PÚcol_aÚcol_bÚup_ar5Úfmt_aÚup_br6Úfmt_bÚfa1Úfa2Úfa3Úfb1Úfb2Úfb3Úcol1Úcol2Úcol3Úcol4Úcol5Úcol6Ú
a_date_minÚ
a_date_maxÚa_fromÚa_toÚa_symsÚ a_sel_symÚa_stratsÚ a_sel_stratÚ
a_sel_typeÚ
b_date_minÚ
b_date_maxÚb_fromÚb_toÚb_symsÚ b_sel_symÚb_stratsÚ b_sel_stratÚ
b_sel_typeÚcol_tolÚcol_runÚ toleranceÚrunÚfaÚfbr9Úfa_lenÚfb_lenÚm1Úm2Úm3Úm4Úm5Úac1Úac2Úa_netÚa_wrÚa_avgÚa_durÚb_netÚb_wrÚb_avgÚb_durÚ delta_netÚsc1Úsc2Úsc3Úsc4Ú
avg_open_slipÚavg_close_slipÚavg_profit_varÚ
avg_time_diffÚm_sortedÚfigÚfig2ÚcoloursrśÚdisplayÚcolsP rFÚrenderr:Yse܇H
‡Kđ  ő
<Ř ”B× $Ř"&ŚB× Ń  ń
‡L‚LÔÜ—:’:a“=L€Eç ŠÜ
Ź Š Đ×Ň Ň6JĐPYÔZß Ü*¨4Ż9©9«;¸ż ą ÓB‰KŇŘ/3”× Ń  Ń+Ř/4”× Ń  Ń
T¤# dŁ) ¨L¸¸ĐĐ
× Ń  ŹJŠJ¤B×$4Ń$4°ZŐ$@Đ#AŔĚĚB×L\ŃL\Đ]fŐLgÓHhĐGiĐipĐ 
÷
ŠÜ
Ź Š Đ×Ň Ň6JĐPYÔZß Ü*¨4Ż9©9«;¸ż ą ÓB‰KŇŘ/3”× Ń  Ń+Ř/4”× Ń  Ń
T¤# dŁ) ¨L¸¸ĐĐ
× Ń  ŹJŠJ¤B×$4Ń$4°ZŐ$@Đ#AŔĚĚB×L\ŃL\Đ]fŐLgÓHhĐGiĐipĐ 
ô × Ń  &€DÜ
× Ń  &€Dŕ |tô‡J‚J„L܇L‚LÔä—J’Jq“MM€C—JJq“MM€C ŠÜ
Ź Š Đ
ç ŠÜ
Ź Š Đ
ô*,ŻŞ°A«Ń&€D$dD 
ŠŘ&×,×3
Ř&×,×3
Ü|°:ČŘ)3¸ôFäz°:ČŘ)3¸ôD÷
÷
ŠÜ4 ť>×2×EÜ—NN >°6¸J ÷
÷
ŠÜT *ŐIÜ—n’nĐ%5°xŔ\ÔR Ü—nn \°E¸6°?Č ÔT
÷
÷
ŠŘ&×,×3
Ř&×,×3
Ü|°:ČŘ)3¸ôFäz°:ČŘ)3¸ôD÷
÷
ŠÜ4 ť>×2×EÜ—NN >°6¸J ÷
÷