
La estrategia utiliza el sistema de línea de paridad para determinar la dirección de la tendencia actual, haciendo más deuda en función de la dirección de la tendencia. Cuando la línea de paridad sube, se determina como una mayor confianza en la bearish, hacer más; cuando la línea de paridad baja, se determina como una mayor confianza en la bearish, hacer deuda. La estrategia se basa principalmente en el sistema de línea de paridad para determinar la dirección de la tendencia del mercado y pertenece a la estrategia de seguimiento de tendencia.
Calcule el promedio móvil ponderado de un determinado período (el promedio de 400 periodos por defecto) como un indicador de la línea media.
Determine si la línea promedio de vwma sube, si sube, configure la señal de observación de múltiples señales de tendencia alcista; si baja, configure la señal de observación de tendencia bajista.
Cuando la tendencia alcista es verdadera, se hace más; cuando la tendencia bajista es verdadera, se hace una posición baja.
Calcula el rendimiento estratégico bar_pnl y el rendimiento de compra y mantenimiento bar_bh para cada línea K.
De acuerdo con los puntos de ruptura trimestrales y anuales, se calculan los rendimientos estratégicos de cada trimestre y año, los rendimientos trimestrales y anuales y los rendimientos anuales y los correspondientes rendimientos de compra y mantenimiento, los rendimientos trimestrales y anuales.
En la tabla se muestra la rentabilidad estratégica y la rentabilidad de compra y mantenimiento para cada trimestre de cada año.
La estrategia se basa principalmente en la medianía para determinar la dirección de las tendencias del mercado y tiene las siguientes ventajas:
La operación es sencilla, fácil de entender y de dominar a través de un indicador de la línea media para determinar el movimiento del mercado.
La capacidad de control de retroceso es fuerte, sigue la tendencia y puede controlar eficazmente las pérdidas en mercados no en tendencia.
Los parámetros configurables son menos, principalmente para ajustar el ciclo de la media lineal, fácil de probar y optimizar.
El uso de las tablas para mostrar los beneficios de forma intuitiva es muy sencillo.
En la tabla de ganancias se añade el beneficio de compra y tenencia para comparar, para que la estrategia de ganancias incrementales sea clara.
La ubicación de la tabla se puede ajustar con flexibilidad para que se pueda combinar con otras estrategias.
La estrategia también tiene sus riesgos:
El riesgo de mercado masivo, en un mercado alcista prolongado, puede ser un poco más bajo que el de las estrategias de compra y mantenimiento. Se puede ajustar adecuadamente el ciclo de la línea media para optimizar.
El riesgo de whipsaw es mayor en situaciones de crisis. Se puede considerar la posibilidad de agregar condiciones de filtración, como el punto más alto antes de la ruptura, para reducir las transacciones repetitivas.
El sistema de medianería no es muy adecuado para la curva y puede perder el punto de inflexión de la tendencia. Se pueden probar diferentes tipos de medianería.
No se considera el mecanismo de suspensión y salida de pérdidas, existe un gran riesgo de retiro. Se puede establecer una suspensión dinámica o considerar la reducción de la posición.
En cuanto a la optimización de la tabla, se puede considerar agregar indicadores de riesgo como el índice de agudeza y la retirada máxima.
La estrategia puede ser optimizada en los siguientes aspectos:
Optimizar los parámetros de la línea media y ajustar el ciclo de la línea media para adaptarse a diferentes entornos de mercado.
Aumentar las condiciones de filtración, como el punto más alto antes de la ruptura, para reducir la whipsaw.
Prueba diferentes tipos de medias, como las medias móviles ponderadas, las medias móviles de doble índice, etc.
La inclusión de un mecanismo de detención de pérdidas puede establecer un alto dinámico o considerar la reducción de la posición.
Enriquecer el contenido de la tabla, agregar el índice de sharpe, el máximo retiro y otros indicadores.
Combinado con otros indicadores, como el MACD, Bollinger Bands y otros para juzgar la tendencia.
Optimizar la gestión de posiciones y ajustar las posiciones en función de la dinámica del mercado.
Probar el funcionamiento de diferentes estándares para encontrar el mejor alcance de aplicación.
La estrategia de comercio de línea de paridad es más simple en general, más directa, y tiene una mayor capacidad de control de retroceso y operación de tendencia a través del juicio de la línea de paridad. Es adecuada para los operadores de tendencia.
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Dannnnnnny
//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)
wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)
plot(wma)
if uptrend
strategy.entry("Buy", strategy.long)
else
strategy.close("Buy")//
///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3) != ceil(month(time[1])/3)
new_year = year(time) != year(time[1])
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]
cur_quarter_pnl = 0.0
cur_year_pnl = 0.0
cur_quarter_bh = 0.0
cur_year_bh = 0.0
// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 :
(1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1
cur_quarter_bh := new_quarter ? 0.0 :
(1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1
// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 :
(1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 :
(1 + cur_year_bh[1]) * (1 + bar_bh) - 1
// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh = array.new_float(0)
var year_pnl = array.new_float(0)
var year_time = array.new_int(0)
var year_bh = array.new_float(0)
end_time = false
end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory
if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
if (end_time[1])
array.pop(quarter_pnl)
array.pop(quarter_time)
array.push(quarter_pnl , cur_quarter_pnl[1])
array.push(quarter_time, time[1])
array.push(quarter_bh , cur_quarter_bh[1])
if (not na(cur_year_pnl[1]) and (new_year or end_time))
if (end_time[1])
array.pop(year_pnl)
array.pop(year_time)
array.push(year_pnl , cur_year_pnl[1])
array.push(year_time, time[1])
array.push(year_bh , cur_year_bh[1])
// Quarterly P&L Table
var quarterly_table = table(na)
getCellColor(pnl, bh) =>
if pnl > 0
if bh < 0 or pnl > 2 * bh
color.new(color.green, transp = 20)
else if pnl > bh
color.new(color.green, transp = 50)
else
color.new(color.green, transp = 80)
else
if bh > 0 or pnl < 2 * bh
color.new(color.red, transp = 20)
else if pnl < bh
color.new(color.red, transp = 50)
else
color.new(color.red, transp = 80)
if (end_time and enableQuarterlyTable)
quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
table.cell(quarterly_table, 0, 0, "", bgcolor = #cccccc)
table.cell(quarterly_table, 1, 0, "Q1", bgcolor = #cccccc)
table.cell(quarterly_table, 2, 0, "Q2", bgcolor = #cccccc)
table.cell(quarterly_table, 3, 0, "Q3", bgcolor = #cccccc)
table.cell(quarterly_table, 4, 0, "Q4", bgcolor = #cccccc)
table.cell(quarterly_table, 5, 0, "Year", bgcolor = #999999)
for yi = 0 to array.size(year_pnl) - 1
table.cell(quarterly_table, 0, yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
for mi = 0 to array.size(quarter_time) - 1
m_row = year(array.get(quarter_time, mi)) - year(array.get(year_time, 0)) + 1
m_col = ceil(month(array.get(quarter_time, mi)) / 3)
m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ? tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)