joungmin
a479bccee6
feat: switch vol-lead strategy from 1h to 40min candles
...
Simulation sweep showed 40min candles outperform 1h:
- 40min: 91 trades, 48.4% WR, +119% PnL, -11% DD
- 60min: 65 trades, 50.8% WR, +88% PnL, -12% DD
Changes:
- strategy.py: fetch minute10, resample to 40min for vol spike detection
- LOCAL_VOL_CANDLES=7 (was LOCAL_VOL_HOURS=5, 5h/40min = 7 candles)
- monitor.py: ATR calculated from 40min candles
- ATR_CANDLES=7 (was 5, now 5h in 40min units)
- ATR_CACHE_TTL=2400s (was 600s, aligned to 40min candle)
- interval_sweep.py: new interval comparison tool (10/20/30/40/50/60min)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-02 14:52:48 +09:00
joungmin
324d69dde0
feat: volume-lead strategy with compounding, WF filter, and DB-backed simulation
...
- core/strategy.py: replace trend strategy with volume-lead accumulation
(vol spike + 2h quiet → signal, +4.8% rise → entry)
- core/trader.py: compound budget adjusts on both profit and loss (floor 30%)
- core/notify.py: add accumulation signal telegram notification
- ohlcv_db.py: Oracle ADB OHLCV cache (insert, load, incremental update)
- sim_365.py: 365-day compounding simulation loading from DB
- krw_sim.py: KRW-based simulation with MAX_POSITIONS constraint
- ticker_sim.py: ticker count expansion comparison
- STRATEGY.md: full strategy documentation
- .gitignore: exclude *.pkl cache files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-02 01:46:03 +09:00
joungmin
7c7fb08693
feat: replace trend strategy with volume-lead accumulation strategy
...
- strategy.py: rewrite should_buy() with volume-lead logic
- detect accumulation: vol spike + 2h quiet price → record signal_price
- entry: price rises ≥ TREND_AFTER_VOL% from signal_price
- signal reset: timeout (8h) or price drops below signal_price
- .env: add PRICE_QUIET_PCT=2.0, TREND_AFTER_VOL=4.8, SIGNAL_TIMEOUT_H=8.0
- vol_lead_sim.py: add parameter sweep 0.5~5.0% + fine sweep 4.0~5.0%
Backtest result (9 tickers, 2026-01-15~): +4.8% threshold
26 trades | 69% win rate | +73.38% cumulative (vs A 33 trades 45% +24.25%)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-02 00:22:20 +09:00
joungmin
16b4c932a2
feat: bear block, trend-continuation entry, partial TP backtest
...
1. daemon/runner.py: skip scan entirely in bear regime
- calls get_regime() at start of each scan loop
- logs bear block with score before sleeping
2. core/strategy.py: trend-continuation entry filter
- check_trend_6h(): 6h price trend >= 1% (rejects flash spikes)
- 15-min confirmation watchlist (_watchlist dict)
- should_buy() adds watchlist to existing 12h+regime+momentum logic
- CONFIRM_SECONDS env var (default 900 = 15min)
- TREND_6H_MIN_PCT env var (default 1.0%)
3. backtest.py: partial take-profit scenario comparison (--tp-cmp)
- simulate(): partial_tp_pct / partial_tp_ratio params
- blended pnl = ratio * partial_pnl + (1-ratio) * remaining_pnl
- main_tp_cmp(): 3 scenarios A/B/C (none / +5% 50% / +3% 50%)
- result: partial TP reduces cumulative return (-56% → -63%)
big winners carry the strategy; trimming them hurts expected value
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-01 10:51:02 +09:00
joungmin
83a229dd26
feat: add market regime filter and compound reinvestment
...
- Add market_regime.py: BTC/ETH/SOL/XRP weighted 2h trend score
Bull(≥+1.5%) / Neutral / Bear(<-1%) regime detection with 10min cache
- strategy.py: dynamic TREND/VOL thresholds based on current regime
Bull: 3%/1.5x, Neutral: 5%/2.0x, Bear: 8%/3.5x
- price_collector.py: always include leader coins in price history
- trader.py: compound reinvestment (profit added to budget, floor at initial)
- notify.py: regime info in hourly report, P&L icons (✅ /❌ , 💚 /🔴 )
- main.py: hourly status at top-of-hour, filter positions held 1h+
- backtest.py: timestop/combo comparison modes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-01 10:14:36 +09:00
joungmin
60e739d18b
fix: use local 5h volume baseline instead of 23h global average
...
23h average includes high-volume daytime periods, causing false negatives
at early morning hours. Now compare last 1h candle against the previous
5h local average (same time-of-day context) with 1.2x multiplier.
Also add momentum failure debug logs to show exact reason for rejection.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-01 05:46:25 +09:00
joungmin
5df56a933e
feat: use 60min volume, add KRW P&L log, relax re-entry after win
...
- strategy: replace daily volume check with 60-min candle volume
(daily volume at 5am is tiny -> BTC/ETH never matched; now uses
last 1h candle vs previous 23h avg × 2)
- trader: log actual KRW net profit and fee on every sell
- trader: skip re-entry +1% block when last trade was a win
(allow re-entry on new trend signal even below last sell price)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-01 05:38:37 +09:00
joungmin
0b264b304c
feat: add backtest module with DB cache and scenario comparison
...
Backtest improvements:
- Add backtest.py with Oracle DB-backed OHLCV cache (no repeated API calls)
- Add backtest_trades table to cache simulation results by params hash
(same params -> instant load, skip re-simulation)
- Add walk-forward scenario comparison (--walkforward-cmp)
- Add trend ceiling filter (--trend-cmp, max gain threshold)
- Add ticker win-rate filter (--ticker-cmp, SQL-based instant analysis)
- Precompute daily_features once per data load (not per scenario)
Live bot fixes:
- monitor: add hard stop-loss from buy price (in addition to trailing)
- strategy: fix re-entry condition to require +1% above last sell price
- price_collector: add 48h backfill on startup for trend calculation
- main: call backfill_prices() at startup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-28 23:28:27 +09:00
joungmin
80ab004eba
feat: replace volatility breakout with DB-backed real-time trend check
...
- price_history table on Oracle ADB stores prices every 10 minutes
- check_trend(): current price vs N hours ago (default 1h, +3% threshold)
- check_momentum(): unchanged (MA20 + 2x volume still applies)
- Ticker list cached 5 minutes to avoid 429 rate limits
- Collector starts 30s after boot to avoid simultaneous API calls
- Configurable: TREND_HOURS, TREND_MIN_GAIN_PCT in .env
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-28 11:26:26 +09:00
joungmin
83bd51117f
feat: initial upbit auto-trader implementation
...
Strategy C: volatility breakout (Larry Williams K=0.5) AND momentum
(MA20 + 2x volume surge) must both trigger for a buy signal.
Hard rules:
- Trailing stop: sell when price drops -10% from peak
- Max budget: 1,000,000 KRW total, up to 3 positions (333,333 KRW each)
- Scan top 20 KRW tickers by 24h trading volume every 60s
- Monitor positions every 10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-28 10:20:02 +09:00