Resolved source: stimulir/trade-pool Eval job_id: trade_pool_poolside_laguna_xs.2_20260530_112447_9949ef5b eval_dataset is not set, falling back to train dataset Processing 4 groups (4 total rollouts): 0%| | 0/4 [00:00 │ │ │ │ │ zscore_20, bb_lo, bb_mid, │ SMA_20, MACD > MACD_signal │ │ │ │ │ bb_hi, ret_1, vol_20 │ - Avoid: Price too far from │ │ │ │ │ │ Bollinger Mid, high │ │ │ │ │ Hard rules: │ volatility, thin liquidity │ │ │ │ │ - No imports, no IO, no future │ │ │ │ │ │ data. You only get the current │ │ │ │ │ │ bar's features. │ │ │ │ │ │ - Favor capital protection: │ ```python │ │ │ │ │ control drawdown, avoid being │ def strategy(features, │ │ │ │ │ all-in blindly. │ position): │ │ │ │ │ - Your strategy is scored on a │ # Extract features │ │ │ │ │ HELD-OUT window and must beat │ close = features['close'] │ │ │ │ │ buy-and-hold. │ sma_10 = │ │ │ │ │ │ features['sma_10'] │ │ │ │ │ Trading discipline distilled │ sma_20 = │ │ │ │ │ from 618 real prior trading │ features['sma_20'] │ │ │ │ │ decisions (94 BUY, 489 WATCH, │ sma_50 = │ │ │ │ │ 35 AVOID): │ features['sma_50'] │ │ │ │ │ │ ema_12 = │ │ │ │ │ Patterns that earned a BUY │ features['ema_12'] │ │ │ │ │ (translate these into your │ ema_26 = │ │ │ │ │ strategy's entry logic): │ features['ema_26'] │ │ │ │ │ - "Post-dip curl": a 24h drop │ rsi_14 = │ │ │ │ │ followed by a 1h recovery with │ features['rsi_14'] │ │ │ │ │ a strong short-term buy/sell │ macd = features['macd'] │ │ │ │ │ ratio (>1.5). Enter on the │ macd_signal = │ │ │ │ │ curl, not the dip. → buy when │ features['macd_signal'] │ │ │ │ │ recent return turns up after a │ macd_hist = │ │ │ │ │ drawdown and momentum (rsi │ features['macd_hist'] │ │ │ │ │ rising from oversold, │ zscore_20 = │ │ │ │ │ macd_hist turning positive) │ features['zscore_20'] │ │ │ │ │ confirms. │ bb_lo = features['bb_lo'] │ │ │ │ │ - "Healthy momentum │ bb_mid = │ │ │ │ │ continuation": positive 1h AND │ features['bb_mid'] │ │ │ │ │ 24h change with buy pressure │ bb_hi = features['bb_hi'] │ │ │ │ │ and │ ret_1 = features['ret_1'] │ │ │ │ │ volume/liquidity > 1. → │ vol_20 = │ │ │ │ │ trend-follow when sma_10 > │ features['vol_20'] │ │ │ │ │ sma_20 and macd > macd_signal. │ │ │ │ │ │ - Size up only with liquidity │ # Initialize new position │ │ │ │ │ + volume backing the move; │ new_position = position │ │ │ │ │ size down when volatility is │ │ │ │ │ │ high. │ # Capital protection: │ │ │ │ │ │ avoid overexposure when │ │ │ │ │ Conditions that earned │ already up significantly │ │ │ │ │ WATCH/AVOID (translate into │ if ret_1 > 0.05: # │ │ │ │ │ your exits and risk limits): │ Already up 5% on the hour │ │ │ │ │ - Already +30% on the day → │ return min(position, │ │ │ │ │ entry timing is poor; do not │ 0.3) # Reduce exposure │ │ │ │ │ chase. → avoid full long when │ │ │ │ │ │ ret_1 is extremely high or │ # Avoid full long when │ │ │ │ │ price is far above bb_mid. │ price is far above middle │ │ │ │ │ - Volume/liquidity < 1.0 or │ Bollinger Band │ │ │ │ │ thin liquidity → lower │ if close > bb_mid * 1.03: │ │ │ │ │ conviction; reduce exposure. │ # 3% above BB mid │ │ │ │ │ - Sell-heavy short-term flow │ return max(position, │ │ │ │ │ after entry → cut quickly; │ -0.2) # Cap long exposure │ │ │ │ │ don't wait for a vague │ │ │ │ │ │ recovery. │ # Base position sizing │ │ │ │ │ │ inversely related to │ │ │ │ │ Capital-protection rules │ volatility │ │ │ │ │ (every BUY required these): │ vol_factor = max(0.5, 1.0 │ │ │ │ │ - Always define a stop below │ - vol_20) # Reduce size when │ │ │ │ │ entry and a target above; │ volatility high │ │ │ │ │ favor reward:risk >= 2:1. │ │ │ │ │ │ - Protect capital first: │ # Post-dip curl pattern: │ │ │ │ │ control drawdown over chasing │ RSI coming back from oversold │ │ │ │ │ upside. │ with MACD improvement │ │ │ │ │ - Don't average down losers; │ dip_recovery = False │ │ │ │ │ don't let a winner round-trip │ if rsi_14 < 30 and │ │ │ │ │ — tighten when flow weakens. │ macd_hist > 0: # Oversold │ │ │ │ │ │ with positive momentum │ │ │ │ │ │ dip_recovery = True │ │ │ │ │ │ │ │ │ │ │ user: Token: NOCK │ # Healthy momentum: short │ │ │ │ │ In-sample bars available: 600 │ and medium term trend │ │ │ │ │ Recent closes (last 30): │ confirmation │ │ │ │ │ [0.024502, 0.02227, 0.022973, │ momentum_ok = sma_10 > │ │ │ │ │ 0.022138, 0.022407, 0.02138, │ sma_20 and macd > macd_signal │ │ │ │ │ 0.02204, 0.025153, 0.023984, │ │ │ │ │ │ 0.025721, 0.024264, 0.023896, │ # Trend following with │ │ │ │ │ 0.023152, 0.022478, 0.023024, │ moving averages │ │ │ │ │ 0.022491, 0.022522, 0.02344, │ trend_up = ema_12 > ema_26 │ │ │ │ │ 0.023711, 0.022644, 0.022412, │ and sma_20 > sma_50 │ │ │ │ │ 0.022769, 0.02276, 0.023428, │ │ │ │ │ │ 0.022117, 0.021182, 0.020521, │ # Entry signals │ │ │ │ │ 0.019539, 0.018417, 0.017665] │ if dip_recovery and │ │ │ │ │ │ momentum_ok: │ │ │ │ │ Write a `strategy(features, │ # Post-dip entry with │ │ │ │ │ position)` function. Use │ strong confirmation │ │ │ │ │ indicators like RSI (rsi_14), │ new_position = min(0.6 │ │ │ │ │ MACD │ * vol_factor, 0.6) │ │ │ │ │ (macd/macd_signal/macd_hist), │ elif trend_up and │ │ │ │ │ moving averages (sma_*/ema_*), │ momentum_ok and zscore_20 < │ │ │ │ │ z-score (zscore_20), Bollinger │ 1.5: │ │ │ │ │ bands (bb_*), and volatility │ # Trend continuation │ │ │ │ │ (vol_20). Return a target │ with reasonable valuation │ │ │ │ │ position in [-1, 1]. │ new_position = min(0.4 │ │ │ │ │ │ * vol_factor, 0.4) │ │ │ │ │ │ elif zscore_20 < -1.0 and │ │ │ │ │ │ macd_hist > -0.001: │ │ │ │ │ │ # Mean reversion setup │ │ │ │ │ │ near lower Bollinger Band │ │ │ │ │ │ new_position = min(0.3 │ │ │ │ │ │ * vol_factor, 0.3) │ │ │ │ │ │ else: │ │ │ │ │ │ # Reduce exposure if │ │ │ │ │ │ no clear signal │ │ │ │ │ │ new_position = │ │ │ │ │ │ position * 0.7 │ │ │ │ │ │ │ │ │ │ │ │ # Exit management: reduce │ │ │ │ │ │ position if momentum weakens │ │ │ │ │ │ if macd_hist < 0 and │ │ │ │ │ │ position > 0.2: │ │ │ │ │ │ new_position = │ │ │ │ │ │ max(new_position, -0.1) # │ │ │ │ │ │ Quick exit │ │ │ │ │ │ elif rsi_14 > 70 and │ │ │ │ │ │ position > 0.3: │ │ │ │ │ │ new_position = │ │ │ │ │ │ max(new_position, 0.0) # Take │ │ │ │ │ │ profits on overbought │ │ │ │ │ │ │ │ │ │ │ │ # Ensure position bounds │ │ │ │ │ │ new_position = max(-1.0, │ │ │ │ │ │ min(1.0, new_position)) │ │ │ │ │ │ │ │ │ │ │ │ return new_position │ │ │ │ │ │ ``` │ │ │ │ │ │ │ │ │ │ └────────────────────────────────┴────────────────────────────────┴────────┘ │ ╰──────────────────────────────────────────────────────────────────────────────╯ --- All --- Rewards: reward: avg - 0.495, std - 0.328 r1: [0.915, 0.587, 0.0, 0.478] reward_sharpe: avg - 0.448, std - 0.320 r1: [0.873, 0.577, 0.0, 0.344] reward_beats_benchmark: avg - 0.250, std - 0.433 r1: [1.0, 0.0, 0.0, 0.0] reward_drawdown: avg - 0.652, std - 0.381 r1: [0.943, 0.878, 0.0, 0.788] reward_exposure: avg - 0.750, std - 0.433 r1: [1.0, 1.0, 0.0, 1.0] reward_cost: avg - 0.355, std - 0.206 r1: [0.482, 0.5, 0.0, 0.438] reward_valid: avg - 0.750, std - 0.433 r1: [1.0, 1.0, 0.0, 1.0] num_turns: avg - 1.000, std - 0.000 r1: [1.0, 1.0, 1.0, 1.0] Info: is_truncated: avg - 0.000, std - 0.000 stop_conditions: max_turns_reached: 1.000 Timing: total min - 6s, mean - 15s, max - 29s setup min - 0ms, mean - 0ms, max - 0ms generation min - 6s, mean - 15s, max - 29s model min - 6s, mean - 15s, max - 29s env min - 0ms, mean - 0ms, max - 0ms scoring min - 1ms, mean - 41ms, max - 55ms overhead min - 0ms, mean - 0ms, max - 1ms Usage: input_tokens (avg): 1061.500 output_tokens (avg): 2066.000 final_input_tokens (avg): 1061.500 final_output_tokens (avg): 2066.000 Performance: event_loop_lag: mean=7ms, p99=3ms, max=2s (n=335)