Curso de Programación. 7.1. Average Directional Index

Esta semana arrancamos con el tercer bloque de nuestro curso de programación, el cual estará compuesto
por los temas del 7 al 9. A lo largo de éste bloque, profundizaremos en materias más complejas, como puede ser el uso combinado de varios indicadores, la aplicación de filtros horarios o el uso de órdenes de salida.

Comenzaremos por el tema 7, donde nos centraremos en el estudio de los índices direccionales más conocidos, como son el ADX y el resto de indicadores asociados a éste.

7.1. Average Directional Index (ADX)

El Average Directional Index (índice direccional medio) es probablemente el índice direccional más conocido. Desarrollado por Welles Wilder en 1978, permite medir la fuerza de la tendencia del mercado mediante un valor que oscilará entre 0 y 100. Obviamente, cuanto mayor sea el valor del índice, informará de una tendencia más relevante en el movimiento de los precios.

Aunque el valor del índice puede llegar teóricamente hasta 100, raramente su valor supera los 60 puntos, de modo que cuando alcanza este valor extremo puede ser tomado como un momento de posible agotamiento del impulso.

Por otro lado, cuando el valor del indicador es inferior a 20, se suele considerar que el movimiento del precio está siendo neutro o poco relevante.



Como vemos, el ADX permite medir la fuerza de la tendencia, no así la dirección de la misma. Para ello, existen los indicadores direccionales positivo y negativo, los cuales vienen a representar la relevancia del movimiento alcista y bajista dentro de la trayectoria de los precios.


7.2. Fórmulas

El ADX se calcula, de hecho, a partir de los dos índices direccionales positivo y negativo, tal que así:



A su vez, los índices direccionales positivo y negativo se calculan en base al True Range (valor verdadero):



Un valor mayor del DI+ respecto al DI- implicará que la presencia alcista es más relevante, mientras que una situación en sentido contrario implicará una mayor presencia bajista.



El estudio conjunto de los dos direccionales acompañados por el índice de fuerza, nos permite elaborar un análisis de la detección de tendencias alcistas y bajistas confirmadas. Este análisis lo veremos con detalle más adelante. En el siguiente apartado vamos a desarrollar un ejemplo donde veremos el uso del ADX como filtro de entrada.

7.3. Estrategia MACD con Filtro ADX

La estrategia de ejemplo que vamos a desarrollar va a utilizar como base un sencillo sistema de cruces del MACD con si Media Señal, análisis que hemos desarrollado anteriormente. Sin embargo, en esta ocasión, veremos cómo filtrar las señales dadas por el MACD a partir de los movimientos oscilatorios del ADX. La regla que vamos a seguir va a ser la siguiente:

1) Entraremos a largo cuando el MACD sea mayor que su Media Señal y además el ADX supere a su Banda ADX (25).

2) Entraremos a corto cuando el MACD sea menor que su Media Señal y además el ADX supere a su Banda ADX (25).

Como vemos, sólo tendremos en cuenta los cruces del MACD que vengan acompañados por un crecimiento de la volatilidad: O dicho de otro modo, retrasamos el momento de entrada hasta que el ADX confirme que existe direccionalidad:



Además de estas reglas, el sistema lleva incorporadas dos condiciones más que permiten mejorar los resultados:

1) Un negocio por impulso. El sistema sólo va a permitir una entrada por impulso, o dicho de otro modo, sólo va a entrar una vez por cada cruce del ADX sobre su banda.

2) Control de negocio abierto. El sistema espera a la ejecución de un nuevo negocio para deshabilitar el último cruce del ADX. Para ello, se apoya en el uso de la función GetMarketPosition.

3) Entrar sólo cuando el ADX suba. No permitir realizar un nuevo negocio si el ADX es decreciente, ya que puede ser señal de debilitamiento del impulso.

Veamos a continuación cómo quedaría el sistema:

Código PDV

Código VBA

'¡¡ Parameters
Dim Contratos As Long '1
Dim PeriodoADX As Integer '14
Dim BandaADX As Double '25
Dim PeriodoMACD1 As Integer '12
Dim PeriodoMACD2 As Integer '26
Dim PeriodoMACDSIG As Integer '9
'Parameters !!
Dim MACDData As DataIdentifier
Dim ADXData As DataIdentifier
Dim CruceADX As Integer
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
    MACDData = .GII(MACD, Data, PeriodoMACD1, PeriodoMACD2, PeriodoMACDSIG, PriceClose, 0)
    ADXData = .GII(ADX, Data, PeriodoADX, BandaADX)
    CruceADX = 0
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
    Dim MACDact As Double
    Dim MESIGact As Double
    Dim ADXact As Double
    Dim ADXant As Double
    Dim gmp As Integer

    MACDact = .GIV(MACDData)
    MESIGact = .GIV(MACDData, 0, 2)
    ADXact = .GIV(ADXData)
    ADXant = .GIV(ADXData, 1, 1)
    gmp = .GetMarketPosition
    If ADXant <> NullValue Then
        If ADXact > BandaADX And ADXant <= BandaADX Then
            CruceADX = 1
        ElseIf ADXact < BandaADX And ADXant >= BandaADX Then
            CruceADX = -1
        End If
    End If
    If CruceADX = 1 Then
        If ADXact > ADXant Then
            If MACDact > MESIGact And gmp <> 1 Then
                .Buy AtClose, Contratos
                CruceADX = 0
            ElseIf MACDact < MESIGact And gmp <> -1 Then
                .Sell AtClose, Contratos
                CruceADX = 0
            End If
        End If
    End If
End With
End Sub

Comentarios

Entradas populares de este blog

Como consultar el GAP % de un conjunto de valores

Bollinger Volatility Oscillator N

MANEJO DE PLANTILLAS. Eliminar plantilla de un gráfico activa