Documentación
Aplicaciones
Última actualización el 20. 11. 2021 por clonex / Ivan Hudec
Simulación de medias móviles de acciones
Contenido de la página
En este tutorial le mostraremos cómo crear y simular el control de curvas de equidad en What If Crosscheck .
Los escenarios Y si... en StrategyQuantx es la herramienta que le permite probar varias hipótesis de negociación de su estrategia.
La función de simulación de control de renta variable permite simular la activación y desactivación de una estrategia en función de la curva de renta variable. El supuesto se basa en la hipótesis de que es mejor negociar la estrategia si su rendimiento está por encima de su media. Se puede leer un buen artículo dedicado a este tema aquí.
Fragmento finalizado que puede descargar aquí.
Paso 1 - Cree un nuevo fragmento de suposición Y si...
Abra CodeEditor, haga clic en Crear nuevo y elija la opción de columna Lista de operaciones. EquityMATrading.
Esto creará un nuevo fragmento EquityMATrading.java en carpeta Usuario/Snippets/SQ/Whatif
Paso 2 - Definir los parámetros del fragmento
Como queremos calcular la media de la renta variable, tenemos que incluir un parámetro - MAPeriod que nos permite especificar un periodo de la media móvil.
@ClassConfig(name="() Equity MA Trading", display="Equity MA(#MAPeriod#) Trading ") @Help("Texto de ayuda") public clase EquityMATrading extends WhatIf { public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class); @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1) public int MAPeriod;
Paso 3 - Implementar el método filter(OrdersList orders)
El filtro(Lista de pedidos orders) se utiliza para filtrar la lista original de órdenes de la estrategia. Lista de pedidos es una clase que almacena la lista de operaciones de una estrategia y proporciona métodos para manipular la lista de operaciones. Puedes hacer un bucle con Lista de pedidos y obtener datos para muy Pida utilizando el método consiga(int índice).
Aquí debe prestar atención a la forma en que realiza el bucle a través de la lista de pedidos. En nuestro ejemplo, estamos utilizando el clásico bucle for, por lo que no podemos manipular la lista de pedidos durante el bucle.
En su lugar, creamos un Lista de pedidos ol donde almacenamos las operaciones que han cumplido nuestras condiciones. Copiamos esta lista de órdenes al final del fragmento en la lista de órdenes principal
Paso 4 - Uso del fragmento Whatif EquityMATrading
Para añadir un fragmento en Crosschecks puede utilizar este fragmento para simular lo que ocurriría si operara con su estrategia si su curva de renta variable está por encima de su media móvil.
Código completo comentado del fragmento
paquete SQ.WhatIf; import org.slf4j.Logger; importar org.slf4j.LoggerFactory; import com.strategyquant.lib.SQTime; import com.strategyquant.tradinglib.ClassConfig; import com.strategyquant.tradinglib.Help; import com.strategyquant.tradinglib.Order; import com.strategyquant.tradinglib.OrdersList; import com.strategyquant.tradinglib.Parameter; import com.strategyquant.tradinglib.WhatIf; import com.strategyquant.tradinglib.results.stats.comparator.OrderComparatorByOpenTime; import it.unimi.dsi.fastutil.objects.ObjectListIterator; @ClassConfig(name="() Equity MA Trading", display="Equity MA Trading (#MAPeriod#)") @Help("Texto de ayuda") public clase EquityMATrading extends WhatIf { public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class); @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1) public int MAPeriod; @Override public void filter(OrdersList orders) lanza Excepción { // Nueva instancia de OrdersList en la que almacenamos las operaciones que están por encima de la media móvil OrdersList newOL = new OrdersList("AboveMovingAverage"); // Recorremos toda la OrdersList de órdenes para calcular la Media Móvil for(int i = MAPeriod;i < orders.size();i++){ // En la última orden actual estamos decidiendo si pasamos o no a newOL Orden = orders.get(i); // obtener saldo de la orden double saldo = pedido.SaldoCuenta; // filtrar pedidos con saldo if(order.isBalanceOrder()) continue; double suma = 0; // calcular la media móvil de la renta variable for(int k =1;k media de equidad if(ultimoOrden.SaldoCuenta>avg) { // añadimos orden.get(i) a nuevoOL newOL.add(orden); } avg =0; // restablecemos variable media sum =0; // restablecemos la variable sum } // ordenar newOL por posiciones hora de apertura newOL.sort(new OrderComparatorByOpenTime()); //// ordenar ordenes por tiempo de apertura // estamos reemplazando OrdersList orders por OrdersList newOL y solo recibimos operaciones por encima de la media movil orders.replaceWithList(newOL); } }
¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil
muy bueno 🙂 .