trading-platform/docs/02-definicion-modulos/OQI-006-ml-signals/estrategias/ESTRATEGIA-ICT-SMC.md
rckrdmrd c1b5081208 feat(ml): Complete FASE 11 - BTCUSD update and comprehensive documentation alignment
ML Engine Updates:
- Updated BTCUSD with Polygon API data (2024-2025): 215,699 new records
- Re-trained all ML models: Attention (R²: 0.223), Base, Metamodel (87.3% confidence)
- Backtest results: +176.71R profit with aggressive_filter strategy

Documentation Consolidation:
- Created docs/99-analisis/_MAP.md index with 13 new analysis documents
- Consolidated inventories: removed duplicates from orchestration/inventarios/
- Updated ML_INVENTORY.yml with BTCUSD metrics and training results
- Added execution reports: FASE11-BTCUSD, correction issues, alignment validation

Architecture & Integration:
- Updated all module documentation with NEXUS v3.4 frontmatter
- Fixed _MAP.md indexes across all folders
- Updated orchestration plans and traces

Files: 229 changed, 5064 insertions(+), 1872 deletions(-)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 09:31:29 -06:00

1278 lines
41 KiB
Markdown

---
id: "ESTRATEGIA-ICT-SMC"
title: "ICT y Smart Money Concepts"
type: "Documentation"
project: "trading-platform"
version: "1.0.0"
updated_date: "2026-01-04"
---
# Estrategias Complementarias: ICT y Smart Money Concepts
**Versi\u00f3n:** 1.0.0
**Fecha:** 2025-12-05
**M\u00f3dulo:** OQI-006-ml-signals
**Autor:** Trading Strategist - Trading Platform
---
## Tabla de Contenidos
1. [Introducci\u00f3n](#introducci\u00f3n)
2. [ICT Concepts (Inner Circle Trader)](#ict-concepts-inner-circle-trader)
3. [Smart Money Concepts (SMC)](#smart-money-concepts-smc)
4. [Estrategia de Confluence](#estrategia-de-confluence)
5. [Integraci\u00f3n AMD + ICT + SMC](#integraci\u00f3n-amd--ict--smc)
6. [Implementaci\u00f3n en ML](#implementaci\u00f3n-en-ml)
7. [Referencias](#referencias)
---
## Introducci\u00f3n
Las estrategias ICT (Inner Circle Trader) y Smart Money Concepts (SMC) son metodolog\u00edas complementarias a la estrategia AMD que se enfocan en comprender c\u00f3mo operan las instituciones financieras (market makers, bancos, hedge funds) en los mercados.
### Relaci\u00f3n con AMD
```
┌─────────────────────────────────────────────────────┐
│ JERARQUÍA DE CONCEPTOS │
├─────────────────────────────────────────────────────┤
│ │
│ AMD (Marco General) │
│ └── Identifica FASES del mercado │
│ │
│ ICT (Timing & Zones) │
│ └── Identifica CUÁNDO y DÓNDE entrar │
│ │
│ SMC (Structure & Flow) │
│ └── Identifica CÓMO se mueve el dinero │
│ │
└─────────────────────────────────────────────────────┘
```
### Principio Unificador
**"Follow the Smart Money"** - Todas estas metodolog\u00edas buscan identificar y seguir al dinero institucional, no oponerse a \u00e9l.
---
## ICT Concepts (Inner Circle Trader)
### Fundamentos ICT
ICT es una metodolog\u00eda desarrollada por Michael J. Huddleston que se enfoca en c\u00f3mo los market makers operan para proveer liquidez y generar ganancias.
### 1. Optimal Trade Entry (OTE)
**Definici\u00f3n:** Zona \u00f3ptima de entrada basada en retrocesos Fibonacci
#### Zonas OTE
```
┌─────────────────────────────────────────────────┐
│ FIBONACCI RETRACEMENT ZONES │
├─────────────────────────────────────────────────┤
│ │
│ 100% ──────────────────────────────── High │
│ │
│ 79% ─────────────┐ ┌───────────── │
│ │ │ OTE ZONE │
│ 62% ─────────────┘ └───────────── Premium │
│ │
│ 50% ─────────────────────────────── Equilibrium │
│ │
│ 38% ─────────────┐ ┌───────────── Discount│
│ │ │ Possible Entry │
│ 21% ─────────────┘ └───────────── │
│ │
│ 0% ──────────────────────────────── Low │
│ │
└─────────────────────────────────────────────────┘
```
**Zonas Clave:**
- **Premium Zone** (62%-79%): Mejor zona para ventas
- **OTE Zone** (62%-79%): Zona \u00f3ptima de entrada
- **Discount Zone** (21%-38%): Mejor zona para compras
#### Implementaci\u00f3n
```python
def calculate_ote_zones(swing_high, swing_low):
"""
Calcula zonas OTE para un swing
"""
range_size = swing_high - swing_low
zones = {
# Fibonacci levels
'fib_0': swing_low,
'fib_21': swing_low + (range_size * 0.21),
'fib_38': swing_low + (range_size * 0.38),
'fib_50': swing_low + (range_size * 0.50),
'fib_62': swing_low + (range_size * 0.62),
'fib_79': swing_low + (range_size * 0.79),
'fib_100': swing_high,
# Named zones
'discount_zone': (
swing_low + (range_size * 0.21),
swing_low + (range_size * 0.38)
),
'equilibrium': swing_low + (range_size * 0.50),
'premium_zone': (
swing_low + (range_size * 0.62),
swing_low + (range_size * 0.79)
),
'ote_buy': ( # For bullish moves
swing_low + (range_size * 0.62),
swing_low + (range_size * 0.79)
),
'ote_sell': ( # For bearish moves
swing_high - (range_size * 0.79),
swing_high - (range_size * 0.62)
)
}
return zones
```
#### Estrategia OTE
```
BULLISH SETUP:
1. Identificar impulso alcista reciente
2. Esperar retroceso a zona 62%-79%
3. Buscar confirmaci\u00f3n (order block, FVG, etc.)
4. Entry en rechazo de OTE
BEARISH SETUP:
1. Identificar impulso bajista reciente
2. Esperar rally a zona 62%-79% desde el top
3. Buscar confirmaci\u00f3n bearish
4. Entry en rechazo de OTE
```
### 2. Killzones
**Definici\u00f3n:** Ventanas de tiempo donde la liquidez institucional es m\u00e1s activa
#### Horarios de Killzones (Hora EST)
| Killzone | Inicio (EST) | Fin (EST) | Duraci\u00f3n | Mercado | Caracter\u00edsticas |
|----------|--------------|-----------|----------|---------|---------------------|
| **Asian** | 20:00 | 00:00 | 4h | Tokyo | Rangos estrechos, low volatility |
| **London Open** | 02:00 | 05:00 | 3h | London | Alta volatilidad, tendencias fuertes |
| **New York AM** | 08:30 | 11:00 | 2.5h | NY | M\u00e1xima liquidez, reversiones comunes |
| **London Close** | 10:00 | 12:00 | 2h | London | Cierre de posiciones, volatilidad |
| **New York PM** | 13:30 | 16:00 | 2.5h | NY | Continuaci\u00f3n o reversi\u00f3n de trends |
#### Killzone Preferidas ICT
**London Open Killzone (02:00-05:00 EST):**
- Mayor probabilidad de trending moves
- Instituciones europeas activas
- Mejores setups para breakouts
**New York AM Killzone (08:30-11:00 EST):**
- M\u00e1xima liquidez global
- Overlap London/NY
- Reversiones comunes en 09:30-10:00
#### Implementaci\u00f3n
```python
from datetime import time
def identify_killzone(timestamp):
"""
Identifica la killzone actual
timestamp: pd.Timestamp con timezone UTC
"""
# Convertir a EST
est_time = timestamp.tz_convert('America/New_York').time()
killzones = {
'asian': (time(20, 0), time(0, 0)),
'london_open': (time(2, 0), time(5, 0)),
'ny_am': (time(8, 30), time(11, 0)),
'london_close': (time(10, 0), time(12, 0)),
'ny_pm': (time(13, 30), time(16, 0))
}
for name, (start, end) in killzones.items():
if start <= est_time <= end:
return name
return 'outside_killzone'
def is_high_probability_killzone(killzone):
"""Killzones de alta probabilidad seg\u00fan ICT"""
return killzone in ['london_open', 'ny_am']
```
#### Features ML para Killzones
```python
# Features derivados de killzones
killzone_features = {
'is_london_open': 1 if killzone == 'london_open' else 0,
'is_ny_am': 1 if killzone == 'ny_am' else 0,
'is_asian': 1 if killzone == 'asian' else 0,
'is_high_prob_kz': 1 if is_high_probability_killzone(killzone) else 0,
'session_overlap': 1 if killzone in ['london_close', 'ny_am'] else 0,
# Time encoding
'hour_sin': np.sin(2 * np.pi * hour / 24),
'hour_cos': np.cos(2 * np.pi * hour / 24),
# Session strength (0-1)
'session_strength': {
'asian': 0.3,
'london_open': 0.9,
'ny_am': 1.0,
'london_close': 0.7,
'ny_pm': 0.6
}.get(killzone, 0.1)
}
```
### 3. Weekly & Daily Ranges
#### Concepto de Ranges ICT
**Weekly Range:**
- Establecido en la primera semana del mes
- Market makers operan dentro de este rango
- Extensiones com\u00fanmente en +/- 20% del rango
**Daily Range:**
- Establecido en primeras horas (Asian-London)
- 80% de d\u00edas respetan este rango
- Breakouts falsos com\u00fanes al final del d\u00eda
#### C\u00e1lculo de Ranges
```python
def calculate_ict_ranges(df):
"""
Calcula ranges ICT para an\u00e1lisis
"""
ranges = {}
# Weekly range (lunes a viernes)
df['week'] = df.index.isocalendar().week
weekly = df.groupby('week').agg({
'high': 'max',
'low': 'min',
'close': 'last'
})
ranges['weekly_high'] = weekly['high'].iloc[-1]
ranges['weekly_low'] = weekly['low'].iloc[-1]
ranges['weekly_range'] = ranges['weekly_high'] - ranges['weekly_low']
# Daily range (primeras 8 horas)
today = df[df.index.date == df.index[-1].date()]
if len(today) >= 96: # 8 horas * 12 (5min candles)
early_session = today.iloc[:96]
ranges['daily_high'] = early_session['high'].max()
ranges['daily_low'] = early_session['low'].min()
ranges['daily_range'] = ranges['daily_high'] - ranges['daily_low']
else:
ranges['daily_high'] = today['high'].max()
ranges['daily_low'] = today['low'].min()
ranges['daily_range'] = ranges['daily_high'] - ranges['daily_low']
# Current price position in ranges
current_price = df['close'].iloc[-1]
ranges['weekly_position'] = (
(current_price - ranges['weekly_low']) / ranges['weekly_range']
if ranges['weekly_range'] > 0 else 0.5
)
ranges['daily_position'] = (
(current_price - ranges['daily_low']) / ranges['daily_range']
if ranges['daily_range'] > 0 else 0.5
)
return ranges
```
#### Trading con Ranges
**Estrategia Inside Range:**
```
SETUP:
- Precio dentro del range establecido
- Buscar reversiones en extremos
LONG ENTRY:
- Precio cerca de low del range (20-30%)
- Confirmaci\u00f3n bullish (order block, FVG)
- Target: High del range
SHORT ENTRY:
- Precio cerca de high del range (70-80%)
- Confirmaci\u00f3n bearish
- Target: Low del range
```
**Estrategia Breakout:**
```
SETUP:
- Precio rompe range establecido
- Alto volumen en breakout
RETEST ENTRY:
- Esperar pullback al nivel de breakout
- Breakout level act\u00faa como soporte/resistencia
- Entry en rechazo del retest
```
### 4. Premium / Discount Pricing
**Concepto:** Market makers compran en "discount" y venden en "premium"
#### Zonas de Precio
```
PREMIUM ZONE (Expensive)
├── 100% ─────────────── High
├── 75% ───────────────
│ SELL ZONE
├── 50% ─────────────── Equilibrium
│ BUY ZONE
├── 25% ───────────────
└── 0% ─────────────── Low
DISCOUNT ZONE (Cheap)
```
**Reglas:**
- **Comprar** solo en Discount Zone (0-50%)
- **Vender** solo en Premium Zone (50-100%)
- **Evitar** entradas cerca de equilibrio (45-55%)
#### Implementaci\u00f3n
```python
def calculate_premium_discount(current_price, range_high, range_low):
"""
Calcula si precio est\u00e1 en premium o discount
"""
range_size = range_high - range_low
if range_size == 0:
return 0.5, 'equilibrium'
# Position in range (0 = low, 1 = high)
position = (current_price - range_low) / range_size
if position >= 0.75:
zone = 'extreme_premium'
elif position >= 0.50:
zone = 'premium'
elif position >= 0.25:
zone = 'discount'
else:
zone = 'extreme_discount'
return position, zone
def get_trading_bias(zone):
"""Bias de trading seg\u00fan zona"""
bias_map = {
'extreme_premium': 'strong_sell',
'premium': 'sell',
'discount': 'buy',
'extreme_discount': 'strong_buy'
}
return bias_map.get(zone, 'neutral')
```
### 5. Market Maker Models
#### MMSM (Market Maker Sell Model)
```
Fase 1: Distribution (Vendiendo a retail)
Fase 2: Inducement (Falsa continuación alcista)
Fase 3: Sell Setup (Market makers venden)
Fase 4: Manipulation (Stop hunt de largos)
Fase 5: Distribution (Caída real)
```
**Caracter\u00edsticas:**
1. Highs consecutivos en zona premium
2. Falso breakout final (inducement)
3. Sweep de liquidity (BSL hunt)
4. Reversi\u00f3n bajista violenta
#### MMBM (Market Maker Buy Model)
```
Fase 1: Accumulation (Comprando de retail)
Fase 2: Inducement (Falsa continuaci\u00f3n bajista)
Fase 3: Buy Setup (Market makers compran)
Fase 4: Manipulation (Stop hunt de cortos)
Fase 5: Accumulation (Subida real)
```
**Caracter\u00edsticas:**
1. Lows consecutivos en zona discount
2. Falso breakdown final (inducement)
3. Sweep de liquidity (SSL hunt)
4. Reversi\u00f3n alcista violenta
#### Detecci\u00f3n de MM Models
```python
def detect_market_maker_model(df, lookback=50):
"""
Detecta patrones de Market Maker
"""
recent = df.tail(lookback)
# Calculate range
range_high = recent['high'].max()
range_low = recent['low'].min()
current_price = df['close'].iloc[-1]
# Check for MMSM (sell model)
higher_highs = (recent['high'] > recent['high'].shift(1)).sum()
in_premium = current_price > (range_low + (range_high - range_low) * 0.70)
liquidity_sweep = detect_bsl_sweep(df.tail(20))
if higher_highs >= 3 and in_premium and liquidity_sweep:
return {
'model': 'MMSM',
'confidence': 0.8,
'expected_move': 'bearish',
'entry_zone': 'wait_for_reversal'
}
# Check for MMBM (buy model)
lower_lows = (recent['low'] < recent['low'].shift(1)).sum()
in_discount = current_price < (range_low + (range_high - range_low) * 0.30)
liquidity_sweep = detect_ssl_sweep(df.tail(20))
if lower_lows >= 3 and in_discount and liquidity_sweep:
return {
'model': 'MMBM',
'confidence': 0.8,
'expected_move': 'bullish',
'entry_zone': 'wait_for_reversal'
}
return {
'model': 'none',
'confidence': 0,
'expected_move': 'neutral'
}
```
### 6. Power of 3 (PO3)
**Concepto:** Cada sesi\u00f3n de trading tiene 3 fases
```
┌─────────────────────────────────────────┐
│ POWER OF 3 PHASES │
├─────────────────────────────────────────┤
│ │
│ 1. ACCUMULATION/DISTRIBUTION │
│ │ Inicio de sesi\u00f3n │
│ │ Rangos estrechos │
│ │ Low volume │
│ ▼ │
│ │
│ 2. MANIPULATION │
│ │ Caza de liquidez │
│ │ False breakouts │
│ │ Spikes de volumen │
│ ▼ │
│ │
│ 3. DISTRIBUTION/ACCUMULATION │
│ │ Movimiento real │
│ │ Trending price action │
│ │ Objetivo alcanzado │
│ ▼ │
│ │
└─────────────────────────────────────────┘
```
**Aplicaci\u00f3n:**
- Fase 1 (Primeras 2 horas): Observar, no operar
- Fase 2 (Horas 3-4): Identificar manipulaci\u00f3n
- Fase 3 (Horas 5+): Operar el movimiento real
---
## Smart Money Concepts (SMC)
### Fundamentos SMC
SMC es una metodolog\u00eda que se enfoca en la estructura del mercado y c\u00f3mo el dinero institucional crea setups de trading.
### 1. Change of Character (CHOCH)
**Definici\u00f3n:** Cambio en la estructura del mercado que indica posible reversi\u00f3n
#### CHOCH Bullish
```
ESTRUCTURA BAJISTA → CHOCH → ESTRUCTURA ALCISTA
Lower High Lower High
\ /
\ /
\ / Higher High
\ / /\
\ / / \
\ / CHOCH / \
Lower Low / \
\ / \
\ / \
\ / Higher Low
\ /
Lower Low
```
**Criterios:**
1. Mercado en tendencia bajista (lower highs, lower lows)
2. Precio rompe \u00faltimo lower high
3. Formaci\u00f3n de higher low
4. **CHOCH confirmado** cuando precio supera previous high
#### CHOCH Bearish
```
ESTRUCTURA ALCISTA → CHOCH → ESTRUCTURA BAJISTA
Higher Low Higher Low
/ \
/ \
/ \ Lower Low
/ \ /
/ CHOCH \ /
Higher High \ /
\ /
\ / Lower High
\/
Higher High
```
#### Implementaci\u00f3n
```python
def detect_choch(df, window=20):
"""
Detecta Change of Character
"""
choch_signals = []
for i in range(window * 2, len(df)):
# Identify recent swings
recent = df.iloc[i-window:i]
# Swing highs/lows
swing_highs = recent[recent['high'] == recent['high'].rolling(5, center=True).max()]
swing_lows = recent[recent['low'] == recent['low'].rolling(5, center=True).min()]
if len(swing_highs) >= 2 and len(swing_lows) >= 2:
# Check for bullish CHOCH
# Previous structure: lower lows
prev_lows = swing_lows['low'].values[-2:]
if prev_lows[1] < prev_lows[0]:
# Break of previous high
prev_high = swing_highs['high'].values[-2]
if df['close'].iloc[i] > prev_high:
choch_signals.append({
'type': 'bullish_choch',
'index': i,
'price': df['close'].iloc[i],
'broken_level': prev_high
})
# Check for bearish CHOCH
# Previous structure: higher highs
prev_highs = swing_highs['high'].values[-2:]
if prev_highs[1] > prev_highs[0]:
# Break of previous low
prev_low = swing_lows['low'].values[-2]
if df['close'].iloc[i] < prev_low:
choch_signals.append({
'type': 'bearish_choch',
'index': i,
'price': df['close'].iloc[i],
'broken_level': prev_low
})
return choch_signals
```
### 2. Break of Structure (BOS)
**Definici\u00f3n:** Continuaci\u00f3n de la estructura existente, confirmando la tendencia
#### BOS Bullish (Continuaci\u00f3n alcista)
```
Higher High #2
/\
/ \
/ \
/ \ Higher High #1
/ \ /\
/ \ / \
/ BOS \ / \
→ \ / \
\/ \
Higher Low \
\
Higher Low
```
**Criterios:**
1. Tendencia alcista establecida
2. Precio rompe previous higher high
3. **BOS confirmado**
4. Esperar pullback para entrada
#### BOS Bearish (Continuaci\u00f3n bajista)
```
Lower Low #1
\
\ Lower Low #2
\ /
\ /
\ /
\ / BOS
\ / ←
\/
Lower High
\
\
Lower High
```
#### Diferencia BOS vs CHOCH
| Aspecto | BOS | CHOCH |
|---------|-----|-------|
| **Direcci\u00f3n** | Continuaci\u00f3n | Reversi\u00f3n |
| **Estructura** | Confirma tendencia | Rompe tendencia |
| **Trading** | Entrar en direcci\u00f3n del BOS | Entrar contra tendencia previa |
| **Riesgo** | Menor (con tendencia) | Mayor (contra tendencia) |
#### Implementaci\u00f3n
```python
def detect_bos(df, window=20):
"""
Detecta Break of Structure
"""
bos_signals = []
for i in range(window * 2, len(df)):
recent = df.iloc[i-window:i]
# Swing points
swing_highs = recent[recent['high'] == recent['high'].rolling(5, center=True).max()]
swing_lows = recent[recent['low'] == recent['low'].rolling(5, center=True).min()]
if len(swing_highs) >= 2 and len(swing_lows) >= 2:
# Bullish BOS (uptrend continuation)
prev_highs = swing_highs['high'].values[-2:]
prev_lows = swing_lows['low'].values[-2:]
# Check for higher highs and higher lows
if prev_highs[1] > prev_highs[0] and prev_lows[1] > prev_lows[0]:
# Current price breaks recent high
if df['close'].iloc[i] > prev_highs[1]:
bos_signals.append({
'type': 'bullish_bos',
'index': i,
'price': df['close'].iloc[i],
'broken_level': prev_highs[1],
'trend': 'uptrend'
})
# Bearish BOS (downtrend continuation)
if prev_highs[1] < prev_highs[0] and prev_lows[1] < prev_lows[0]:
# Current price breaks recent low
if df['close'].iloc[i] < prev_lows[1]:
bos_signals.append({
'type': 'bearish_bos',
'index': i,
'price': df['close'].iloc[i],
'broken_level': prev_lows[1],
'trend': 'downtrend'
})
return bos_signals
```
### 3. Inducement
**Definici\u00f3n:** Movimiento falso dise\u00f1ado para atraer traders retail antes de la reversi\u00f3n real
#### Tipos de Inducement
**Bullish Inducement (antes de subida):**
```
┌─── Real Move (Up)
/
/
────────────/────────── Resistance
/
/
─────────┼────────────── Support
│\
│ \
│ └─ Inducement (falso break down)
│ [Trap para cortos]
[Stop Loss Hunt]
```
**Bearish Inducement (antes de caída):**
```
[Stop Loss Hunt]
│ ┌─ Inducement (falso break up)
│ / [Trap para largos]
│/
─────────┼────────────── Resistance
\
\
────────────\────────── Support
\
\
└─── Real Move (Down)
```
#### Caracter\u00edsticas
1. **Falso breakout** de nivel clave
2. **R\u00e1pida reversi\u00f3n** (1-3 candles)
3. **Caza de stops** de traders retail
4. **Precede** al movimiento real
#### Detecci\u00f3n
```python
def detect_inducement(df, key_levels, window=5):
"""
Detecta movimientos de inducement
"""
inducements = []
for i in range(window, len(df)):
# Check for false breakouts of key levels
for level in key_levels:
# Bullish inducement (false breakdown)
if df['low'].iloc[i] < level['price'] * 0.998:
# Rapid reversal
if df['close'].iloc[i] > level['price']:
# Confirm reversal continues
if i < len(df) - 2:
next_closes = df['close'].iloc[i+1:i+3]
if (next_closes > level['price']).all():
inducements.append({
'type': 'bullish_inducement',
'index': i,
'level': level['price'],
'low': df['low'].iloc[i],
'close': df['close'].iloc[i],
'expected_move': 'up'
})
# Bearish inducement (false breakout)
elif df['high'].iloc[i] > level['price'] * 1.002:
# Rapid reversal
if df['close'].iloc[i] < level['price']:
# Confirm reversal continues
if i < len(df) - 2:
next_closes = df['close'].iloc[i+1:i+3]
if (next_closes < level['price']).all():
inducements.append({
'type': 'bearish_inducement',
'index': i,
'level': level['price'],
'high': df['high'].iloc[i],
'close': df['close'].iloc[i],
'expected_move': 'down'
})
return inducements
```
### 4. Displacement
**Definici\u00f3n:** Movimiento r\u00e1pido y fuerte que indica entrada de dinero institucional
#### Caracter\u00edsticas de Displacement
```
Displacement Bullish:
┌── Strong momentum
/│
/ │
/ │ Large candles
/ │
/ │ High volume
────────────────/─────┴────────
/
│ Displacement
│ (3-5 candles up)
[Institutional Entry]
```
**Criterios:**
1. **3-5 candles** consecutivos en misma direcci\u00f3n
2. **Cuerpos grandes** (> 70% del rango)
3. **Volumen alto** (> 1.5x promedio)
4. **Movimiento > 1.5 * ATR**
5. **Sin retrocesos** significativos
#### Implementaci\u00f3n
```python
def detect_displacement(df, min_candles=3, min_atr_multiple=1.5):
"""
Detecta movimientos de displacement
"""
atr = calculate_atr(df, 14)
displacements = []
for i in range(min_candles, len(df)):
# Check last N candles
recent = df.iloc[i-min_candles:i+1]
# Bullish displacement
all_bullish = (recent['close'] > recent['open']).all()
large_bodies = ((recent['close'] - recent['open']).abs() / (recent['high'] - recent['low']) > 0.7).all()
high_volume = (recent['volume'] > recent['volume'].rolling(20).mean() * 1.5).any()
strong_move = (recent['close'].iloc[-1] - recent['close'].iloc[0]) > (atr.iloc[i] * min_atr_multiple)
if all_bullish and large_bodies and high_volume and strong_move:
displacements.append({
'type': 'bullish_displacement',
'index': i,
'start_price': recent['close'].iloc[0],
'end_price': recent['close'].iloc[-1],
'move_size': recent['close'].iloc[-1] - recent['close'].iloc[0],
'candles': min_candles,
'strength': (recent['close'].iloc[-1] - recent['close'].iloc[0]) / atr.iloc[i]
})
# Bearish displacement
all_bearish = (recent['close'] < recent['open']).all()
strong_move_down = (recent['close'].iloc[0] - recent['close'].iloc[-1]) > (atr.iloc[i] * min_atr_multiple)
if all_bearish and large_bodies and high_volume and strong_move_down:
displacements.append({
'type': 'bearish_displacement',
'index': i,
'start_price': recent['close'].iloc[0],
'end_price': recent['close'].iloc[-1],
'move_size': recent['close'].iloc[0] - recent['close'].iloc[-1],
'candles': min_candles,
'strength': (recent['close'].iloc[0] - recent['close'].iloc[-1]) / atr.iloc[i]
})
return displacements
```
### 5. Liquidity Voids
**Definici\u00f3n:** Zonas con muy poco volumen donde precio se movi\u00f3 r\u00e1pido (similar a FVG pero con enfoque en volumen)
```
High Volume Node
────────────────
│ Liquidity Void
│ (low volume area)
┌──────────┘
────┴────────────
Low Volume Node
```
**Uso:**
- Voids act\u00faan como im\u00e1n para el precio
- Alta probabilidad de que precio vuelva a rellenar
- Zonas de entrada de bajo riesgo
---
## Estrategia de Confluence
### Concepto de Confluence
**Confluence = Confluencia de m\u00faltiples factores alcistas/bajistas**
Cuantos m\u00e1s factores apunten en la misma direcci\u00f3n, mayor probabilidad de \u00e9xito.
### Sistema de Scoring
#### Factores Alcistas (Bullish Confluence)
| Factor | Peso | Criterio |
|--------|------|----------|
| **AMD Phase** | 25% | Accumulation confirmada |
| **ICT OTE** | 20% | Precio en discount zone (21-38%) |
| **ICT Killzone** | 15% | London Open o NY AM |
| **SMC CHOCH** | 15% | Bullish CHOCH reciente |
| **Order Block** | 10% | Bullish OB cerca |
| **FVG** | 5% | Bullish FVG sin rellenar |
| **Liquidity** | 5% | SSL sweep reciente |
| **Displacement** | 5% | Bullish displacement |
#### C\u00e1lculo de Confluence Score
```python
def calculate_confluence_score(signals):
"""
Calcula score de confluence (0-1)
"""
weights = {
'amd_accumulation': 0.25,
'ict_ote_discount': 0.20,
'ict_killzone_high': 0.15,
'smc_bullish_choch': 0.15,
'order_block_bullish': 0.10,
'fvg_bullish': 0.05,
'ssl_sweep': 0.05,
'displacement_bullish': 0.05
}
score = 0.0
active_signals = []
for signal, weight in weights.items():
if signals.get(signal, False):
score += weight
active_signals.append(signal)
return {
'score': score,
'active_signals': active_signals,
'num_confirmations': len(active_signals),
'bias': 'bullish' if score >= 0.6 else 'neutral'
}
```
### Niveles de Confluence
| Score | Nivel | Acci\u00f3n |
|-------|-------|---------|
| **0.80-1.00** | Excelente | Tama\u00f1o de posici\u00f3n completo |
| **0.60-0.79** | Buena | Tama\u00f1o de posici\u00f3n reducido (70%) |
| **0.40-0.59** | Media | Solo operar con confirmaci\u00f3n adicional |
| **0.00-0.39** | Baja | Evitar entrada |
### Ejemplo de Setup de Alta Confluence
```
BTCUSDT - 2024-12-05 09:30 EST
FACTORES ALCISTAS ACTIVOS:
✓ AMD Phase: Accumulation (confidence: 0.78)
✓ ICT OTE: Precio en 32% del rango (discount)
✓ ICT Killzone: NY AM (09:30)
✓ SMC CHOCH: Bullish CHOCH hace 15 min
✓ Order Block: Bullish OB a $89,200
✓ SSL Sweep: Sweep de low hace 30 min
CONFLUENCE SCORE: 0.85 (Excelente)
SETUP:
Entry: $89,350
Stop Loss: $89,150 (below SSL sweep)
Take Profit: $90,100 (weekly high)
R:R: 3.75:1
RESULTADO:
TP alcanzado en 2.5 horas
+$750 (+0.84%)
```
---
## Integraci\u00f3n AMD + ICT + SMC
### Framework Unificado
```
┌─────────────────────────────────────────────────────┐
│ ANÁLISIS MULTI-LAYER │
├─────────────────────────────────────────────────────┤
│ │
│ LAYER 1: AMD (Fase del Mercado) │
│ ├─ Accumulation / Manipulation / Distribution │
│ └─ Determina DIRECCI\u00d3N general │
│ │
│ LAYER 2: ICT (Timing & Zonas) │
│ ├─ Killzones (CU\u00c1NDO operar) │
│ ├─ OTE Zones (D\u00d3NDE entrar) │
│ └─ Premium/Discount (PRECIO) │
│ │
│ LAYER 3: SMC (Estructura & Confirmaci\u00f3n) │
│ ├─ BOS/CHOCH (Estructura) │
│ ├─ Inducement (Trampas) │
│ └─ Displacement (Fuerza) │
│ │
│ LAYER 4: ML Models (Predicci\u00f3n) │
│ ├─ RangePredictor (Delta High/Low) │
│ ├─ TPSLClassifier (Probabilidad TP) │
│ └─ SignalGenerator (Se\u00f1al final) │
│ │
└─────────────────────────────────────────────────────┘
```
### Decision Tree
```python
def unified_trading_decision(market_data, models):
"""
Framework unificado de decisi\u00f3n
"""
decision = {
'action': 'hold',
'confidence': 0.0,
'reasoning': []
}
# LAYER 1: AMD Phase
amd_phase = models['amd_detector'].detect_phase(market_data)
if amd_phase['phase'] == 'accumulation' and amd_phase['confidence'] > 0.7:
decision['reasoning'].append('AMD: Strong accumulation phase')
decision['confidence'] += 0.25
decision['bias'] = 'bullish'
elif amd_phase['phase'] == 'distribution' and amd_phase['confidence'] > 0.7:
decision['reasoning'].append('AMD: Strong distribution phase')
decision['confidence'] += 0.25
decision['bias'] = 'bearish'
else:
decision['reasoning'].append(f'AMD: {amd_phase["phase"]} (low conviction)')
return decision # Exit early if no clear phase
# LAYER 2: ICT
killzone = identify_killzone(market_data['timestamp'].iloc[-1])
if is_high_probability_killzone(killzone):
decision['reasoning'].append(f'ICT: High probability killzone ({killzone})')
decision['confidence'] += 0.15
ote_zones = calculate_ote_zones(
market_data['high'].tail(50).max(),
market_data['low'].tail(50).min()
)
current_price = market_data['close'].iloc[-1]
position, zone = calculate_premium_discount(
current_price,
ote_zones['fib_100'],
ote_zones['fib_0']
)
if decision['bias'] == 'bullish' and zone in ['discount', 'extreme_discount']:
decision['reasoning'].append(f'ICT: Price in {zone} zone (good buy area)')
decision['confidence'] += 0.20
elif decision['bias'] == 'bearish' and zone in ['premium', 'extreme_premium']:
decision['reasoning'].append(f'ICT: Price in {zone} zone (good sell area)')
decision['confidence'] += 0.20
# LAYER 3: SMC
choch_signals = detect_choch(market_data)
bos_signals = detect_bos(market_data)
if decision['bias'] == 'bullish':
bullish_choch = [s for s in choch_signals if s['type'] == 'bullish_choch']
if bullish_choch and len(bullish_choch) > 0:
decision['reasoning'].append('SMC: Recent bullish CHOCH')
decision['confidence'] += 0.15
bullish_bos = [s for s in bos_signals if s['type'] == 'bullish_bos']
if bullish_bos:
decision['reasoning'].append('SMC: Bullish BOS confirms uptrend')
decision['confidence'] += 0.10
# LAYER 4: ML Predictions
range_pred = models['range_predictor'].predict(market_data)
tpsl_pred = models['tpsl_classifier'].predict(market_data, current_price)
if decision['bias'] == 'bullish':
if range_pred['delta_high'] > range_pred['delta_low'] * 2:
decision['reasoning'].append('ML: Range predictor favors upside')
decision['confidence'] += 0.15
relevant_tpsl = [p for p in tpsl_pred if p.recommended_action == 'long']
if relevant_tpsl and relevant_tpsl[0].prob_tp_first > 0.65:
decision['reasoning'].append(f'ML: High TP probability ({relevant_tpsl[0].prob_tp_first:.2%})')
decision['confidence'] += 0.15
# Final decision
if decision['confidence'] >= 0.70:
decision['action'] = 'long' if decision['bias'] == 'bullish' else 'short'
elif decision['confidence'] >= 0.50:
decision['action'] = 'wait_confirmation'
else:
decision['action'] = 'hold'
return decision
```
---
## Implementaci\u00f3n en ML
### Features Derivados de ICT/SMC
```python
# Features ICT
ict_features = {
# OTE
'ote_position': position_in_range, # 0-1
'in_discount_zone': 1 if position < 0.38 else 0,
'in_premium_zone': 1 if position > 0.62 else 0,
'in_ote_buy_zone': 1 if 0.62 <= position <= 0.79 else 0,
'in_ote_sell_zone': 1 if 0.21 <= position <= 0.38 else 0,
# Killzones
'is_london_kz': 1 if killzone == 'london_open' else 0,
'is_ny_kz': 1 if killzone == 'ny_am' else 0,
'killzone_strength': session_strength,
# Ranges
'weekly_range_position': weekly_position,
'daily_range_position': daily_position,
'range_expansion': current_range / average_range,
# Market Maker Models
'mmsm_detected': 1 if mm_model == 'MMSM' else 0,
'mmbm_detected': 1 if mm_model == 'MMBM' else 0,
}
# Features SMC
smc_features = {
# Structure
'choch_bullish_recent': count_recent_bullish_choch(),
'choch_bearish_recent': count_recent_bearish_choch(),
'bos_bullish_recent': count_recent_bullish_bos(),
'bos_bearish_recent': count_recent_bearish_bos(),
# Inducement
'inducement_detected': 1 if inducement_count > 0 else 0,
'inducement_type': encode_inducement_type(),
# Displacement
'displacement_strength': displacement_atr_multiple,
'displacement_direction': 1 if displacement == 'bullish' else -1 if displacement == 'bearish' else 0,
# Liquidity
'liquidity_void_proximity': distance_to_nearest_void,
'void_fill_probability': calculate_void_fill_prob(),
}
# Combined feature vector
all_features = {
**base_technical_features,
**amd_features,
**ict_features,
**smc_features
}
```
### Target Engineering
```python
def label_with_confluence(df, i, forward_window=18):
"""
Etiqueta considerando confluence de se\u00f1ales
"""
future = df.iloc[i:i+forward_window]
# Calculate confluence at time i
confluence = calculate_confluence_score({
'amd_accumulation': check_amd_accumulation(df, i),
'ict_ote_discount': check_ote_discount(df, i),
'ict_killzone_high': check_high_prob_killzone(df, i),
'smc_bullish_choch': check_bullish_choch(df, i),
# ... otros
})
# Success criteria based on confluence
if confluence['score'] >= 0.7:
# High confluence → higher target
target_move = future['high'].max() / df['close'].iloc[i] - 1
if target_move >= 0.015: # 1.5% move
return 1 # Strong buy
elif target_move >= 0.008: # 0.8% move
return 0.5 # Weak buy
elif confluence['score'] >= 0.5:
# Medium confluence → normal target
target_move = future['high'].max() / df['close'].iloc[i] - 1
if target_move >= 0.01: # 1% move
return 1
return 0 # No signal
```
---
## Referencias
### ICT Resources
1. **Inner Circle Trader YouTube** - Free educational series
2. **ICT Mentorship 2022** - Comprehensive course
3. **The Forex Mindset** - ICT concepts breakdown
### SMC Resources
4. **The Trading Channel** - SMC tutorials
5. **Stacey Burke Trading** - SMC + price action
6. **GCT (Global Capital Trading)** - SMC framework
### Combined Methodologies
7. **Trading Rush** - AMD + ICT integration
8. **Forex Mastery** - Multi-concept confluence
9. **The Secret Mindset** - Institutional trading logic
### Academic Background
10. Harris, L. (2003). "Trading and Exchanges" - Market microstructure
11. Aldridge, I. (2013). "High-Frequency Trading" - Institutional behavior
12. Narang, R. (2013). "Inside the Black Box" - Quant strategies
---
**Documento Generado:** 2025-12-05
**Pr\u00f3xima Revisi\u00f3n:** 2025-Q1
**Contacto:** trading-strategist@trading.ai