o
    7W«j÷  ã                   @   sÎ   d dddddœddg g de e d	d
dœ	e dddddddœdddddddœ	i dd“dd“dddddœ“dd “d!d"“d#d$“d%d&“d'd(“d)d*“d+d“d,d-“d.d/“d0d1“d2e“d3d“d4d5“d6dd7œd8d9d:dd;œd<œ d=S )>aG  config.json for the new standalone breakout project (screener/trade), built piece by piece alongside screener/premarket's sip_bot -- see docs/breakout_bot_design_conversation.pdf for the full design. This file has NO runtime relationship to screener/premarket/config.json; the two are read by completely separate processes with separate .env credentials (currently the same paper account, but nothing here imports or reads the other project's files). Only the scanner piece is implemented so far -- monitor/stream/entry/exit sections will be added as each piece is built and checked.zAmerica/New_Yorkz09:30:00z16:00:00a¾  market_open_time/market_close_time are needed by market_time.py's minutes_since_open()/session_length_minutes(), which smart_engine.py uses to pace-normalize RVOL (cumulative volume so far vs. how much of today's session has elapsed) -- same technique sip_bot's fast_entry_gate.py already uses. No premarket_scan_time/no_new_entries_after/force_liquidate_time yet -- those belong to a future monitor.py piece, not needed by anything built so far.)ÚtimezoneÚmarket_open_timeÚmarket_close_timeÚ_noteg      @g      .@i ¡ é   a#  Same universe filters as the breakout_bot design doc calls for (Part II section 2), which are themselves the same filters sip_bot already uses -- price $5-$15, 500k avg daily volume floor, OTC/ETF/leveraged-inverse exclusion, max-5-syllable names. No min_daily_atr_pct floor here (unlike sip_bot's config) -- the breakout scanner is deliberately a pure continuous score with no hard reject gates beyond universe membership, per the design doc's philosophy that candidate_score answers 'which stocks deserve attention' not 'which stock will go up'.)	Ú	price_minÚ	price_maxÚexclude_symbolsÚinclude_only_symbolsÚmin_avg_daily_volumeÚexclude_etfs_and_fundsÚexclude_leveraged_inverseÚmax_name_syllablesr   é   é   é   )Úrelative_volumeÚpremarket_volumeÚgap_or_price_movementÚpremarket_price_strengthÚdistance_to_resistanceg      @i † g      $@g       @a6  Weights are the design doc's own explicit split (Part II section 3: 30/20/20/15/15). The four *_full_credit* thresholds are first-cut placeholders carried over from screener/premarket's breakout_scanner.py shadow-run (2026-09-16) -- tune once there are a few days of this project's own scanner output to compare against real outcomes. gap_or_price_movement and premarket_price_strength are scored SYMMETRICALLY (clamped to [-1, 1], not [0, 1]) so an actively declining stock scores worse than a flat one, not the same -- carried over from the same 2026-09-16 bugfix.)	ÚenabledÚtop_candidate_countÚweightsÚrvol_full_credit_multipleÚpremarket_volume_full_creditÚgap_full_credit_pctÚprice_strength_full_credit_pctÚ#resistance_full_credit_distance_pctr   r   a_  [FEATURE 2026-09-16] The 3-stage live entry decision engine (smart_engine.py) -- Stage 1 'is this worth trading right now' (continuously re-checked, resets Stage 2's timer on any hard disqualifier), Stage 2 'is momentum actually developing' (an 18-20s continuous-hold persistence timer, same mechanic and same real-world-vetted value as sip_bot's fast_entry_gate.py), Stage 3 'is there room to run' (checked fresh the instant Stage 2's hold completes -- nearest resistance above price vs. an ATR-based stop, gated on a minimum reward:risk ratio). Deliberately takes already-computed bars/quote/resistance levels as input and does no I/O itself -- it doesn't know or care whether its inputs came from a live stream, a replay, or a manual test, which is what makes it safe to wire into whatever the future live-monitoring loop looks like without changing this file.Ú
atr_periodé   Útrendgš™™™™™©?g      Ð?a•  The 'no one rule fits all' piece: instead of one fixed flat_slope_threshold_pct for every symbol (sip_bot's intraday_health.py's real gap -- it computes ATR per symbol but never uses it to scale anything), the flat/trend boundary here scales with THIS symbol's own ATR%. A naturally quiet, low-ATR grinder (like IIIV, the 2026-09-16 whipsaw case) gets a proportionally tighter band than a naturally violent mover, so a slow grind higher reads as 'flat-but-fine' instead of tripping the same STALE-style read a real reversal would. min_flat_threshold_pct is a floor so an extremely low-ATR name doesn't get an effectively-zero (all-noise-counts-as-a-trend) band.)Úmin_flat_threshold_pctÚflat_threshold_atr_fractionr   Ústructure_lookback_barsé   Úpullback_max_retrace_pctg      I@Úmax_spread_pctg      ð?Úmin_volume_pace_ratiogš™™™™™Ù?Ú_note_min_volume_pace_ratioaB  Same value and same technique as sip_bot's fast_entry_gate.py's min_volume_pace_ratio (real-volume-so-far / prior-day-total, divided by how much of today's session has elapsed) -- carried over as a starting point since it's already been live-validated there; re-tune independently once this project has its own real fills.Úpersistence_secondsé   Úmax_evaluation_gap_secondsÚ_note_persistencezÂSame values as sip_bot's fast_entry_gate.py (18s hold, 15s max gap before a stale 'since' timestamp is discarded) -- reused as a starting point, not yet independently validated for this project.Úatr_multiplier_stopg333333ó?Úmin_reward_risk_ratiog      ø?Úclear_air_requires_targetÚclear_air_atr_target_multiplierÚ_note_stage3a­  atr_multiplier_stop=1.2 matches sip_bot's own atr_multiplier_initial (risk_manager.py) for consistency, not independently tuned yet. clear_air_requires_target=false means: if price has already cleared every known resistance level (premarket high, previous-day high, 20-day high, today's own session high), Stage 3's reward:risk gate is SKIPPED entirely rather than inventing a synthetic target -- 2026-09-16 decision: a genuine no-ceiling-in-sight breakout is often the strongest kind of trade, and demanding a resistance level to measure against would filter those out. Flip to true (and tune clear_air_atr_target_multiplier) if that proves too permissive once there's real fill data.zdata/candidates)Úcandidates_dirÚretention_daysÚlogsÚINFOÚ	trade_bot)Úlog_dirÚlevelÚfilename_prefixr3   )r   ÚscheduleÚuniverseÚscannerÚsmart_engineÚdata_storageÚloggingN)ÚtrueÚfalse© rB   rB   úconfig.jsonÚ<module>   sš   ü÷ûñÿþýýø	÷
öõôóòñðïîíìþü
¼