Estrategias en Visual Chart 6. Estrategia sobre PPO

En el presente artículo nos vamos a centrar en el indicador Percentage Price Oscillator (PPO), un oscilador de características similares al indicador MACD, con la diferencia principal de que éste muestra los resultados en términos porcentuales.

A continuación, vamos a ver el diseño de una estrategia que utiliza las señales dadas por éste indicador. Pueden encontrarlo dentro de la lista de estrategias públicas disponibles en Visual Chart 6, en la subcarpeta Volatility con el nombre de PPO System.


Señales de entrada

Las condiciones de entrada de la estrategia van a ser muy simples: Una vez se produzca el cruce con la banda central del indicador, se generará una señal a mercado de compra o venta, en función de la dirección de la tendencia.


Si la dirección del indicador es alcista, la señal será de compra.

Si la dirección del indicador es bajista, la señal será obviamente de venta.



Señales de salida


Si se produce el fallo del indicador, sencillamente la estrategia pasará a cambiar la dirección de la entrada, manteniéndose dentro de mercado.


Si se produce un acierto del indicador, esperar al siguiente cruce del mismo puede implicar perder la oportunidad dada por la señal, ya que en situaciones de mucha volatilidad, el giro del indicador se puede producir a niveles de precios muy cercanos al momento de entrada. Con el fin de aprovechar el impulso acertado, añadiremos además un nivel objetivo, de modo que al alcanzarlo, cerraremos posiciones.


Desarrollo de la estrategia


Aunque como decimos la estrategia ya está desarrollada, vamos a explicar cómo sería el proceso de creación del mismo utilizando el entorno de programación VB.NET o bien la plataforma de Diseño Visual.


El primer paso que debemos realizar es añadir el indicador a la estrategia.


En VB.NET sería:


''' <summary>
''' Declaración del indicador PPO.
''' </summary>
''' <remarks></remarks>
Dim ppodata As PPO

Debemos especificar, además, que las variables del indicador sean parámetros, con el fin de que luego podamos probar con distintos periodos dentro de la estrategia. 




En VB.NET sería:

<Parameter(Name:="PeriodoME1", DefaultValue:=12, MinValue:=2, MaxValue:=100, Step:=1)>
Private av1period As Integer


<Parameter(Name:="PeriodoME2", DefaultValue:=26, MinValue:=2, MaxValue:=100, Step:=1)>

Private av2period As Integer


<Parameter(Name:="PeriodoMESIG", DefaultValue:=9, MinValue:=2, MaxValue:=100, Step:=1)>

Private avsigperiod As Integer


Y la creación de la clase PPO sería:


''' <summary>
''' This method is used to configure the strategy and is called once before any strategy method is called.
''' </summary>
Public Overrides Sub OnInitCalculate()
Me.ppodata = New PPO(Me.Data, Me.av1period, Me.av2period, Me.avsigperiod)
End Sub

Además, de los parámetros del indicador, como hemos dicho anteriormente, vamos a incluir una variable objetivo que nos sirva para determinar a cuantos puntos se va a situar el nivel de ganancia.



En VB.NET sería:


<Parameter(Name:="Objetivo", DefaultValue:=100, MinValue:=10, MaxValue:=1000, Step:=1)>
Private targetprofit As Integer

El siguiente paso será crear las reglas de compra y venta. Para la compra, buscaremos el cruce alcista del indicador  sobre la línea cero.  Definimos un cruce como el cambio de dirección de un valor respecto a otro entre la barra actual y la barra anterior. La condición sería tal que así:



En el caso de la venta, buscaremos el cruce bajista. La forma de definir dicho cruce es similar, con la diferencia de que en este caso, el valor del indicador en la barra actual estará por debajo de cero.


Hecho esto, ya sólo queda diseñar las reglas de salida. En esta caso consistirá en una orden limitada a x puntos del precio de entrada. 

Para determinar el punto de entrada usaremos una nueva variable llamada GEP. Si en la barra actual ya estamos abiertos, el precio de entrada estará guardado en la función GetEntryPrice que habremos añadido previamente. Si acabamos de lanzar una nueva orden, el precio de entrada equivale al valor de cierre de la barra puesto que la orden ha sido a mercado:



En cualquiera de los dos casos, la orden de salida quedaría de la siguiente forma:




Las reglas de entrada y salida en VB.NET quedarían de la siguiente forma:
''' <summary>
''' Called on each bar update event.
''' </summary>
''' <param name="Bar">Bar index</param>
Public Overrides Sub OnCalculateBar(ByVal Bar As Integer)


Dim hasentered As Integer = 0
Dim gep As Double = Me.GetEntryPrice()

If (Me.GetMarketPosition() <> 1 And Me.ppodata.Value(1) <= 0 And Me.ppodata.Value() > 0 And Me.ppodata.Value(1) <> CDbl(ErrorCodes.NullValue)) Then
Me.Buy(TradeType.AtClose, 1)
hasentered = 1
gep = Me.Data.Close()
Else
If (Me.GetMarketPosition() <> -1 And Me.ppodata.Value(1) >= 0 And Me.ppodata.Value() < 0 And
Me.ppodata.Value(1) <> CDbl(ErrorCodes.NullValue)) Then
Me.Sell(TradeType.AtClose, 1)
hasentered = -1
gep = Me.Data.Close()
End If
End If
If (hasentered = 1 Or Me.GetMarketPosition() = 1) Then
Me.ExitLong(TradeType.AtLimit, 1, gep + Me.targetprofit)
Else
If (hasentered = -1 Or Me.GetMarketPosition() = -1) Then
Me.ExitShort(TradeType.AtLimit, 1, gep - Me.targetprofit)
End If
End If
End Sub

Comentarios

Entradas populares de este blog

Trading Tools: Descarga de históricos para Visual Chart 6

KDJ - Indicador Stochastic %J

El indicador Relative Strength Mansfield with Index