Standardized template for defining trading strategies with entry rules, exit rules, position sizing, risk parameters, and performance criteria
A standardized system for defining, documenting, testing, and managing trading strategies. This skill provides templates and tools that enforce discipline, enable reproducibility, and make strategies testable.
Trading without a written strategy framework leads to:
A strategy framework forces you to:
Every strategy must be documented using the standard template. The full copy-paste template is in references/strategy_template.md.
Identity
Name: SOL-EMA-Cross v1.0
Asset class: Solana tokens (top 50 by 24h volume)
Timeframe: Primary 1H, confirmation 4H
Style: Trend following
Edge Hypothesis: State what market inefficiency you are exploiting and why it exists.
Hypothesis: Solana mid-cap tokens exhibit momentum persistence
on the 1H timeframe due to retail herding behavior and low
institutional participation. EMA crossovers capture the
initiation of these trends.
Entry Rules: Specific, testable conditions combined with AND/OR logic.
def entry_signal(data: pd.DataFrame) -> bool:
"""All conditions must be True (AND logic)."""
ema_cross = data["ema_12"] > data["ema_26"] # EMA 12 crossed above 26
ema_rising = data["ema_26"].diff(3) > 0 # 26 EMA trending up
volume_ok = data["volume"] > data["vol_sma_20"] * 1.5 # Volume confirmation
regime_ok = data["adx"] > 20 # Trending regime
return ema_cross & ema_rising & volume_ok & regime_ok
Exit Rules: Every strategy needs multiple exit mechanisms.
| Exit Type | Method | Parameters |
|---|---|---|
| Stop Loss | ATR-based | 2.0 × ATR(14) below entry |
| Take Profit | Risk multiple | 3.0 × risk (3:1 R:R) |
| Trailing Stop | Chandelier | 3.0 × ATR(14) from highest high |
| Time Stop | Bar count | Close if flat after 20 bars |
| Signal Exit | EMA reversal | EMA 12 crosses below EMA 26 |
Position Sizing: Method and parameters. See the position-sizing skill for details.
risk_per_trade = 0.02 # 2% of portfolio
stop_distance_pct = 0.05 # 5% from entry (ATR-derived)
position_size = (portfolio * risk_per_trade) / stop_distance_pct
Risk Parameters: Portfolio-level guardrails. See the risk-management skill.
Max concurrent positions: 5
Risk per trade: 2% of portfolio
Daily loss limit: 5% of portfolio
Max drawdown halt: 15% — stop trading, review strategy
Correlated exposure limit: 10% (e.g., meme tokens combined)
Filters: Conditions that prevent entry even if signals fire.
def filters_pass(token: dict, market: dict) -> bool:
"""All filters must pass before entry is allowed."""
volume_ok = token["volume_24h"] > 500_000 # Min $500K volume
liquidity_ok = token["liquidity"] > 100_000 # Min $100K liquidity
age_ok = token["age_days"] > 7 # Not brand new
holders_ok = token["holder_count"] > 500 # Sufficient distribution
regime_ok = market["regime"] != "crisis" # No crisis regime
return all([volume_ok, liquidity_ok, age_ok, holders_ok, regime_ok])
Performance Criteria: When to continue, review, or retire.
Continue: Sharpe > 1.0, PF > 1.5, Win Rate > 40%, MDD < 20%
Review: Any metric degrades 25% from baseline
Retire: Rolling 30-day Sharpe < 0, or 3 consecutive losing months
Identify a market inefficiency and explain why it exists and why it might persist.
Good hypothesis: "New PumpFun tokens that reach 80+ SOL in bonding curve within 10 minutes have a 65% probability of graduating to Raydium, creating a predictable price spike at graduation."
Bad hypothesis: "SOL will go up." (Not specific, not testable, no edge identified.)
Write the full strategy document using the template in references/strategy_template.md. Every field must be filled. If you cannot fill a field, the strategy is not ready.
Test on historical data using vectorbt or equivalent. Requirements:
slippage-modeling skill)Run the strategy in simulation for at least 2 weeks (or 30 trades, whichever is longer).
Trade with minimum viable size (enough to cover fees, small enough to be inconsequential).
If small-live metrics match expectations (within 25% of backtest):
Ongoing performance tracking:
Stop using a strategy when:
Minimum thresholds before a strategy should be traded live:
| Metric | Trend Following | Mean Reversion | Scalping |
|---|---|---|---|
| Min Trades | 100 | 100 | 500 |
| Sharpe (OOS) | > 1.0 | > 1.0 | > 1.5 |
| Profit Factor | > 1.5 | > 1.5 | > 1.3 |
| Max Drawdown | < 20% | < 15% | < 10% |
| Win Rate | > 35% | > 55% | > 55% |
| Avg Win/Avg Loss | > 2.0 | > 1.0 | > 1.0 |
Detailed descriptions of each strategy type are in references/strategy_types.md.
| Skill | Integration |
|---|---|
vectorbt | Backtest strategy definitions programmatically |
pandas-ta | Compute technical indicators for entry/exit signals |
regime-detection | Market regime filters for strategy activation |
exit-strategies | Detailed exit rule implementation |
position-sizing | Position size calculation methods |
risk-management | Portfolio-level risk parameter enforcement |
slippage-modeling | Realistic execution cost estimation |
feature-engineering | ML feature computation from strategy signals |
references/strategy_template.md — Complete copy-paste strategy definition templatereferences/strategy_types.md — Detailed guide to each strategy type with parameters and examplesscripts/define_strategy.py — Interactive strategy definition tool with --demo modescripts/strategy_scorecard.py — Strategy evaluation scorecard with GO/REVIEW/NO-GO recommendations