After the Signal Fires
What the engine does once entry conditions evaluate to TRUE.
Most strategy documentation covers:
- how to design the entry signal
- how to define the edge
- how to calculate stops, TPs, and sizes from research
But what actually happens after the signal fires — at runtime — is a separate, critical process.
This document explains the mechanical execution pipeline used once your entry conditions trigger.
This is not where we decide whether a trade “has edge.” That was done in research.
This is where we:
- Instantiate the strategy-defined stop distance
- Instantiate the strategy-defined take-profit structure
- Compute the position size from MLPT
- Place the order
- Lock in the initial risk
- Then follow strategy-defined behavior for the rest of the trade
Basic Flow
┌─────────────────────────────┐ │ Strategy Runtime Engine │ └─────────────┬───────────────┘ │ ▼ ┌──────────────────────┐ │ Entry Conditions? │ │ (signal == TRUE?) │ └───────┬──────────────┘ │ yes ▼ ┌──────────────────────────────┐ │ 1. get_stop_distance() │ │ • Uses strategy research: │ │ - drawdown distributions │ │ - min hold horizon │ │ - persistence behavior │ │ - regime state │ └───────────┬──────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 2. calc_take_profit_points()│ │ • Uses: │ │ - stop_distance │ │ - expected min hold │ │ - time until edge gone │ │ - convexity / R-multiple │ └───────────┬──────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 3. calc_position_size() │ │ • Inputs: │ │ - MLPT (max_loss_usd) │ │ - stop_distance_usd │ │ • Output: position_size_sol │ └───────────┬──────────────────┘ │ ▼ ┌──────────────────────────────┐ │ 4. submit_order() │ │ • entry_price │ │ • position_size_sol │ │ • stop_loss │ │ • tp_levels │ └───────────┬──────────────────┘ │ ▼ ┌─────────────────────┐ │ Trade is LIVE │ └─────────┬───────────┘ │ ┌────────────────┴────────────────┐ │ │ ▼ ▼ ┌──────────────────────┐ ┌─────────────────────────┐ │ v1 (KISS baseline) │ │ Advanced behavior │ └──────────────────────┘ │ (strategy v2+ only) │ │ • SL fixed └─────────────────────────┘ │ • TP(s) fixed │ • NEVER widen SL │ │ • position size fixed │ • MAY tighten SL when │ │ • no trailing │ edge statistically │ │ • no dynamic TPs │ collapses │ │ │ • MAY adjust TP2/TP3 │ │ (no runtime modifications) │ per researched rules │ └─────────────────────────────────┴─────────────────────────┘
1. The Signal Fires (Entry Conditions = TRUE)
Your strategy’s Boolean entry logic evaluates to true.
At this moment:
- The strategy’s edge is assumed (because the system passed research).
- We are not re-analyzing the viability of the trade.
- We are not recalculating the edge from scratch.
- We are not checking “is this a good trade?”
Your strategy was only deployed because it already has positive expectancy.
So the engine goes to work.
2. Instantiate the Strategy-Defined Stop Distance
Every strategy includes a rule/function:
stop_distance_usd = get_stop_distance(strategy_params, current_market_state)
This rule was created during research using:
- drawdown distribution
- persistence behavior
- expected minimum hold horizon
- volatility regime models
- structural characteristics of the signal
At runtime, the engine:
- evaluates only the inputs relevant to this specific entry
- computes the USD-native stop distance
- prepares the exact stop price level
This does not re-decide whether the trade is valid.
It simply creates the stop price for this instance.
3. Instantiate the Strategy-Defined Take Profit Levels
Next, the engine calls:
tp_levels = calc_take_profit_points(
stop_distance_usd,
expected_minimum_hold_horizon,
time_until_edge_gone
)
This generates:
- TP1 (never moved in strategy v1)
- TP2/TP3/etc (fixed or rule-based)
- optional trailing behavior (strategy v2+)
The take-profit structure is derived from:
- reward distribution
- time-to-edge-decay
- convexity
- continuation probabilities
Again: these rules are defined in research — the engine simply applies them.
4. Compute Position Size (LAST)
Once stop and TP structure exist, the engine determines size:
position_size_sol = calc_position_size(
max_loss_usd = MLPT,
stop_distance_usd
)
Position size must always be the final step, because:
- it depends on the stop
- stop depends on the strategy’s research
- the entire risk budget flows downstream
This ensures:
- MLPT is respected
- risk per trade is stable
- volatility is respected
5. The Order Is Placed (Commit Phase)
After computing SL/TP/size:
submit_order(entry_price, position_size_sol, stop_distance_usd, tp_levels)
At this moment:
- your risk is fixed
- your SL is fixed
- your TP1 is fixed
- your position size is fixed
- the trade is live
This is the commit phase — everything afterward follows the post-entry rules.
6. After Entry: What Cannot Change
Once the trade is live:
❌ You may not widen the stop
Because:
- MLPT is immutable
- research assumed a specific stop envelope
- widening destroys the risk model
- widening destroys the statistical assumptions
- widening exposes the account to nonlinear health decay
Stop widening turns a quant strategy into discretionary gambling.
7. After Entry: What May Change (Advanced Strategies Only)
There are two adjustments that might be allowed in more advanced strategy versions:
The basic idea is that you do additional distribution calculations after new information is gathered (after each bar) See Entry Conditions vs. Statistical-Edge Conditions for more info on how to do this.
A. Stop tightening
Example: After 6 bars, if continuation probability drops to extremely low values, tightening the stop becomes statistically correct.
However:
- this must be rule-based
- this must be researched
- this must avoid premature exits
This is a strategy v2/v3 feature, not default behavior.
B. Allowing later TPs (not TP1) more room
Example: If persistence decays but slope remains positive, the engine may allow:
- TP2/TP3 to float deeper into the reward envelope
- dynamic trailing based on momentum decay
- volatility expansion continuation models
But again:
- this is advanced
- this must be tested
- this must be based on distribution shifts
Baseline strategies should not do this.
8. KISS Philosophy for Strategy Version 1
For a first-generation strategy:
- stop is fixed
- TP1 is fixed
- position size is fixed
- no trailing
- no dynamic tightening
- no dynamic extension of TP2/TP3
Why?
- reduces moving parts
- maximizes consistency
- preserves research integrity
- simplifies risk modeling
- avoids emotional intervention
- avoids spurious mid-trade re-optimization
Once the strategy has 200–500 real trades, then the edge-decay model can be extended.
9. Summary of the Runtime Execution Flow
if entry_conditions == true:
stop = get_stop_distance()
tps = calc_take_profit_points(stop)
size = calc_position_size(MLPT, stop)
submit_order(stop, tps, size)
Once live:
- ❌ stop never widens
- ✔ stop may tighten (advanced only)
- ✔ later TPs may adjust (advanced only)
- ✔ but TP1 is fixed in v1
The trade exists because the strategy already has edge. Runtime is about materializing that edge in the form of SL/TP/size — not rediscovering it.