Documentación
Aplicaciones
Última actualización el 21. 12. 2021 por clonex / Ivan Hudec
ATR Volatilidad Dimensionamiento simple
Contenido de la página
En situaciones en las que la volatilidad a corto plazo está subiendo o bajando, puede tener sentido cambiar el tamaño de la posición. En el siguiente tutorial le mostraremos un sencillo snippet en StrategyQuant X x que le permite aumentar/disminuir el tamaño de una operación. Snippet que puede descargar aquí.
Paso 1 - Crear un nuevo fragmento de gestión monetaria
Abrir Editor de códigohaga clic en Crear nuevo y elija Gestión del dinero en la parte inferior. Ponle un nombre ATRVolatilidadTamaño.
Esto creará un nuevo fragmento ATRVolatilidadTamaño.java en carpeta Usuario/Snippets/SQ/Gestión del dinero
Paso 2 - Definir parámetros
En este punto, definimos los parámetros que utilizaremos más adelante cuando implementemos el snippet. En este caso, definiremos lo siguiente
- Tamaño: valor por defecto para el tamaño de la operación.
- Multiplicador - Multiplicador que utilizaremos para cambiar el tamaño de la operación.
- FastATR- Periodo ATR rápido
- SlowATR- Periodo ATR lento
@ClassConfig(name="Tamaño de volatilidad ATR", display="Tamaño de volatilidad ATR: lotes #Size# con multiplicación #Multiplier#") @Ayuda("<b>Dimensionamiento de la volatilidad ATR</b>") @Description("Tamaño de la volatilidad ATR, #Size# y #Multiplier#") @SortOrder(100) public class ATRVolatilitySizing extends MoneyManagementMethod { @Parameter(defaultValue="0.1", minValue=0.01d, name="Tamaño de orden", maxValue=1000000d, step=0.1d, category="Por defecto") @Help("Tamaño de la orden (número de lotes para forex)") public double Tamaño; @Parámetro(defaultValue="0.1", minValue=0.01d, name="Multiplicador", maxValue=1000, step=0.1d, category="Por defecto") @Ayuda("Multiplicador") public double Multiplicador; @Parameter(defaultValue="5", minValue=2, name="Periodo ATR rápido", maxValue=480, step=1, category="Por defecto") @Help("Periodo ATR rápido") public int Periodo FastATR; @Parameter(defaultValue="20", minValue=2, name="Periodo ATR lento", maxValue=480, step=1, category="Por defecto") @Help("Periodo ATR lento") public int Periodo ATR lento;
Paso 3 - Implementación del método doble computeTradeSize
En este método se especifica el tamaño del lote. Vale la pena mencionar los parámetros del método.
- StrategyBase strategy es la clase base para la estrategia, a partir de ella hay clases derivadas que implementan funciones adicionales
Cadena símbolo - el símbolo con el que se ordenó la estrategia - byte orderType
- precio doble - precio de apertura de la operación
- doble sl - stop loss
- double tickSize tamaño del tick
- double pointValue - valor del punto.
Con este método podemos realizar cálculos más sencillos, pero también más complejos. En nuestro caso, fijamos el precio de cierre anterior y dos valores diferentes de ATR. Si el ATR a corto plazo es superior al ATR a largo plazo, cambiamos el tamaño de la posición.
@Override public double computeTradeSize(StrategyBase strategy, String symbol, byte orderType, double price, double sl, double tickSize, double pointValue) throws Exception { double tradeSize; // obtener cierre anterior double prevClose = strategy.MarketData.Chart(symbol).Close(1); // obtener ATR redondeado con periodo más lento double slowValueATR = SQUtils.round(strategy.getATRValue(strategy.MarketData.Chart(symbol),SlowATR, 1), 5); // obtener ATR redondeado con periodo más rápido double fastValueATR = SQUtils.round(strategy.getATRValue(strategy.MarketData.Chart(symbol),FastATR, 1), 5); // si la volatilidad a corto sube, modifica el tamaño de la operación if(fastValueATR>slowValueATR){ tradeSize = Tamaño*Multiplicador; } // si no, no haga nada else tradeSize = Tamaño; // devolver tamaño de operación devolver tradeSize; }
Paso 4 - Uso del fragmento de tamaño de volatilidad ATR
Tras reiniciar SQX, encontrará el nuevo fragmento en la pestaña Gestión monetaria.
En el siguiente gráfico se puede ver la evolución de las operaciones.
Código comentado
/* * Copyright (c) 2017-2018, StrategyQuant - Todos los derechos reservados. * * Código en este archivo se hizo de buena fe que es correcto y hace lo que debe. * Si ha encontrado un error en este código O tiene una sugerencia de mejora O desea incluir * su propio fragmento de código en nuestra biblioteca estándar por favor póngase en contacto con nosotros en: * https://roadmap.strategyquant.com * * Este código sólo puede ser utilizado dentro de los productos StrategyQuant. * Cada propietario de una licencia válida (gratuita, de prueba o comercial) de cualquier producto StrategyQuant * se le permite utilizar libremente, copiar, modificar o hacer trabajos derivados de este código sin limitaciones, * para ser utilizado en todos los productos StrategyQuant y compartir sus modificaciones o trabajos derivados * con la comunidad StrategyQuant. * * EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, * INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN DETERMINADO * PROPÓSITO Y NO INFRACCIÓN. EN NINGÚN CASO SERÁN LOS AUTORES RESPONSABLES DE CUALQUIER RECLAMACIÓN, DAÑO * U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, EXTRACONTRACTUAL O DE OTRO TIPO, QUE SURJA DE, * O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS OPERACIONES CON EL SOFTWARE. * */ paquete SQ.MoneyManagement; importar com.strategyquant.lib.*; import com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; @ClassConfig(name="Tamaño de volatilidad ATR", display="Tamaño de volatilidad ATR: lotes #Size# con multiplicación #Multiplier#") @Ayuda("<b>Dimensionamiento de la volatilidad ATR</b>") @Description("Tamaño de la volatilidad ATR, #Size# y #Multiplier#") @SortOrder(100) public class ATRVolatilitySizing extends MoneyManagementMethod { @Parameter(defaultValue="0.1", minValue=0.01d, name="Tamaño de orden", maxValue=1000000d, step=0.1d, category="Por defecto") @Help("Tamaño de la orden (número de lotes para forex)") public double Tamaño; @Parámetro(defaultValue="0.1", minValue=0.01d, name="Multiplicador", maxValue=1000, step=0.1d, category="Por defecto") @Ayuda("Multiplicador") public double Multiplicador; @Parameter(defaultValue="5", minValue=2, name="Periodo ATR rápido", maxValue=480, step=1, category="Por defecto") @Help("Periodo ATR rápido") public int Periodo ATR rápido; @Parameter(defaultValue="20", minValue=2, name="Periodo ATR lento", maxValue=480, step=1, category="Por defecto") @Help("Periodo ATR lento") public int Periodo ATR lento; //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ @Override public double computeTradeSize(StrategyBase strategy, String symbol, byte orderType, double price, double sl, double tickSize, double pointValue) throws Exception { double tradeSize; // obtener cierre anterior double prevClose = strategy.MarketData.Chart(symbol).Close(1); // obtener ATR redondeado con periodo más lento double slowValueATR = SQUtils.round(strategy.getATRValue(strategy.MarketData.Chart(symbol),SlowATRPeriod, 1), 5); // obtener ATR redondeado con periodo más rápido double fastValueATR = SQUtils.round(strategy.getATRValue(strategy.MarketData.Chart(symbol),FastATRPeriod, 1), 5); // si la volatilidad a corto sube, modifica el tamaño de la operación if(fastValueATR>slowValueATR){ tradeSize = Tamaño*Multiplicador; } // si no, tamaño igual a Tamaño por defecto else tradeSize = Tamaño; // devolver tamaño de operación return tradeSize;
¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil
¡¡¡¡¡¡¡¡¡¡¡¡¡¡Excelente !!!!!!!!!!!!!!
Esto es exactamente lo que necesito. Gracias clonex
Hola COMO PUEDO COMPILAR ESTE ARCHIVO EN EL EDITOR DE CODIGO MUCHAS GRACIAS POR SU ATENCION
Gracias clonex / Ivan Hudec.
No sé por qué no puedo guardar mi estrategia con formato mq5. El error es "Uno o más bloques de la estrategia utiliza no está implementado en el código MQL", "Plantilla inclusión falló (para el valor del parámetro "MoneyManagement/ATRVolatilitySizing_variables.tpl").
¿Podría ayudarme a solucionarlo?
I can not make it work with build 138
For build 138 , we need to update the line :
@Override
public doble computeTradeSize(StrategyBase strategy, String symbol, byte orderType, doble precio, doble sl, doble tickSize, doble pointValue, doble sizeStep) throws Exception {