tranzactii

This commit is contained in:
Marius
2026-05-29 03:35:36 +03:00
parent f269eda6df
commit e3d21bddf1
3 changed files with 235 additions and 60 deletions

Binary file not shown.

View File

@@ -189,22 +189,31 @@ def build_config(wb: Workbook) -> None:
ws["B5"].number_format = '0.0"%"' ws["B5"].number_format = '0.0"%"'
ws["B6"].number_format = "$#,##0.00" ws["B6"].number_format = "$#,##0.00"
# ---- Bloc Cont Prop Firm (separat de modelul abstract de mai sus) ---- # ---- Bloc Cont real TradeLocker / Prop Firm ----
ws["A8"] = "Cont Prop Firm" # Lanț de calcul transparent: Lot size -> $/punct -> $ risc la 1% mișcare preț.
# Toate coloanele $ din Trades folosesc B10*B11 (= $ risc la 1% preț pe poziția ta).
# Scalare la 100k: schimbi B9 (Account) și B10 (Lot size) — restul se recalculează.
ws["A8"] = "Cont real TradeLocker (prop firm)"
ws["A8"].font = SUBTITLE_FONT ws["A8"].font = SUBTITLE_FONT
ws.merge_cells("A8:C8") ws.merge_cells("A8:C8")
ws["A9"] = "Account Prop Start ($)" ws["A9"] = "Account Start ($)"
ws["B9"] = 50000 ws["B9"] = 50000
ws["C9"] = "Balanța contului de prop" ws["C9"] = "Balanța contului. Schimbă în 100000 pentru un cont de 100k."
ws["A10"] = "Contracte per trade" ws["A10"] = "Lot size per semnal (US30)"
ws["B10"] = 1 ws["B10"] = 0.08
ws["C10"] = "Număr de contracte tranzacționate per semnal (TradeLocker)" ws["C10"] = (
"Câte loturi US30 intri pe fiecare semnal (TradeLocker). "
"Pe 100k cu același risc %: 0.16."
)
ws["A11"] = "$ per 1% per contract" ws["A11"] = "$ per 1% preț, la 1.0 lot"
ws["B11"] = 10000 ws["B11"] = "=B24*B25/100"
ws["C11"] = "Pe DIA: 0.10% = $1000 ⇒ 1% = $10,000 (1 contract notional ≈ $1M)" ws["C11"] = (
"Auto = ($/punct la 1 lot, B24) × (Preț reper, B25 / 100). "
"Înmulțit cu Lot size (B10) dă riscul real per 1% — vezi B27."
)
ws["A12"] = "Daily Loss Limit (%)" ws["A12"] = "Daily Loss Limit (%)"
ws["B12"] = 4.0 ws["B12"] = 4.0
@@ -212,7 +221,7 @@ def build_config(wb: Workbook) -> None:
ws["A13"] = "Daily Loss Limit ($)" ws["A13"] = "Daily Loss Limit ($)"
ws["B13"] = "=B9*B12/100" ws["B13"] = "=B9*B12/100"
ws["C13"] = "Auto — derivat din B9 și B12" ws["C13"] = "Auto — derivat din Account Start (B9) și %"
ws["A14"] = "Max Loss Limit (%)" ws["A14"] = "Max Loss Limit (%)"
ws["B14"] = 7.0 ws["B14"] = 7.0
@@ -220,22 +229,7 @@ def build_config(wb: Workbook) -> None:
ws["A15"] = "Max Loss Limit ($)" ws["A15"] = "Max Loss Limit ($)"
ws["B15"] = "=B9*B14/100" ws["B15"] = "=B9*B14/100"
ws["C15"] = "Auto — derivat din B9 și B14" ws["C15"] = "Auto — derivat din Account Start (B9) și %"
for r in (9, 10, 11, 12, 14): # inputuri galbene
ws.cell(row=r, column=2).fill = INPUT_FILL
ws.cell(row=r, column=2).border = BORDER
for r in (13, 15): # derived blue
ws.cell(row=r, column=2).fill = DERIVED_FILL
ws.cell(row=r, column=2).border = BORDER
ws["B9"].number_format = "$#,##0"
ws["B10"].number_format = "0"
ws["B11"].number_format = "$#,##0"
ws["B12"].number_format = '0.0"%"'
ws["B13"].number_format = "$#,##0"
ws["B14"].number_format = '0.0"%"'
ws["B15"].number_format = "$#,##0"
# Escape hatch performanță: activează/dezactivează filtrul Prima per Indicator # Escape hatch performanță: activează/dezactivează filtrul Prima per Indicator
ws["A17"] = "Activează filtru Prima" ws["A17"] = "Activează filtru Prima"
@@ -253,6 +247,179 @@ def build_config(wb: Workbook) -> None:
dv_prima.add("B17") dv_prima.add("B17")
ws.add_data_validation(dv_prima) ws.add_data_validation(dv_prima)
# ---- Calibrare $/punct dintr-un ordin reper + derivate informative ----
# Helper universal: dintr-un singur ordin TradeLocker (orice indicator) derivi
# $/punct, apoi $/1% preț. Pentru alt indicator schimbi cele 4 inputuri reper
# (B19-B22) + Preț reper curent (B25). Restul se recalculează singur.
ws["A18"] = "— Calibrare $/punct (dintr-un ordin reper TradeLocker) —"
ws["A18"].font = Font(name="Calibri", size=10, italic=True, bold=True, color="1F3864")
ws.merge_cells("A18:C18")
ws["A19"] = "Preț entry (ordin reper)"
ws["B19"] = 50680.15
ws["C19"] = "Prețul de intrare afișat în ticketul TradeLocker (orice ordin reper)."
ws["A20"] = "Preț SL (ordin reper)"
ws["B20"] = 50618.24
ws["C20"] = "Prețul SL din același ticket."
ws["A21"] = "$ risc afișat (ordin reper)"
ws["B21"] = 495.24
ws["C21"] = "Cifra $ pe care TradeLocker o arată la SL pentru ordinul reper."
ws["A22"] = "Lot size (ordin reper)"
ws["B22"] = 0.08
ws["C22"] = "Câte loturi avea ordinul reper (poate diferi de lotul tău curent, B10)."
ws["A23"] = "↳ Distanță reper (puncte)"
ws["B23"] = "=ABS(B19-B20)"
ws["C23"] = "Auto = |entry SL|. Aici ⇒ 61.91 puncte."
ws["A24"] = "↳ $ per punct la 1.0 lot"
ws["B24"] = "=IF(OR(B23=0,B22=0),0,B21/B23/B22)"
ws["C24"] = (
"Auto = $risc ÷ distanță ÷ lot reper. Pe US30 ⇒ $100/punct la 1 lot. "
"Asta intră în B11. Pe alt indicator se recalibrează singur."
)
ws["A25"] = "Preț reper (curent)"
ws["B25"] = 50700
ws["C25"] = (
"Nivelul curent al indicatorului; convertește % mișcare preț în puncte/$. "
"Pentru alt indicator pui prețul lui."
)
ws["A26"] = "↳ $ per punct (la lotul tău)"
ws["B26"] = "=B10*B24"
ws["C26"] = "Auto = Lot size (B10) × $/punct la 1 lot (B24). La 0.08 loturi ⇒ $8/punct."
ws["A27"] = "↳ $ risc la 1% mișcare preț"
ws["B27"] = "=B10*B11"
ws["C27"] = (
"Auto — INIMA calculului. $ pe trade = R × SL% × această valoare. "
"La 0.08 loturi US30 ⇒ ~$4,056."
)
for r in (9, 10, 12, 14, 19, 20, 21, 22, 25): # inputuri galbene
ws.cell(row=r, column=2).fill = INPUT_FILL
ws.cell(row=r, column=2).border = BORDER
for r in (11, 13, 15, 23, 24, 26, 27): # derived blue
ws.cell(row=r, column=2).fill = DERIVED_FILL
ws.cell(row=r, column=2).border = BORDER
ws["B9"].number_format = "$#,##0"
ws["B10"].number_format = "0.00"
ws["B11"].number_format = "$#,##0"
ws["B12"].number_format = '0.0"%"'
ws["B13"].number_format = "$#,##0"
ws["B14"].number_format = '0.0"%"'
ws["B15"].number_format = "$#,##0"
ws["B19"].number_format = "#,##0.00"
ws["B20"].number_format = "#,##0.00"
ws["B21"].number_format = '"$"#,##0.00'
ws["B22"].number_format = "0.00"
ws["B23"].number_format = "#,##0.00"
ws["B24"].number_format = '"$"#,##0.00'
ws["B25"].number_format = "#,##0"
ws["B26"].number_format = '"$"#,##0.00'
ws["B27"].number_format = '"$"#,##0.00'
# ---- Utilitar: calcul preț SL pentru TradeLocker (pas cu pas) ----
# Forward helper: din SL% (TradeStation) + preț intrare (TradeLocker) + direcție
# → prețul exact la care pui SL în TradeLocker. Celule intermediare vizibile.
ws["A29"] = "— Utilitar: ce prețuri SL/TP pun în TradeLocker —"
ws["A29"].font = Font(name="Calibri", size=10, italic=True, bold=True, color="1F3864")
ws.merge_cells("A29:C29")
ws["A30"] = "SL % (din TradeStation)"
ws["B30"] = 0.08
ws["C30"] = "Procentul SL al semnalului (% mișcare de preț), ex: 0.08."
ws["A31"] = "Preț intrare (TradeLocker)"
ws["B31"] = 50649.50
ws["C31"] = "Prețul tău de intrare US30 (nu prețul reper de la B25)."
ws["A32"] = "Direcție"
ws["B32"] = "Sell"
ws["C32"] = "Sell ⇒ SL DEASUPRA intrării. Buy ⇒ SL DEDESUBT."
ws["A33"] = "↳ Distanță SL (puncte)"
ws["B33"] = "=B31*B30/100"
ws["C33"] = "Auto = Preț intrare × SL% / 100. Ex: 50649.50 × 0.08/100 ⇒ ~40.5 puncte."
ws["A34"] = "↳ PREȚ SL de setat în TradeLocker"
ws["B34"] = '=IF(B32="Sell",B31+B33,B31-B33)'
ws["C34"] = "Sell: intrare + distanță. Buy: intrare distanță. ASTA pui în TradeLocker."
ws["A35"] = "↳ $ risc la acest SL"
ws["B35"] = "=B33*B26"
ws["C35"] = (
"Auto = Distanță (puncte) × $/punct la lotul tău (B26). "
"Verificare: ar trebui să se potrivească cu cifra $ din ticketul TradeLocker."
)
for r in (30, 31, 32): # inputuri galbene
ws.cell(row=r, column=2).fill = INPUT_FILL
ws.cell(row=r, column=2).border = BORDER
for r in (33, 34, 35): # derived blue
ws.cell(row=r, column=2).fill = DERIVED_FILL
ws.cell(row=r, column=2).border = BORDER
# Output principal evidențiat
ws["A34"].font = Font(name="Calibri", size=11, bold=True, color="1F3864")
ws["B34"].font = Font(name="Calibri", size=11, bold=True)
ws["B32"].alignment = CENTER
ws["B30"].number_format = '0.000"%"'
ws["B31"].number_format = "#,##0.00"
ws["B33"].number_format = "#,##0.00"
ws["B34"].number_format = "#,##0.00"
ws["B35"].number_format = '"$"#,##0.00'
# --- TP0/TP1/TP2: aceeași logică, dar în direcția profitului (opus SL) ---
ws["A36"] = "TP0 % (din TradeStation)"
ws["B36"] = 0.03
ws["C36"] = "Procentul TP0 al semnalului (% mișcare de preț)."
ws["A37"] = "TP1 % (din TradeStation)"
ws["B37"] = 0.06
ws["C37"] = "Procentul TP1 al semnalului."
ws["A38"] = "TP2 % (din TradeStation)"
ws["B38"] = 0.08
ws["C38"] = "Procentul TP2 al semnalului."
ws["A39"] = "↳ PREȚ TP0 de setat"
ws["B39"] = '=IF(B32="Sell",B31-B31*B36/100,B31+B31*B36/100)'
ws["C39"] = (
"Distanță = intrare × TP0% / 100. Sell: intrare distanță. "
"Buy: intrare + distanță (TP-ul e opus SL-ului)."
)
ws["A40"] = "↳ PREȚ TP1 de setat"
ws["B40"] = '=IF(B32="Sell",B31-B31*B37/100,B31+B31*B37/100)'
ws["C40"] = "La fel, cu TP1%."
ws["A41"] = "↳ PREȚ TP2 de setat"
ws["B41"] = '=IF(B32="Sell",B31-B31*B38/100,B31+B31*B38/100)'
ws["C41"] = "La fel, cu TP2%."
for r in (36, 37, 38): # inputuri galbene
ws.cell(row=r, column=2).fill = INPUT_FILL
ws.cell(row=r, column=2).border = BORDER
ws.cell(row=r, column=2).number_format = '0.000"%"'
for r in (39, 40, 41): # output evidențiat (albastru, bold)
ws.cell(row=r, column=2).fill = DERIVED_FILL
ws.cell(row=r, column=2).border = BORDER
ws.cell(row=r, column=2).number_format = "#,##0.00"
ws.cell(row=r, column=2).font = Font(name="Calibri", size=11, bold=True)
ws.cell(row=r, column=1).font = Font(
name="Calibri", size=11, bold=True, color="1F3864"
)
dv_dir = DataValidation(type="list", formula1='"Buy,Sell"', allow_blank=False)
dv_dir.add("B32")
ws.add_data_validation(dv_dir)
# Liste dropdown — coloanele EJ (6 coloane) # Liste dropdown — coloanele EJ (6 coloane)
list_columns = [ list_columns = [
("Strategii", STRATEGIES), ("Strategii", STRATEGIES),
@@ -272,7 +439,7 @@ def build_config(wb: Workbook) -> None:
c.alignment = CENTER c.alignment = CENTER
widths = { widths = {
"A": 24, "B": 14, "C": 38, "D": 2, "A": 30, "B": 14, "C": 40, "D": 2,
"E": 14, "F": 14, "G": 13, "H": 10, "I": 10, "J": 12, "E": 14, "F": 14, "G": 13, "H": 10, "I": 10, "J": 12,
} }
for col, w in widths.items(): for col, w in widths.items():
@@ -699,7 +866,7 @@ METRIC_HINTS: dict[str, str] = {
), ),
"Average Loss ($)": ( "Average Loss ($)": (
"Pierderea medie pe trade-urile negative (cifra apare cu minus).\n" "Pierderea medie pe trade-urile negative (cifra apare cu minus).\n"
"În dolari reali, 1R depinde de SL%: pierdere ≈ SL% × Contracte × $/1% per contract.\n" "În dolari reali, 1R depinde de SL%: pierdere ≈ SL% × $ risc la 1% preț (Config B27).\n"
"Dacă e mult mai mare decât riscul calculat din SL, ai SL-uri sărite (slippage, gap-uri)." "Dacă e mult mai mare decât riscul calculat din SL, ai SL-uri sărite (slippage, gap-uri)."
), ),
"Best Trade ($)": ( "Best Trade ($)": (
@@ -709,8 +876,8 @@ METRIC_HINTS: dict[str, str] = {
), ),
"Worst Trade ($)": ( "Worst Trade ($)": (
"Cea mai mare pierdere individuală.\n" "Cea mai mare pierdere individuală.\n"
"Ar trebui să fie aproximativ egală cu 1R calculat din SL% × Contracte × $/1% per contract.\n" "Ar trebui să fie aproximativ egală cu 1R calculat din SL% × $ risc la 1% preț (Config B27).\n"
"Pe TradeLocker DIA: SL=0.30%, 1 contract → ≈ $3000. Dacă e mai mare, ai slippage/gap." "La 0.08 loturi US30: SL=0.30% × ~$4,056 ≈ $1,217. Dacă e mult mai mare, ai slippage/gap."
), ),
"Profit Factor": ( "Profit Factor": (
"Total bani câștigați împărțit la total bani pierduți (în valoare absolută).\n" "Total bani câștigați împărțit la total bani pierduți (în valoare absolută).\n"
@@ -729,7 +896,7 @@ METRIC_HINTS: dict[str, str] = {
"Pragul de GO LIVE: +0.20R sau mai mult." "Pragul de GO LIVE: +0.20R sau mai mult."
), ),
"Expectancy ($)": ( "Expectancy ($)": (
"Aceeași expectancy convertită în dolari, folosind SL% × Contracte × $/1% per contract.\n" "Aceeași expectancy convertită în dolari, folosind SL% × $ risc la 1% preț (Config B27).\n"
"Util ca să vezi cât câștigi în medie pe trade în bani reali (TradeLocker), nu doar în R." "Util ca să vezi cât câștigi în medie pe trade în bani reali (TradeLocker), nu doar în R."
), ),
"Cumulative P&L ($)": ( "Cumulative P&L ($)": (
@@ -750,11 +917,11 @@ METRIC_HINTS: dict[str, str] = {
"Capitalul de start al contului de prop firm (default $50,000).\n" "Capitalul de start al contului de prop firm (default $50,000).\n"
"Editabil în Config B9." "Editabil în Config B9."
), ),
"Position Size ($)": ( "$ risc la 1% preț ($)": (
"Configurare contract real TradeLocker:\n" "Câți $ riști pe poziția ta reală la 1% mișcare de preț (Config B27).\n"
" • Contracte per trade (Config B10) — câte contracte tranzacționezi pe semnal.\n" "Lanț: Lot size (B10) × $/punct la 1 lot (B24) = $/punct; × Preț reper (B25)/100 = $ per 1%.\n"
" • $ per 1% per contract (Config B11) — pe DIA: 0.10% = $1000 → 1% = $10,000.\n" "$/punct la 1 lot (B24) e calibrat dintr-un ordin reper TradeLocker — merge pe orice indicator.\n"
"Pierderea pe SL = SL% × Contracte × $/1% per contract. Pentru SL=0.30%, 1 contract → $3000." "La 0.08 loturi US30 ⇒ ~$4,056. Pe 100k cu lot 0.16 se dublează (~$8,112)."
), ),
"Cumulative P&L Prop ($)": ( "Cumulative P&L Prop ($)": (
"Profitul total al contului de prop pe traseul logat.\n" "Profitul total al contului de prop pe traseul logat.\n"
@@ -762,24 +929,24 @@ METRIC_HINTS: dict[str, str] = {
"Adunat peste $50,000 dă balanța finală reală." "Adunat peste $50,000 dă balanța finală reală."
), ),
"Final Balance Prop ($)": ( "Final Balance Prop ($)": (
"Balanța finală a contului de prop = $50,000 + Cumulative P&L Prop.\n" "Balanța finală a contului de prop = Account Start (Config B9) + Cumulative P&L Prop.\n"
"Compar-o cu pragul de stop-out al firmei de prop: $50,000 $3,500 = $46,500." "Compar-o cu pragul de stop-out: Account Start Max Loss Limit $ (Config B15)."
), ),
"Worst Daily Loss ($)": ( "Worst Daily Loss ($)": (
"Cea mai proastă pierdere cumulativă într-o zi calendaristică.\n" "Cea mai proastă pierdere cumulativă într-o zi calendaristică.\n"
"Dacă e mai mică decât $2,000, ai depășit Daily Loss Limit într-o zi — cont mort.\n" "Dacă e mai mică decât Daily Loss Limit $ (Config B13), ai depășit limita zilnică — cont mort.\n"
"Atenție: un singur breach = pierdere cont, indiferent dacă ai recuperat ulterior." "Atenție: un singur breach = pierdere cont, indiferent dacă ai recuperat ulterior."
), ),
"Daily Limit Status": ( "Daily Limit Status": (
"PASS dacă nicio zi nu a depășit Daily Loss Limit ($2,000 default).\n" "PASS dacă nicio zi nu a depășit Daily Loss Limit $ (Config B13, auto din Account × %).\n"
"FAIL = strategia ar fi pierdut contul prin daily breach pe traseul logat." "FAIL = strategia ar fi pierdut contul prin daily breach pe traseul logat."
), ),
"Max Account Drawdown ($)": ( "Max Account Drawdown ($)": (
"Cea mai mare cădere de la peak pe contul de prop.\n" "Cea mai mare cădere de la peak pe contul de prop.\n"
"Dacă > $3,500 (7% din $50k), ai depășit Max Loss Limit — cont mort." "Dacă > Max Loss Limit $ (Config B15, auto din Account × %), ai depășit limita — cont mort."
), ),
"Max Loss Status": ( "Max Loss Status": (
"PASS dacă Max Account Drawdown ≤ $3,500.\n" "PASS dacă Max Account Drawdown ≤ Max Loss Limit $ (Config B15).\n"
"FAIL = strategia ar fi pierdut contul prin drawdown cumulativ." "FAIL = strategia ar fi pierdut contul prin drawdown cumulativ."
), ),
"Overall Prop Status": ( "Overall Prop Status": (
@@ -1090,12 +1257,16 @@ def build_dashboard(wb: Workbook) -> None:
f'"CANDIDAT","PRE-CANDIDAT")))' f'"CANDIDAT","PRE-CANDIDAT")))'
) )
ws[f"{T_LET}{row}"] = ( ws[f"{T_LET}{row}"] = (
f'=IF(OR({F_}{row}<1,{D_}{row}<>"Toate"),-1E+12,' f'=IF(OR({F_}{row}<1,{D_}{row}<>"Toate",'
f'{I_}{row}*100000+{K_}{row}*1000+{L_}{row}-{M_}{row}-{O_}{row}/10)' f'{P_}{row}="DA",{Q_}{row}="DA"),-1E+12,'
f'{I_}{row}*20000+MIN({F_}{row},150)*100+'
f'{K_}{row}*1500+{L_}{row}-{M_}{row}-{O_}{row}/10)'
) )
ws[f"{U_LET}{row}"] = ( ws[f"{U_LET}{row}"] = (
f'=IF(OR({F_}{row}<1,{D_}{row}<>"Prima"),-1E+12,' f'=IF(OR({F_}{row}<1,{D_}{row}<>"Prima",'
f'{I_}{row}*100000+{K_}{row}*1000+{L_}{row}-{M_}{row}-{O_}{row}/10)' f'{P_}{row}="DA",{Q_}{row}="DA"),-1E+12,'
f'{I_}{row}*20000+MIN({F_}{row},150)*100+'
f'{K_}{row}*1500+{L_}{row}-{M_}{row}-{O_}{row}/10)'
) )
combo_rows.append(row) combo_rows.append(row)
combo_idx += 1 combo_idx += 1
@@ -1165,7 +1336,7 @@ def build_dashboard(wb: Workbook) -> None:
top_target_letters = ["B", "C", "D", "E", "F", "G", "H", "I", "J", "K"] top_target_letters = ["B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
def _emit_top_subsection(start_row: int, title: str, note: str, def _emit_top_subsection(start_row: int, title: str, note: str,
score_col: str, count: int = 5) -> int: score_col: str, count: int = 20) -> int:
ws[f"A{start_row}"] = title ws[f"A{start_row}"] = title
ws[f"A{start_row}"].font = SUBTITLE_FONT ws[f"A{start_row}"].font = SUBTITLE_FONT
ws.merge_cells(f"A{start_row}:K{start_row}") ws.merge_cells(f"A{start_row}:K{start_row}")
@@ -1235,21 +1406,25 @@ def build_dashboard(wb: Workbook) -> None:
top_title_row = row + 2 top_title_row = row + 2
after_top_toate = _emit_top_subsection( after_top_toate = _emit_top_subsection(
top_title_row, top_title_row,
"TOP 5 FERESTRE — Toate trade-urile", "TOP 20 FERESTRE — Toate trade-urile",
( (
"Top 5 după scor compus, calculat pe rândurile cu Filtru=Toate. " "Top 20 după scor compus, calculat pe rândurile cu Filtru=Toate. "
"CANDIDAT = îndeplinește pragurile (N≥40, WR≥55%, ExpR≥0.2, no breach). " "EXCLUDE ferestrele cu Daily Breach=DA sau Max Loss Breach=DA (ar fi pierdut contul prop). "
"PRE-CANDIDAT = N≥1 fără breach dar sub praguri. BREACH = ar fi pierdut prop." "Scor = ExpR×20000 + MIN(N,150)×100 + PF×1500 + CumP&L MaxDD MaxDDProp/10. "
"Bonusul N (capat la 150) favorizează ferestrele cu sample mai mare, statistic mai fiabile. "
"CANDIDAT = îndeplinește pragurile (N≥40, WR≥55%, ExpR≥0.2). "
"PRE-CANDIDAT = N≥1 fără breach dar sub praguri."
), ),
score_col=T_LET, score_col=T_LET,
) )
after_top_prima = _emit_top_subsection( after_top_prima = _emit_top_subsection(
after_top_toate + 2, after_top_toate + 2,
"TOP 5 FERESTRE — Prima per Indicator", "TOP 20 FERESTRE — Prima per Indicator",
( (
"Top 5 după scor compus, calculat pe rândurile cu Filtru=Prima (doar primul " "Top 20 după scor compus, calculat pe rândurile cu Filtru=Prima (doar primul "
"trade pe (Data, Indicator) în fiecare fereastră). Util pentru a vedea dacă " "trade pe (Data, Indicator) în fiecare fereastră). EXCLUDE ferestrele cu Daily "
"filtrul Prima identifică ferestre mai eficiente decât Toate." "Breach=DA sau Max Loss Breach=DA. Util pentru a vedea dacă filtrul Prima "
"identifică ferestre mai eficiente decât Toate."
), ),
score_col=U_LET, score_col=U_LET,
) )
@@ -1359,9 +1534,9 @@ def build_dashboard(wb: Workbook) -> None:
'"$"#,##0', '"$"#,##0',
), ),
( (
"Position Size ($)", "$ risc la 1% preț ($)",
lambda s: "=Config!$B$11", lambda s: "=Config!$B$27",
'"$"#,##0', '"$"#,##0.00',
), ),
( (
"Cumulative P&L Prop ($)", "Cumulative P&L Prop ($)",
@@ -1597,7 +1772,7 @@ def build_dashboard(wb: Workbook) -> None:
# Equity curve prop — al doilea chart, separat de modelul abstract # Equity curve prop — al doilea chart, separat de modelul abstract
chart_prop = LineChart() chart_prop = LineChart()
chart_prop.title = "Equity Curve — Prop ($50k start)" chart_prop.title = "Equity Curve — Prop (cont real)"
chart_prop.style = 12 chart_prop.style = 12
chart_prop.y_axis.title = "Balance Prop ($)" chart_prop.y_axis.title = "Balance Prop ($)"
chart_prop.x_axis.title = "Trade #" chart_prop.x_axis.title = "Trade #"