Documentación
Aplicaciones
Última actualización el 28. 11. 2021 por clonex / Ivan Hudec
Análisis de operaciones - Ratio de ventaja media por hora
Contenido de la página
Trade Analysis Charts es una parte de los resultados de StrategQuant X que nos permite analizar visualmente algunas propiedades de una estrategia. En el siguiente tutorial, le mostraremos cómo crear un fragmento analítico que nos muestre visualmente el ratio de borde medio de una estrategia en función de la hora de apertura de la operación.
Puede descargar el fragmento terminado aquí.
Paso 1 - Abrir el editor de código
Haga clic en el icono Editor de código para cambiar al Editor.
Paso 2 - Crear una nueva columna Comercio
Abra CodeEditor, haga clic en Crear nuevo y elija la opción Gráfico de análisis comercial. AvgEdgeRatioByHour. Esto creará un nuevo fragmento AvgEdgeRatioByHour.java en carpeta Usuario/Snippets/SQ/TradeAnalysis En el constructor definimos el nombre que se mostrará.
public clase AvgEdgeRatioByHour extends TradeAnalysisChart {
public RatioAvgEdgePorHora() {
this.name = L.tsq("Relación de flancos media por hora");
}
Paso 3 - Modificar el método de dibujo
En este método especificamos el tipo de gráfico que queremos crear. Podemos elegir entre las siguientes opciones
- Gráfico de barras
- Gráfico de dispersión
- Gráfico de precios
A continuación se crea un array en el que se insertan los datos del array computeData. Utiliza el bucle for para añadir al gráfico los valores calculados en la matriz computeData.
@Override
public AbstractChart draw(OrdersList orders, byte plType, byte tradePeriod) {
// crear nueva instancia de gráfico
BarChart gráfico = new BarChart();
chart.invertIfNegative(true);
if(pedidos==nulo) {
return gráfico;
}
// creando array aquí almacenamos los datos calculados en el método computeData
double[] horas = computeData(orders, plType, tradePeriod);
// rellenar el gráfico con los valores del array
for(int hora=0; hora<hora.longitud; hora++) {
chart.addValue(L.tsq("Ratio de margen medio por hora"), hour, hours[hour]/hoursCount[hour]);
}
return gráfico;
}
Paso 4 - Implementar la matriz computeData
private double[] computeData(OrdersList orders, byte plType, byte tradePeriod) {
double[] horas = new double[24];
for(int hora=0; hora<hora.longitud; hora++) {
horas[hora]=0;
}
int hora;
// aquí trabajamos con orderslist
for(int i = 0; i < pedidos.tamaño(); i++) {
Pedido = pedidos.get(i);
hora = SQTime.getHour(order.getTimeByPeriodType(tradePeriod)); //0-23
double mae = orden.PipsMAE; //obtener el MAE de la orden en pips
double mfe = order.PipsMFE; //obtener el MAE de la orden en pips
double atrOnOpen = order.ATROnOpen; //obtiene el ATR de la orden en pips
double normMAE = mae/atrOnOpen; // obtiene la MAE normalizada
double normMFE = mfe/atrOnOpen; // obtiene el MFE normalizado
double eRTrade = SQUtils.safeDivide(normMFE,normMAE); // SQUtils.safeDivide precede a la excepción null zero divide
horas[hora]+= eRTrade;
hoursCount[hour]+=1;
}
Paso 5 - Utilización Ratio Avg. Ratio de ventaja por hora en la estrategia Quant X
Después de compilar el snippet y reiniciar Code Editor y StrategyQUant X podemos trabajar con el snippet recién creado.
Código comentado
paquete SQ.TradeAnalysis;
import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;
public class AvgEdgeRatioByHour extends TradeAnalysisChart {
// Constructor de la clase donde definimos el nombre del fragmento
public AvgEdgeRatioByHour() {
this.name = L.tsq("Avg.Edge Ratio By Hour");
}
@Override
public AbstractChart draw(OrdersList orders, byte plType, byte tradePeriod) {
// crear nueva instancia de gráfico
BarChart gráfico = new BarChart();
chart.invertIfNegative(true);
if(pedidos==nulo) {
return gráfico;
}
// creamos un array donde almacenamos los datos calculados en el método computeData
double[] hours = computeData(orders, plType, tradePeriod);
// rellenar el gráfico con los valores del array
for(int hora=0; hora<horas.longitud; hora++) {
// hours[hour]/hoursCount[hour] calculamos el Edge Ratio medio por hora
chart.addValue(L.tsq("Promedio Edge Ratio Por Hora"), hour, hours[hour]/hoursCount[hour]);
}
return gráfico;
}
// crear matriz para contar operaciones
int [] hoursCount = new int[24];
private double[] computeData(OrdersList orders, byte plType, byte tradePeriod) {
//crea un array donde almacenar los resultados calculados
double[] horas = new double[24];
// establecer valores por defecto estado 0
for(int hora=0; hora<hora.longitud; hora++) {
horas[hora]=0;
}
int hora;
// aquí trabajamos con OrdersList orders
for(int i = 0; i < pedidos.tamaño(); i++) {
Pedido pedido = pedidos.get(i);
hora = SQTime.getHour(order.getTimeByPeriodType(tradePeriod)); //0-23
double mae = orden.PipsMAE; //obtener el MAE de la orden en pips
double mfe = order.PipsMFE; //obtener el MAE de la orden en pips
double atrOnOpen = order.ATROnOpen; //obtiene el ATR de la orden en pips
double normMAE = mae/atrOnOpen; // obtiene la MAE normalizada
double normMFE = mfe/atrOnOpen; // obtiene el MFE normalizado
double eRTrade = SQUtils.safeDivide(normMFE,normMAE); // SQUtils.safeDivide precede a la excepción null zero divide
// almacenar ratio de borde para cada hora
horas[hora]+= eRTrade;
// cuenta el número de operaciones por cada hora
hoursCount[hour]+=1;
}
return horas;
}
}
¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil

