Alpha Research1
Multi-Layer Confluence Strategy (MLC)
Systematic Intraday Trading System
MCX Crude Oil Futures
PART 1: STRATEGY OVERVIEW
What Is This Strategy?
Multi-Layer Confluence (MLC) is a systematic intraday trading strategy that requires multiple analytical layers to align before taking a trade. Think of it as a layered cake - each layer must be present for a valid setup.
The Layered Architecture (Read Top-Down)
┌─────────────────────────────────────────────────────────────┐ │ │ │ LAYER 1: MULTI-TIMEFRAME ANALYSIS ◄── THE FOUNDATION │ │ 5 timeframes analyzed for trend alignment │ │ Daily → 4H → 1H → 15M → 5M │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ LAYER 2: MARKET STATE ANALYSIS │ ← Context │ 7 algorithms: Railroad, Creeper, Phase, BOS, etc. │ │ Calculates penalties and bonuses │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ LAYER 3: SETUP QUALITY GRADING │ ← Scoring │ 5-factor weighted scoring → Assigns grade A+ to F │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ LAYER 4: HARD FILTERS ◄── GATE (Pass/Fail) │ │ • Direction: MA21 slope must match trade direction │ │ • Grade: D/F grades blocked (A+/A/B/C can trade) │ │ • Hours: Block hours 9, 22, 23 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ LAYER 5: ENTRY TECHNIQUE │ ← Final trigger │ Price must be near 21-period MA (±25 points) │ │ │ └─────────────────────────────────────────────────────────────┘
Key Insight: A trade only happens when ALL layers align. MTF Analysis is the foundation - without trend alignment across timeframes, nothing else matters.
Instrument Details
| Parameter | Value |
|---|---|
| Instrument | MCX Crude Oil Futures |
| Lot Size | 100 barrels |
| Tick Value | 1 point = Rs 100 per lot |
| Market Hours | 9:00 AM - 11:30 PM IST |
| Strategy Hours | 10:00 AM - 9:59 PM IST (blocks hours 9, 22, 23) |
Backtest Results
| Metric | Value |
|---|---|
| Period | 19 months |
| Total Trades | 7,534 |
| Win Rate | 57.6% |
| Profit Factor | 1.20 |
| Initial Capital | Rs 1.00 Lakhs |
| Final Value | Rs 26.48 Lakhs |
| Total Return | 2,548% |
| Total Costs | Rs 5.93 Lakhs (brokerage + taxes) |
| Avg Holding Period | 2.43 hours |
Trade Distribution
| Category | Count | Percentage |
|---|---|---|
| By Setup Grade | ||
| A+ Grade | 3,457 | 45.9% |
| A Grade | 551 | 7.3% |
| C Grade | 3,526 | 46.8% |
| By Direction | ||
| SHORT | 6,024 | 80.0% |
| LONG | 1,510 | 20.0% |
| By Exit Reason | ||
| Stop (including trailing) | 5,444 | 72.3% |
| Target | 1,716 | 22.8% |
| Timeout (end of day) | 374 | 5.0% |
PART 2: THE EDGE (Why This Works)
Core Philosophy
The edge comes from requiring multiple independent confirmations before trading. Each layer filters out bad trades:
| Layer | What It Filters Out |
|---|---|
| 1. MTF Analysis | Counter-trend trades, choppy markets |
| 2. Market State | Dangerous conditions (creeper moves, institutional fights) |
| 3. Quality Grading | Scores the setup, adjusts position size |
| 4. Hard Filters | Wrong direction, very low grades (D/F), blocked hours |
| 5. Entry Technique | Chasing price far from value (MA21) |
The Math
If each layer has 70% accuracy independently:
- Single layer: 70% edge
- 2 layers: 70% × 70% = 49% of trades pass, but higher quality
- 5 layers: Only the best setups survive all filters
Result: Fewer trades, but each trade has multiple confluences supporting it.
PART 3: LAYER 1 - MULTI-TIMEFRAME ANALYSIS (The Foundation)
THIS IS THE FOUNDATION - Everything else builds on top of MTF alignment. If timeframes disagree, we don't trade.
The 5 Timeframes
| Timeframe | Role | Weight |
|---|---|---|
| Daily (1D) | Overall market bias | Highest |
| 4-Hour (4H) | Primary trend direction | High |
| 1-Hour (1H) | Trend confirmation | Medium |
| 15-Minute (15M) | Entry timing context | Lower |
| 5-Minute (5M) | Execution timeframe | Lowest |
What We Analyze Per Timeframe
For each of the 5 timeframes, the system calculates:
| Analysis | Description | Source |
|---|---|---|
| MA21 Value | 21-period Moving Average | trend_analysis_core.py |
| MA21 Slope | Rising/Flat/Declining | trend_analysis_core.py |
| MA200 Value | 200-period Moving Average | trend_analysis_core.py |
| Price vs MA21 | Above/Below/At the MA | trend_analysis_core.py |
| Trend Direction | UP/DOWN/NEUTRAL | trend_analysis_core.py |
MTF Alignment Score
For each timeframe: 1. Determine trend direction (UP/DOWN/NEUTRAL) 2. Check if aligned with trade direction 3. Apply timeframe weight 4. Sum weighted alignment scores Example (LONG trade): Daily: UP (aligned) × 1.00 weight = 1.00 4H: UP (aligned) × 0.86 weight = 0.86 1H: UP (aligned) × 0.72 weight = 0.72 15M: DOWN (not aligned) × 0.58 weight = 0.00 5M: UP (aligned) × 0.44 weight = 0.44 ───────────────────────────────────────────── Total MTF Score: 3.02 / 3.60 = 83.9% aligned
Why MTF Matters
| Scenario | MTF Alignment | Action |
|---|---|---|
| All 5 timeframes aligned | 100% | High conviction trade |
| 4 of 5 aligned | ~85% | Trade with normal size |
| 3 of 5 aligned | ~70% | Proceed with caution |
| 2 or fewer aligned | <60% | Reduced quality score |
PART 4: LAYER 2 - MARKET STATE ANALYSIS
The 7 Market State Algorithms
The system runs 7 independent algorithms to understand current market context:
| # | Algorithm | What It Detects | Impact |
|---|---|---|---|
| 1 | Railroad Tracks | Strong momentum bars in sequence | +15% bonus |
| 2 | Creeper Move | Slow grinding trend (dangerous) | -50% penalty |
| 3 | Two-Day Trend | Trend visible on Daily for 2+ days | Required for A+ |
| 4 | Phase Analysis | Accumulation/Distribution/Markup/Markdown | Phase mismatch = -25% |
| 5 | Institutional Activity | Big player accumulation/distribution | Fight = 0.7× multiplier |
| 6 | Break of Structure (BOS) | Key level breaks | Affects stop placement |
| 7 | Volatility Regime | High/Normal/Low volatility | Adjusts expectations |
Penalty System
| Condition | Penalty | Rationale |
|---|---|---|
| Creeper Move Detected | -50 points | Slow trends often reverse suddenly |
| MA Struggle (price fighting MA) | -30 points | Indecision, likely to chop |
| No Two-Day Trend | -30 points | Trend not established enough |
| Phase Mismatch | -25 points | Trading against market phase |
| No Key Level Nearby | -50 points | No technical confluence |
| Institutional Fight | ×0.70 multiplier | Big players fighting each other |
Bonus System
| Condition | Bonus | Rationale |
|---|---|---|
| Railroad Tracks | +15 points | Strong momentum confirmation |
| At Key Level | +10 points | Technical confluence present |
| Clean Entry Setup | +10 points | Clear technical pattern |
Probability Zone Analysis
Source: trade_philosophy.pdf concepts implemented in probability_zone_analysis.py
The Halves & Thirds Rule
Price position within the recent range determines continuation probability:
| Zone | Position | Continuation Probability | Action |
|---|---|---|---|
| Top Third | >66.7% of range | 80% likely to continue higher | Favor LONG |
| Top Half | >50% of range | 65% continuation | Moderate LONG bias |
| Bottom Half | <50% of range | 35% continuation higher | Moderate SHORT bias |
| Bottom Third | <33.3% of range | 15% continuation (85% reversal) | Favor SHORT |
Three-Finger Spread
Measures separation between Price, 21 MA, and 200 MA:
Three-Finger Spread Detection: - Large spread between Price/21MA/200MA - Indicates profit-taking pressure imminent - Minimum spread threshold: 2% of price Structure Types: UPTREND: Price > 21 MA > 200 MA (bullish stack) DOWNTREND: Price < 21 MA < 200 MA (bearish stack) SIDEWAYS: No clear MA separation
Crash Bar Detection
Identifies structural breaks via unusually large bars:
| Parameter | Value | Meaning |
|---|---|---|
| crash_bar_multiplier | 2.0 | Bar must be 2× average size |
| crash_bar_lookback | 10 bars | Average calculated over 10 bars |
| crash_bar_close_threshold | 30% | Close within 30% of bar extreme |
Trading Rule: After crash bar, short the bounce back to MA21.
Pullback Classification
| Type | Characteristics | Action |
|---|---|---|
| Healthy Pullback | 45° drift, holds above halfway point | Good entry opportunity |
| Collapse | Vertical drop (>60% retracement) | Avoid entry, wait for structure |
| Bounce | Recovery after crash bar | Short opportunity |
Signal Filtering
Probability zones filter signals:
<source lang="python">
- Source: signal_generation_trade_management.py
- Zone-based filtering (soft filter - affects score, doesn't block)
if zone_position < 33.3%: # Bottom third
# Block LONG signals (only 15% chance of continuation) # Allow SHORT signals
if zone_position > 66.7%: # Top third
# Allow LONG signals (80% continuation) # Block SHORT signals
</source>
Note: Color Change confirmation (color_change.pdf) is implemented but DISABLED in current backtest (enable_color_change_filter = False) as it was too restrictive.
PART 5: LAYER 3 - SETUP QUALITY GRADING
The 5-Factor Scoring System
Every potential trade is scored on 5 factors:
| Factor | Weight | What It Measures |
|---|---|---|
| Timeframe Alignment | 30% | How well all 5 timeframes agree |
| Trend Strength | 20% | Quality of the trend (Railroad vs Creeper) |
| Key Level Proximity | 20% | Is entry near significant S/R level? |
| Entry Quality | 15% | How clean is the entry technique? |
| Risk:Reward | 15% | Is the R:R ratio favorable? |
Note: Weights sum to 100%. Timeframe Alignment has highest weight (30%) because MTF is the foundation.
Grade Thresholds
| Grade | Score Range | Action | Position Size |
|---|---|---|---|
| A+ | 90-100 | Trade with full conviction | 2 lots |
| A | 80-89 | Trade with confidence | 1 lot |
| B | 70-79 | Trade normally | 1 lot |
| C | 60-69 | Trade with caution | 1 lot |
| D | 50-59 | NO TRADE | - |
| F | <50 | NO TRADE | - |
Backtest Results by Grade:
- A+ trades: 3,457 (45.9%)
- A trades: 551 (7.3%)
- C trades: 3,526 (46.8%)
- No B-grade trades in this backtest period
A+ Grade Special Requirements
To achieve A+ grade, ALL conditions must be true:
- Final score ≥ 90
- All 5 timeframes aligned with trade direction
- Entry within ±25 points of MA21
- Two-day trend present on Daily
- No institutional fight detected
Score Calculation Example
Trade Setup: LONG on 5-min chart
Factor Scores (0-100 each):
Timeframe Alignment: 85 × 0.30 = 25.5
Trend Strength: 90 × 0.20 = 18.0
Key Level Proximity: 70 × 0.20 = 14.0
Entry Quality: 80 × 0.15 = 12.0
Risk:Reward: 75 × 0.15 = 11.25
──────────
Base Score: 80.75
Penalties Applied:
- No Railroad Tracks: 0
- No Creeper: 0
- Has Two-Day: 0
──────────
Final Score: 80.75 → Grade: A
PART 6: LAYER 4 - HARD FILTERS (The Gate)
HARD FILTERS block trades completely. If ANY hard filter fails, NO TRADE happens regardless of how good the setup looks.
The Three Hard Filters
| Filter | Rule | Effect |
|---|---|---|
| 1. Direction Filter | MA21 slope must match trade direction | Wrong direction = BLOCKED |
| 2. Grade Filter | D/F grades blocked | D/F grades = BLOCKED (A+/A/B/C allowed) |
| 3. Hour Filter | Block hours 9, 22, 23 | Blocked hours = BLOCKED |
Filter 1: Direction (MA21 Slope)
| MA21 Slope | Allowed Direction | Logic |
|---|---|---|
| Rising (↗) | LONG only | Trade with uptrend, never short |
| Declining (↘) | SHORT only | Trade with downtrend, never long |
| Flat (→) | Use MTF direction | Higher timeframes decide |
Slope Calculation: Slope % = (MA21[current] - MA21[previous]) / MA21[previous] × 100 Thresholds: > +0.01% → RISING (LONG only) < -0.01% → DECLINING (SHORT only) ±0.01% → FLAT (use MTF consensus)
Filter 2: Grade
| Grade | Action | Position Size |
|---|---|---|
| A+ | PASS - High conviction | 2 lots |
| A | PASS - Trade with confidence | 1 lot |
| B | PASS - Trade normally | 1 lot |
| C | Trade with reduced size | 1 lot |
| D, F | BLOCKED - No trade | - |
Note on Backtest: The backtest included C-grade trades (46.8% of total). The current code has a stricter filter that blocks C/D/F grades for live trading:
<source lang="python">
- Source: signal_generation_trade_management.py:568 (Current Code)
if setup_quality.grade in [SetupQualityGrade.C, SetupQualityGrade.D, SetupQualityGrade.F]:
return None # No signal generated - trade blocked
</source>
Filter 3: Hour
| Hour | Status | Reason |
|---|---|---|
| 9 (9:00-9:59 AM) | BLOCKED | Market open volatility |
| 10-21 (10:00 AM - 9:59 PM) | ALLOWED | Normal trading hours |
| 22 (10:00-10:59 PM) | BLOCKED | Near market close |
| 23 (11:00-11:59 PM) | BLOCKED | Market close |
Why 80% of Trades Were SHORT
In the backtest period, MA21 was predominantly declining:
- Market was in a sustained downtrend
- Rising MA periods were shorter/fewer
- This is expected behavior - strategy adapts to market conditions
PART 7: LAYER 5 - ENTRY TECHNIQUE
The MA21 Zone Principle
"The MA is a ZONE, not a thin line"
Entry is allowed within ±25 points of MA21, not just at the exact MA value.
Why ±25 Points?
- Price rarely touches MA exactly
- Allows for normal market noise
- Captures the "value zone" around the average
- Based on typical Crude Oil volatility
Available Entry Techniques
| Technique | Direction | Description |
|---|---|---|
| NEAR_MA | Both | Price within ±25 pts of MA21 (most common) |
| MA_BOUNCE_LONG | Long | Price touches MA21 and bounces up |
| MA_BOUNCE_SHORT | Short | Price touches MA21 and rejects down |
| GREEN_BAR_AFTER_PULLBACK | Long | Bullish candle after pullback to MA |
| RED_BAR_AFTER_RALLY | Short | Bearish candle after rally to MA |
| BOS_ENTRY_LONG | Long | Break of structure to upside |
| BOS_ENTRY_SHORT | Short | Break of structure to downside |
Entry Selection Logic
<source lang="python"> def select_entry_technique(price, ma21, direction, market_state):
""" Select best entry technique based on conditions. Source: signal_generation_trade_management.py """ ma_distance = abs(price - ma21)
# Most common: price in MA zone
if ma_distance <= 25: # ±25 points
return NEAR_MA
# Break of structure detected
if market_state.has_bos:
return BOS_ENTRY_LONG if direction == LONG else BOS_ENTRY_SHORT
# Pullback/Rally pattern
if market_state.has_pullback:
return GREEN_BAR_AFTER_PULLBACK if direction == LONG else RED_BAR_AFTER_RALLY
return NEAR_MA # Default
</source>
PART 8: STOP LOSS CALCULATION
Stop Loss Methods (Priority Order)
| Priority | Method | Description |
|---|---|---|
| 1 | BOS-Based Stop | Below/above break of structure level |
| 2 | Swing-Based Stop | Below recent swing low (LONG) or above swing high (SHORT) |
| 3 | Default Stop | Fixed 40 points from entry |
Minimum Stop Distance
MINIMUM: 40 points - Stops closer than 40 points are automatically widened to 40.
This prevents:
- Getting stopped out by normal noise
- Excessive trading costs from tight stops
- Whipsaws in volatile Crude Oil market
Stop Calculation Algorithm
<source lang="python"> def calculate_stop_loss(entry_price, direction, market_state):
""" Calculate stop loss with minimum enforcement. Source: signal_generation_trade_management.py """ MIN_STOP_DISTANCE = 40.0 # points
# Try BOS-based stop first
if market_state.bos_level:
stop = market_state.bos_level - 5 # 5pt buffer
# Try swing-based stop
elif market_state.swing_low and direction == LONG:
stop = market_state.swing_low - 5
# Default stop
else:
if direction == LONG:
stop = entry_price - MIN_STOP_DISTANCE
else:
stop = entry_price + MIN_STOP_DISTANCE
# ENFORCE MINIMUM
actual_distance = abs(entry_price - stop)
if actual_distance < MIN_STOP_DISTANCE:
if direction == LONG:
stop = entry_price - MIN_STOP_DISTANCE
else:
stop = entry_price + MIN_STOP_DISTANCE
return stop
</source>
PART 9: TARGET CALCULATION
The 50% Rule
Target = 50% of distance to MA21
For mean reversion trades, we target halfway back to the moving average.
Why 50%?
- Conservative target ensures higher hit rate
- Based on "divide the move in half" principle
- Captures partial reversion without being greedy
- Works well with trailing stop to capture more
Minimum Target Rule
Minimum Target = Risk × 1.5 Example: Entry: 5700 Stop: 5660 (40 points risk) 50% to MA might give: 30 points But minimum is: 40 × 1.5 = 60 points Final Target: 5760 (60 points)
Target Calculation
<source lang="python"> def calculate_target(entry_price, stop_price, ma21, direction):
""" PDF-based target: 50% of distance to MA, with minimum. Source: signal_generation_trade_management.py """ risk_distance = abs(entry_price - stop_price) min_target = risk_distance * 1.5 # Minimum 1.5:1 R:R
# Calculate 50% move toward MA distance_to_ma = abs(entry_price - ma21) target_distance = distance_to_ma * 0.5
# Enforce minimum target_distance = max(target_distance, min_target)
if direction == LONG:
return entry_price + target_distance
else:
return entry_price - target_distance
</source>
PART 10: DYNAMIC STOP MANAGEMENT
Two-Phase Protection
After entry, stops are managed dynamically in two phases:
| Phase | Trigger | Action |
|---|---|---|
| Phase 1: Breakeven | +25 points profit | Move stop to entry + 2 points |
| Phase 2: Trailing | +20 points profit | Trail stop using ATR × 2 |
Phase 1: Breakeven Stop
Configuration: breakeven_activation = 25 points breakeven_buffer = 2 points Example (LONG from 5700): Price reaches 5725 (+25 pts profit) → Stop moves from 5660 to 5702 (entry + 2) → Trade is now "risk-free"
Phase 2: Trailing Stop
Configuration: trailing_stop_activation = 20 points trailing_stop_method = ATR_MULTIPLE atr_period = 14 bars atr_multiplier = 2.0 minimum_trail_distance = 15 points Example (LONG from 5700, ATR = 12): Trailing Distance = 12 × 2 = 24 points Price at 5740: → Trail stop = 5740 - 24 = 5716 Price at 5760: → Trail stop = 5760 - 24 = 5736 (moved UP) Price drops to 5736: → STOPPED OUT at 5736 (profit locked)
Why Both Phases?
| Phase | Purpose |
|---|---|
| Breakeven | Eliminate risk quickly once trade moves in favor |
| Trailing | Let winners run while protecting accumulated profit |
PART 11: SLIPPAGE & COSTS
Realistic Slippage Model
| Event | Slippage | Rationale |
|---|---|---|
| Entry | +1.0 point | Normal market fill |
| Stop Loss Exit | +2.0 points | Stops slip more in fast moves |
| Target Exit | +0.5 points | Limit orders have minimal slippage |
Cost Structure
| Cost Type | Value |
|---|---|
| Commission | Rs 20 per lot per side |
| STT | 0.01% on sell side |
| Exchange Fees | ~Rs 2 per lot |
| Stamp Duty | State-dependent |
Why Model Slippage?
- Backtest results must reflect real trading
- Prevents over-optimistic performance estimates
- Stop loss slippage is higher because stops often trigger during fast moves
- Total costs ~Rs 79 per round-trip lot
PART 12: EXIT RULES
Three Exit Conditions
| Exit Type | Condition | % of Exits |
|---|---|---|
| Stop Loss | Price hits stop (original or trailing) | 72.3% |
| Target | Price hits take profit level | 22.8% |
| Timeout | End of day (no overnight holds) | 5.0% |
Why 72% Stop Exits but 57% Win Rate?
This seems contradictory but makes sense:
- Trailing stops lock in profits - many "stop exits" are actually winning trades
- Breakeven stops trigger at +25 pts, trailing at +20 pts
- A trade can be stopped out at +30 pts profit (counted as stop exit but is a WIN)
End-of-Day Exit
All positions closed before market close: - Market closes at 11:30 PM IST - 15-minute buffer before close - Prevents overnight gap risk
PART 13: PUTTING IT ALL TOGETHER
Trade Flow
┌─────────────────────────────────────────────────────────────────┐
│ STEP 1: Load data for all 5 timeframes │
│ Daily, 4H, 1H, 15M, 5M OHLCV data │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 2: LAYER 1 - MTF Analysis (Foundation) │
│ Calculate MA21, MA200, trend direction for each timeframe │
│ Compute MTF alignment score │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 3: LAYER 2 - Market State Analysis │
│ Run 7 algorithms: Railroad, Creeper, Phase, BOS, etc. │
│ Calculate penalties and bonuses │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 4: LAYER 3 - Setup Quality Grading │
│ Score 5 factors, apply penalties/bonuses │
│ Assign grade: A+ / A / B / C / D / F │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 5: LAYER 4 - HARD FILTERS (The Gate) ◄── PASS/FAIL │
│ • Direction: MA21 slope matches trade direction? │
│ • Grade: Is grade A+, A, B, or C? (D/F blocked) │
│ • Hour: Is current hour allowed (not 9, 22, 23)? │
│ ANY FAIL → NO TRADE │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 6: LAYER 5 - Entry Technique │
│ Is price within ±25 points of MA21? │
│ Select entry technique (NEAR_MA, BOS_ENTRY, etc.) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 7: Calculate Stop Loss │
│ BOS-based → Swing-based → Default (40 pts minimum) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 8: Calculate Target │
│ 50% of distance to MA (minimum 1.5× risk) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 9: Execute Trade │
│ Apply entry slippage (+1 pt), create trade record │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STEP 10: Manage Trade │
│ Monitor: Breakeven at +25 pts → Trail at +20 pts │
│ Exit: Stop hit | Target hit | Timeout │
└─────────────────────────────────────────────────────────────────┘
PART 14: HARD vs SOFT FILTERS
Understanding the Difference
| Filter Type | Behavior | Examples |
|---|---|---|
| HARD | Blocks trade completely | Direction filter, Hour filter, Grade D/F |
| SOFT | Affects quality score | MTF alignment, Market state penalties |
Complete Filter List
| Filter | Type | Effect |
|---|---|---|
| MA21 Direction | HARD | Wrong direction = NO TRADE |
| Hour Filter | HARD | Hours 9, 22, 23 = NO TRADE |
| Grade D/F | HARD | D/F grades = NO TRADE |
| MTF Alignment | SOFT | Low alignment = reduced score (30% weight) |
| Creeper Move | SOFT | -50 points penalty |
| No Two-Day Trend | SOFT | -30 points penalty |
| Institutional Fight | SOFT | 0.7× score multiplier |
| Far from MA21 | SOFT | -40 points penalty |
APPENDIX A: CONFIGURATION VALUES
MTF Configuration
| Parameter | Value | Source File | Description |
|---|---|---|---|
| context_timeframe | DAILY | main.py:162 | Highest timeframe for overall bias |
| primary_timeframe | 1-HOUR | main.py:163 | Primary trend direction |
| confirmation_timeframe | 15-MIN | main.py:164 | Entry timing confirmation |
| entry_timeframe | 5-MIN | main.py:165 | Execution timeframe |
| require_all_timeframes_aligned | False | main.py:166 | Allow partial alignment |
| min_alignment_score | 0.70 (70%) | main.py:167 | Minimum MTF alignment score |
| wait_for_15min_alignment | True | main.py:168 | Wait for 15M confirmation |
| min_15min_confirmation_bars | 2 bars | main.py:169 | Bars needed for 15M confirmation |
Entry Configuration
| Parameter | Value | Source File |
|---|---|---|
| entry_timeframe | 5-Minute | main.py:165 |
| ma_buffer_points | 25 points | signal_generation_trade_management.py:68 |
| blocked_hours | [9, 22, 23] | signal_generation_trade_management.py:137 |
| enable_hour_filter | True | signal_generation_trade_management.py:89 |
| enable_ma_direction_filter | True | signal_generation_trade_management.py:97 |
Stop/Target Configuration
| Parameter | Value | Source File |
|---|---|---|
| min_stop_distance | 40 points | signal_generation_trade_management.py:59 |
| default_risk_reward | 1.5 | signal_generation_trade_management.py:62 |
| bos_stop_buffer_points | 5 points | signal_generation_trade_management.py:81 |
Dynamic Stop Configuration
| Parameter | Value | Source File |
|---|---|---|
| enable_trailing_stop | True | trade_execution_engine.py:58 |
| trailing_stop_method | ATR_MULTIPLE | trade_execution_engine.py:63 |
| atr_period | 14 bars | trade_execution_engine.py:64 |
| atr_multiplier | 2.0 | trade_execution_engine.py:65 |
| trailing_stop_activation | 20 points | trade_execution_engine.py:60 |
| enable_breakeven_stop | True | trade_execution_engine.py:69 |
| breakeven_activation | 25 points | trade_execution_engine.py:70 |
| breakeven_buffer | 2 points | trade_execution_engine.py:71 |
| minimum_trail_distance | 15 points | trade_execution_engine.py:370 |
Slippage Configuration
| Parameter | Value | Source File |
|---|---|---|
| base_slippage_points | 1.0 point | trade_execution_engine.py:38 |
| volatility_slippage_factor | 0.5 | trade_execution_engine.py:39 |
| market_impact_factor | 0.1 | trade_execution_engine.py:40 |
| max_market_impact_slippage | 2.0 points | trade_execution_engine.py:43 |
| stop_loss_slippage | 2.0 points | trade_execution_engine.py:50 |
| take_profit_slippage | 0.5 points | trade_execution_engine.py:51 |
Trade Execution Limits
| Parameter | Value | Source File | Description |
|---|---|---|---|
| max_holding_period_minutes | 480 (8 hours) | trade_execution_engine.py:46 | Maximum time a trade can stay open |
| min_holding_period_minutes | 5 minutes | trade_execution_engine.py:47 | Minimum holding before exit |
| max_position_size | 200 lots | trade_execution_engine.py:54 | Maximum lots per single trade |
| max_concurrent_trades | 3 | trade_execution_engine.py:55 | Maximum simultaneous open trades |
| market_close_buffer_minutes | 15 minutes | trade_execution_engine.py:75 | Close trades before market close |
| avoid_news_minutes | 30 minutes | trade_execution_engine.py:74 | Buffer around news events |
Cost Configuration
| Parameter | Value | Source File | Description |
|---|---|---|---|
| commission_per_lot | Rs 20/lot/leg | signal_generation_trade_management.py:49 | Dhan broker commission |
| transaction_tax_rate | 0.005% per leg | signal_generation_trade_management.py:55 | CTT (0.01% round-trip) |
| lot_size_multiplier | 100 barrels | signal_generation_trade_management.py:56 | MCX Crude lot size |
| initial_capital | Rs 1,00,000 | main.py:1131 | Starting capital for backtest |
Grading Configuration
| Parameter | Value | Source File |
|---|---|---|
| timeframe_alignment_weight | 30% | setup_quality_detection.py:44 |
| trend_strength_weight | 20% | setup_quality_detection.py:45 |
| key_level_proximity_weight | 20% | setup_quality_detection.py:47 |
| entry_technique_weight | 15% | setup_quality_detection.py:46 |
| risk_reward_weight | 15% | setup_quality_detection.py:48 |
| a_plus_min_score | 90 | setup_quality_detection.py:51 |
| a_min_score | 80 | setup_quality_detection.py:52 |
| b_min_score | 70 | setup_quality_detection.py:53 |
Probability Zone Configuration
| Parameter | Value | Source File |
|---|---|---|
| enable_probability_zone_filter | True | signal_generation_trade_management.py:104 |
| probability_zone_swing_lookback | 20 bars | signal_generation_trade_management.py:105 |
| probability_zone_min_range | 20 points | signal_generation_trade_management.py:106 |
| top_third_threshold | 66.7% | probability_zone_analysis.py:125 |
| top_third_probability | 80% | probability_zone_analysis.py:131 |
| bottom_third_probability | 15% | probability_zone_analysis.py:134 |
| crash_bar_multiplier | 2.0 | probability_zone_analysis.py:145 |
| three_finger_min_spread_pct | 2% | probability_zone_analysis.py:141 |
| enable_color_change_filter | False (disabled) | signal_generation_trade_management.py:115 |
APPENDIX B: SOURCE CODE REFERENCE
| File | Purpose |
|---|---|
main.py |
Entry point, timeframe configuration |
trend_analysis_core.py |
MA calculation, slope detection, trend direction |
multi_timeframe_analysis.py |
MTF alignment scoring across 5 timeframes |
market_state_analysis.py |
7 market state detection algorithms |
setup_quality_detection.py |
5-factor grading system with penalties/bonuses |
probability_zone_analysis.py |
Halves/Thirds, Three-Finger Spread, Crash Bar |
signal_generation_trade_management.py |
Entry/Exit logic, stop/target calculation |
trade_execution_engine.py |
Breakeven, Trailing stop, Slippage modeling |
data_manager.py |
OHLCV data loading and management |
backtesting_analytics.py |
Performance metrics (Sharpe, Sortino, VaR, drawdown) |
Document generated from source code analysis - January 2026
Strategy: Multi-Layer Confluence (MLC) v1.0