
La estrategia es un sistema de negociación basado en indicadores de SuperTrend, combinado con un marco de análisis de rendimiento de fecha completo, capaz de rastrear y analizar el rendimiento de la estrategia en diferentes períodos de tiempo. La estrategia genera señales de negociación a través de ATR (medio real amplitud) y el indicador de SuperTrend, mientras que una poderosa herramienta de análisis de rendimiento está integrada.
El núcleo de la estrategia consta de dos partes: el mecanismo de generación de señales de negociación y el sistema de análisis de rendimiento.
Mecanismo de generación de señales de comercio:
Sistemas de análisis de rendimiento:
La estrategia utiliza las características orientadas a objetos de Pine Script para crear una clase DayStats para almacenar y actualizar las estadísticas de transacción, lo que permite una gestión y cálculo de datos eficientes. La función update_all_stats (()) actualiza la información estadística relevante al final de cada transacción, asegurando que los datos de rendimiento reflejen en tiempo real los resultados de las transacciones más recientes.
Análisis de las dimensiones del tiempo en su totalidadLa ventaja más notable de esta estrategia es que permite analizar el rendimiento de las operaciones en profundidad desde una dimensión de tiempo, ayudando a los operadores a identificar qué días o días de la semana son los mejores para operar, lo que proporciona una base de datos sólida para la estrategia de filtración de tiempo.
Apoyo a las decisiones basadas en datosMediante la estadística detallada de los indicadores clave como la ganancia, la pérdida y la ganancia neta de cada día de negociación, los comerciantes pueden tomar decisiones comerciales basadas en datos objetivos y no en sentimientos subjetivos, reduciendo la interferencia de factores emocionales.
Mejora de la gestión de riesgosA través de la identificación de los días de negociación que han tenido un historial de bajo rendimiento, los operadores pueden elegir evitar el comercio o ajustar el tamaño de sus posiciones en estos días, lo que reduce el riesgo sistemático.
Visualización de las prestacionesLa función de visualización de tablas de la estrategia incorporada muestra de forma intuitiva el rendimiento de las operaciones en los diferentes períodos de tiempo, y utiliza diferentes colores para identificar el estado de pérdidas y ganancias, lo que permite al comerciante comprender el rendimiento de la estrategia a primera vista.
Alta personalizaciónLa estrategia ofrece varios parámetros de entrada, incluyendo el ciclo ATR, el factor SuperTrend, la posición de la tabla y la configuración de color, entre otros, que permiten a los comerciantes hacer ajustes según las preferencias personales y las características del mercado.
Capacidad de integración flexible: El código de la parte de análisis de rendimiento está diseñado para ser fácilmente integrado en otras estrategias de negociación, aumentando la utilidad y la extensibilidad de las estrategias.
La falta de datos muestra el riesgoEn el caso de una pequeña muestra de transacciones, los resultados estadísticos de ciertas fechas pueden no ser estadísticamente significativos, y las decisiones tomadas sobre la base de estos datos limitados pueden conducir a una dirección de optimización errónea. La solución es asegurar un ciclo de retroalimentación lo suficientemente largo y obtener más muestras de transacciones para mejorar la fiabilidad estadística.
El riesgo de exceso de adaptaciónLa dependencia excesiva en la fecha de un determinado rendimiento histórico puede conducir a una estrategia de ajuste excesivo de los datos históricos, lo que puede fallar cuando el entorno del mercado cambia en el futuro. Los operadores deben usar el análisis de tiempo como un factor de referencia y no como la única base de decisión, y verificar periódicamente la estabilidad de los resultados del análisis.
Mecanismo de generación de señales:El indicador SuperTrend puede generar frecuentes falsas señales en mercados convulsionados, lo que puede conducir a un exceso de comercio y pérdidas innecesarias. Se recomienda su uso en mercados con una fuerte tendencia, o en combinación con otros indicadores de confirmación para filtrar falsas señales.
Cálculo de los recursos consumidosA medida que aumenta el número de transacciones, la cantidad de datos que el sistema de análisis de rendimiento necesita almacenar y procesar también aumenta, lo que puede afectar la eficiencia de la operación de la estrategia. Se debe tener en cuenta la ocupación de recursos en la retroalimentación a largo plazo o en las transacciones en vivo.
Influencia de los factores estacionalesAlgunos mercados tienen una regularidad estacional y pueden ignorar los efectos estacionales de períodos más largos basándose simplemente en el análisis de fechas semanales o mensuales. Se puede considerar agregar análisis a nivel trimestral o anual para capturar patrones de períodos más largos.
Análisis de múltiples marcos de tiempoLas estrategias actuales solo analizan el rendimiento en un solo marco de tiempo, pero se pueden ampliar para analizar el rendimiento de las transacciones en varios marcos de tiempo al mismo tiempo, como las diferencias de rendimiento de las líneas de día, 4 horas y 1 hora al mismo tiempo, para obtener una visión más completa de las dimensiones de tiempo.
Aumentar la clasificación de las condiciones del mercadoLa inclusión de categorías de condiciones de mercado en el análisis de rendimiento, como el rendimiento en mercados de tendencia y mercados de crisis, o las diferencias entre entornos de alta y baja volatilidad, puede ayudar a descubrir las ventajas y desventajas de las estrategias en un entorno de mercado específico.
Sistema de calificación de la calidad de la señalIntroducción de un mecanismo de calificación de la calidad de la señal, basado en la consistencia de los indicadores técnicos, la estructura de precios, la confirmación de la cantidad de transacciones y otros factores para calificar cada señal de transacción, y la inclusión de la dimensión de la calidad de la señal en el análisis de rendimiento, que ayuda a identificar las características de la señal de alta calidad.
Optimización de parámetros de adaptación: Ajuste automático de los parámetros de ATR y factores de SuperTrend basados en datos de rendimiento histórico, lo que permite que la estrategia se adapte a los cambios en las diferentes condiciones del mercado, mejorando la adaptabilidad y la solidez de la estrategia.
Integración de los datos del calendario económicoIntegración de información sobre eventos como la publicación de datos económicos importantes y las decisiones de los bancos centrales en el análisis de rendimiento, estudio de las leyes de comportamiento de las transacciones antes y después de un evento económico específico, y apoyo a la toma de decisiones impulsada por eventos para los operadores.
Ampliación de los indicadores estadísticosAumentar el número de indicadores estadísticos, como el máximo número de ganancias/pérdidas consecutivas, el promedio de ganancias/pérdidas y el índice de Sharpe, para proporcionar una evaluación más profunda del rendimiento y ayudar a los operadores a comprender mejor las características de la estrategia.
Reconocimiento de patrones de aprendizaje automáticoIntroducción de algoritmos sencillos de aprendizaje automático de máquina para identificar automáticamente patrones y leyes de tiempo potenciales a partir de datos de rendimiento histórico, para predecir el posible rendimiento de los días de negociación futuros y para proporcionar orientación prospectiva para las decisiones de negociación.
La estrategia de optimización de SuperTrend es una solución innovadora que combina un sistema de seguimiento de tendencias con un análisis de rendimiento en dimensiones de tiempo completas. La estrategia no solo ofrece señales de comercio basadas en indicadores de SuperTrend, sino que, más importante, construye un marco de análisis robusto que permite evaluar sistemáticamente las diferencias de rendimiento de la estrategia en diferentes períodos de tiempo.
Mediante el seguimiento detallado de los resultados de las operaciones en diferentes fechas de la semana y el mes, los operadores pueden identificar patrones de tiempo con ventajas estadísticas y optimizar estrategias de negociación de manera específica. El valor de este marco de análisis no se limita a las estrategias de SuperTrend actuales, sino que también se puede integrar fácilmente en otros sistemas de negociación, proporcionando una forma de pensar de optimización de la dimensión temporal para todo tipo de estrategias.
Este enfoque impulsado por datos eleva la negociación intuitiva al nivel de análisis cuantitativo, permitiendo a los operadores tomar decisiones más racionales basadas en datos estadísticos objetivos. A medida que se acumula una muestra de operaciones y se expande la dimensión de análisis, el valor de esta estrategia aumentará aún más, proporcionando a los operadores una guía de optimización de tiempo cada vez más precisa.
/*backtest
start: 2024-07-25 00:00:00
end: 2025-07-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/
//@version=6
strategy("Daily Performance Analysis [Mr_Rakun]", overlay=true)
atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)
[st, direction] = ta.supertrend(factor, atrPeriod)
if ta.change(direction) < 0
strategy.entry("My Long Entry Id", strategy.long)
if ta.change(direction) > 0
strategy.entry("My Short Entry Id", strategy.short)
plot(st, title="SuperTrend", color=st < close ? color.green : color.red, linewidth=2)
//-------------------------------------------------------------
// Copy the rest of this line and add it to your own strategy.
// Daily Performance
type DayStats
int wins = 0
int losses = 0
float gross_profit = 0.0
float gross_loss = 0.0
update(DayStats ds, float profit) =>
if profit > 0
ds.wins += 1
ds.gross_profit += profit
else
ds.losses += 1
ds.gross_loss += math.abs(profit)
net_profit(DayStats ds) => ds.gross_profit - ds.gross_loss
profit_factor(DayStats ds) => ds.gross_loss > 0 ? ds.gross_profit / ds.gross_loss : na
winrate(DayStats ds) =>
total = ds.wins + ds.losses
total > 0 ? (ds.wins / total) * 100 : na
// ================== GLOBAL OBJECTS ==================
var DayStats monday = DayStats.new()
var DayStats tuesday = DayStats.new()
var DayStats wednesday = DayStats.new()
var DayStats thursday = DayStats.new()
var DayStats friday = DayStats.new()
var DayStats saturday = DayStats.new()
var DayStats sunday = DayStats.new()
var array<DayStats> monthStats = array.new<DayStats>()
// ================== UPDATE METHOD ==================
update_all_stats() =>
if barstate.isfirst
for i = 0 to 30
array.push(monthStats, DayStats.new())
if strategy.closedtrades > strategy.closedtrades[1]
idx = strategy.closedtrades - 1
profit = strategy.closedtrades.profit(idx)
poz_time = strategy.closedtrades.entry_time(idx)
dom = dayofmonth(poz_time)
day = dayofweek(poz_time)
DayStats day_stats = switch day
dayofweek.sunday => sunday
dayofweek.monday => monday
dayofweek.tuesday => tuesday
dayofweek.wednesday => wednesday
dayofweek.thursday => thursday
dayofweek.friday => friday
dayofweek.saturday => saturday
if na(day_stats) == false
update(day_stats, profit)
if dom >= 1 and dom <= 31
DayStats mstats = array.get(monthStats, dom - 1)
update(mstats, profit)
day_stats
update_all_stats()
// Table positioning inputs
weekly_position = input.string("Top Center", "Weekly Table Position",
options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])
monthly_position = input.string("Top Right", "Monthly Table Position",
options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])
// Color inputs
header_bg_color = input.color(color.gray, "Header Background Color")
profit_color = input.color(color.lime, "Profit Color")
loss_color = input.color(color.red, "Loss Color")
neutral_color = input.color(color.gray, "Neutral Color")
row_bg_color = input.color(color.new(color.gray, 60), "Row Background Color")
// Function to get table position
get_table_position(string pos) =>
switch pos
"Top Left" => position.top_left
"Top Center" => position.top_center
"Top Right" => position.top_right
"Middle Left" => position.middle_left
"Middle Center" => position.middle_center
"Middle Right" => position.middle_right
"Bottom Left" => position.bottom_left
"Bottom Center" => position.bottom_center
"Bottom Right" => position.bottom_right
=> position.top_center
// TABLE PRINTING
draw_table_headers(table weekly, table monthly) =>
table.cell(weekly, 0, 0, "DAY", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 1, 0, "W/L (Count)", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 2, 0, "NET PROFIT", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(weekly, 4, 0, "WINRATE", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 0, 0, "DAY", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 1, 0, "W/L (Count)", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 2, 0, "NET PROFIT", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
table.cell(monthly, 4, 0, "WINRATE", text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
fill_weekly_row(table tbl, int row, string day_name, DayStats ds) =>
net_p = net_profit(ds)
pf = profit_factor(ds)
wr = winrate(ds)
status_color = net_p > 0 ? profit_color: (net_p < 0 ? loss_color : neutral_color)
table.cell(tbl, 0, row, day_name, text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
fill_monthly_row(table tbl, int row, int day, DayStats ds) =>
net_p = net_profit(ds)
pf = profit_factor(ds)
wr = winrate(ds)
status_color = net_p > 0 ? profit_color : (net_p < 0 ? loss_color : neutral_color)
table.cell(tbl, 0, row, str.tostring(day), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
var table weekly_table = table.new(get_table_position(weekly_position), 5, 8)
var table monthly_table = table.new(get_table_position(monthly_position), 5, 32)
if barstate.isconfirmed
draw_table_headers(weekly_table, monthly_table)
fill_weekly_row(weekly_table, 1, "MON", monday)
fill_weekly_row(weekly_table, 2, "TUE", tuesday)
fill_weekly_row(weekly_table, 3, "WED", wednesday)
fill_weekly_row(weekly_table, 4, "THU", thursday)
fill_weekly_row(weekly_table, 5, "FRI", friday)
fill_weekly_row(weekly_table, 6, "SAT", saturday)
fill_weekly_row(weekly_table, 7, "SUN", sunday)
for i = 0 to 30
DayStats ms = array.get(monthStats, i)
if ms.wins + ms.losses > 0
fill_monthly_row(monthly_table, i + 1, i + 1, ms)