fix: 4 cycle errors — NameError _log, WHEAT/EUR/USD ticker normalization, 429 serial scoring
- auto_cycle.py: replace _log with logger (NameError at lines 484/489) - auto_cycle.py: normalize underlying via _normalize_ticker before _resolve_ticker so WHEAT→ZW=F→WEAT and EUR/USD→EURUSD=X→FXE reach the IV watchlist correctly - iv_engine.py: _resolve_ticker now strips slash-format forex (EUR/USD→EURUSD=X) before _PROXY lookup, fixing yfinance 500/404 spam from get_atm_iv - database.py: _fetch in log_trade_entries uses _normalize_ticker (not _normalize_yf_ticker) so commodity aliases like WHEAT→ZW=F are applied at price-fetch time - ai_analyzer.py: max_workers=1 for batch scorer — parallel workers both slept and retried simultaneously after 429, causing repeated bursts; sequential fixes the pattern - journal.py + JournalDeBord.tsx: add price_warning field (no_price_data/no_entry_price/ no_live_price) with visible ⚠ badge and amber color on affected ticker/price cells Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -857,7 +857,19 @@ function TradeMtmSection({ days }: { days: number }) {
|
||||
<td className="px-3 py-2 text-right font-mono text-[11px] text-slate-400">
|
||||
{t.expiry_days_at_entry != null ? `${t.expiry_days_at_entry}j` : t.horizon_days != null ? `${t.horizon_days}j` : '—'}
|
||||
</td>
|
||||
<td className="px-3 py-2 font-mono text-slate-300">{t.underlying}</td>
|
||||
<td className="px-3 py-2 font-mono">
|
||||
<div className="flex items-center gap-1">
|
||||
<span className={clsx(t.price_warning ? 'text-amber-300' : 'text-slate-300')}>{t.underlying}</span>
|
||||
{t.price_warning && (
|
||||
<span
|
||||
className="text-[8px] font-bold bg-amber-900/40 border border-amber-600/40 text-amber-400 rounded px-1 py-0.5 leading-none shrink-0"
|
||||
title={t.price_warning === 'no_price_data' ? 'Aucune donnée prix — monitoring impossible' : t.price_warning === 'no_entry_price' ? 'Prix d\'entrée manquant' : 'Prix live indisponible'}
|
||||
>
|
||||
⚠ {t.price_warning === 'no_price_data' ? 'NO DATA' : t.price_warning === 'no_entry_price' ? 'NO ENTRY' : 'NO LIVE'}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
<td className="px-3 py-2 text-right">
|
||||
<ScoreDelta entry={t.score_at_entry} latest={t.latest_score ?? t.score_at_entry} />
|
||||
</td>
|
||||
@@ -883,10 +895,10 @@ function TradeMtmSection({ days }: { days: number }) {
|
||||
) : <span className="text-slate-700 text-xs">—</span>}
|
||||
</td>
|
||||
<td className="px-3 py-2 text-right text-slate-600 whitespace-nowrap text-[11px]">{t.entry_date}</td>
|
||||
<td className="px-3 py-2 text-right font-mono text-slate-400 text-[11px]">
|
||||
<td className={clsx('px-3 py-2 text-right font-mono text-[11px]', t.price_warning === 'no_entry_price' || t.price_warning === 'no_price_data' ? 'text-amber-600' : 'text-slate-400')}>
|
||||
{t.entry_price != null ? t.entry_price.toFixed(2) : '—'}
|
||||
</td>
|
||||
<td className="px-3 py-2 text-right font-mono text-slate-300 text-[11px]">
|
||||
<td className={clsx('px-3 py-2 text-right font-mono text-[11px]', t.price_warning === 'no_live_price' || t.price_warning === 'no_price_data' ? 'text-amber-600' : 'text-slate-300')}>
|
||||
{t.current_price != null ? t.current_price.toFixed(2) : '—'}
|
||||
</td>
|
||||
<td className="px-3 py-2 text-right">
|
||||
|
||||
Reference in New Issue
Block a user