$npx -y skills add SKE-Labs/agent-trading-skills --skill pullback-tradingEnter trends on price retracements to key levels. Use when trading with the trend, finding high R:R entries, or timing entries in established trends. Trend confirmation via EMA slope (no ADX).
| 1 | # Pullback Trading |
| 2 | |
| 3 | Enter established trends during temporary retracements for optimal risk/reward. |
| 4 | |
| 5 | ## Identification |
| 6 | |
| 7 | ### Pullback Levels |
| 8 | |
| 9 | | Level | Depth | Trend Strength | |
| 10 | | --- | --- | --- | |
| 11 | | 20/50 EMA | Dynamic | Strong (shallow) | |
| 12 | | Normalized retracement band | Shallow/moderate/deep | Calibrate by instrument and regime | |
| 13 | | Previous S/R flip | Variable | Structure-based | |
| 14 | |
| 15 | ### Entry Confirmation (require before entering) |
| 16 | |
| 17 | - Reversal candlestick pattern (hammer, engulfing) |
| 18 | - Momentum indicator turning in trend direction |
| 19 | - Volume decrease during pullback, increase on resumption |
| 20 | |
| 21 | ## Workflow |
| 22 | |
| 23 | ### 1. Confirm Trend on Higher Timeframe |
| 24 | |
| 25 | `get_indicators` returns one indicator per call — fetch each separately: |
| 26 | ``` |
| 27 | get_candles(symbol=<symbol>, exchange=<exchange>, interval=<htf_interval>, count=120) |
| 28 | get_indicators(indicator_code="ema_21", symbol=<symbol>, exchange=<exchange>, interval=<htf_interval>, count=120) |
| 29 | get_indicators(indicator_code="ema_50", symbol=<symbol>, exchange=<exchange>, interval=<htf_interval>, count=120) |
| 30 | ``` |
| 31 | |
| 32 | Then measure a five-bar EMA50 slope and normalize it by price or ATR. Five bars is a modeling choice, not a canonical horizon: |
| 33 | ``` |
| 34 | execute python3 -c "ema50=[<...>]; s=(ema50[-1]-ema50[-5])/ema50[-5]*100; print(f'htf_ema50_slope_pct={s:.3f}')" |
| 35 | ``` |
| 36 | |
| 37 | Define bullish and bearish stack rules plus slope thresholds from training data, then freeze them. Track bars since the trend trigger as a candidate maturity feature; do not label the first pullback highest probability without held-out evidence. |
| 38 | |
| 39 | ### 2. Get Price Data and Identify Pullback |
| 40 | |
| 41 | ``` |
| 42 | get_candles(symbol=<symbol>, exchange=<exchange>, interval=<primary_interval>, count=60) |
| 43 | ``` |
| 44 | |
| 45 | Use an objective swing rule for HH/HL or LH/LL structure. Measure retracement as a continuous percentage of the prior impulse and test bands; moving averages, prior swings, and Fibonacci coordinates are candidate reference levels. |
| 46 | |
| 47 | ### 3. Check Momentum at Pullback Level |
| 48 | |
| 49 | ``` |
| 50 | get_indicators(indicator_code="rsi_21", symbol=<symbol>, exchange=<exchange>, interval=<primary_interval>, count=20) |
| 51 | get_indicators(indicator_code="macd_fast", symbol=<symbol>, exchange=<exchange>, interval=<primary_interval>, count=20) |
| 52 | ``` |
| 53 | |
| 54 | Cite RSI / MACD as a **3-5 value progression** (latest value alone is folklore): |
| 55 | - Uptrend pullback example: `RSI21 47.8 (62.4 → 55.1 → 49.0 → 47.8)`. Define any RSI band and MACD sign rule before testing; neither 50 nor a Fibonacci ratio is a natural boundary. |
| 56 | - Downtrend pullback: mirror — RSI pulling up from low extreme toward 50, MACD histogram shrinking from negative toward zero but NOT crossing into positive. |
| 57 | |
| 58 | ### 4. Mark Entry Zone |
| 59 | |
| 60 | ``` |
| 61 | draw_chart_analysis(action="create", drawing={ |
| 62 | "type": "demand", |
| 63 | "points": [ |
| 64 | {"time": <pullback_start>, "price": <fib_38>}, |
| 65 | {"time": <pullback_end>, "price": <fib_62>} |
| 66 | ], |
| 67 | "options": {"text": "Pullback Entry Zone (38-62%)"} |
| 68 | }) |
| 69 | ``` |
| 70 | |
| 71 | ### 5. Report to Orchestrator |
| 72 | |
| 73 | Trend direction and strength, pullback depth (which Fib level), confirmation signals, entry level, stop below pullback low, target at previous swing high/low. |
| 74 | |
| 75 | ## Evidence and Validation |
| 76 | |
| 77 | - Treat the setup as a testable hypothesis, not a prediction. Define thresholds, entry, invalidation, and exit before evaluating outcomes. |
| 78 | - Calibrate on the same instrument, venue, session, and timeframe. Use closed candles and a held-out or walk-forward sample; record every variant tried. |
| 79 | - Include spread, fees, slippage, borrow or funding, partial fills, and latency. Reject the setup when net expectancy is not positive or depends on one narrow parameter. |
| 80 | - Return observed inputs, missing data, cost assumptions, entry, invalidation, exit, and a valid, watch, or no-trade status. |
| 81 | - Research basis: The [technical-analysis evidence review](https://papers.ssrn.com/sol3/Delivery.cfm/SSRN_ID603481_code17745.pdf?abstractid=603481) finds mixed results and recurring data-snooping and transaction-cost problems; calibrate pullback rules rather than treating ratios as natural laws. |
| 82 | |
| 83 | ## Key Rules |
| 84 | |
| 85 | - Require the predeclared trend and retracement conditions before evaluating an entry. |
| 86 | - Define reversal confirmation numerically and use a closed bar. |
| 87 | - Treat deeper retracement as a continuous risk feature, not a law at 61.8%. |
| 88 | - Put invalidation beyond the structural pullback extreme plus a calibrated volatility/tick buffer, then resize the position. |
| 89 | - Test trend age and pullback sequence out of sample rather than assuming the first is best. |
| 90 | - Compute EMA slope via `execute`; do NOT call ADX / DMI / Supertrend (API-billed, not in the free whitelist) |
| 91 | |
| 92 | ## Related Skills |
| 93 | |
| 94 | - **momentum-trading** -- pullbacks occur within momentum moves |
| 95 | - **breakout-trading** - |