
Esta estrategia tiene la función de configurar varios puntos de parada de porcentaje. La estrategia primero juzga las condiciones largas y cortas, hace más entradas y salidas. Luego convierte los porcentajes en puntos de precio a través de una función personalizada de percentageAsPoints. El programa establece 4 salidas de acuerdo con los porcentajes de parada de 1%, 2%, 3% y 4% de la configuración, y también establece una salida de parada de pérdida general del 2%.
Esta estrategia se basa en la multiplicación de la línea media de sma para determinar la entrada. En concreto, la entrada se hace más cuando la línea rápida esma ((14) atraviesa la línea lenta esma ((28) y la entrada se hace vacía cuando la línea rápida esma ((14) atraviesa la línea lenta esma ((28)).
Entonces la pregunta es, ¿cómo se puede configurar una barra de exits de porcentaje múltiple? Aquí se usa una función personalizada de percentAsPoints para convertir el porcentaje en puntos de precio, la lógica de la función es:
percentAsPoints(pcnt) =>
strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
La función obtiene el número de puntos de precio usando el porcentaje multiplicado por el precio promedio de la posición y dividido por el precio mínimo de movimiento si la posición no es 0. Si la posición es 0, devuelve na.
Con esta función podemos fácilmente convertir el porcentaje en puntos. Luego el programa se detiene en el 1%, 2%, 3% y 4% de acuerdo con la configuración, y establece 4 exits:
lossPnt = percentAsPoints(2)
strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)
Al mismo tiempo, todas las salidas utilizan un stop loss del 2% general. De esta manera, se consigue el efecto de detener varios porcentajes.
Esta estrategia de contención de varios porcentajes tiene las siguientes ventajas:
En general, cuanto más se apoya en el retraso, mayor es el riesgo, y esta estrategia puede equilibrar el riesgo con el beneficio.
El bloqueo de lotes puede devolver el capital, reduciendo el riesgo. Por ejemplo, establecer un lote del 25%, cuando la ganancia alcanza el 1%, se puede recuperar el cuarto del capital. Las posiciones posteriores se operan con ganancias.
La prevención de pérdidas por eventos anormales, el 2% de pérdidas evita grandes pérdidas por eventos extremos.
El código es sencillo, claro, fácil de entender, fácil de modificar y optimizar. La función de configuración convierte el porcentaje en un número de puntos, y luego se pueden configurar varias paradas en varias líneas de código.
La estrategia también tiene sus riesgos:
Los paros porcentuales son propensos a la oscilación horizontal, donde los precios oscilan alrededor de los paros. Esto a menudo desencadena paros porcentuales, lo que aumenta la frecuencia de las transacciones y la carga de comisiones.
El bloqueo de lotes aumenta el número de transacciones y aumenta la carga de las comisiones. Si las comisiones son demasiado altas, se compensa una parte de las ganancias del bloqueo.
Si la configuración es demasiado conservadora, es difícil obtener ganancias satisfactorias; y si la configuración es demasiado radical, el riesgo es demasiado alto.
Se fija el porcentaje de la parada, sin tener en cuenta la volatilidad del mercado y la tendencia. En situaciones de convulsiones, se debe reducir la parada y en situaciones de tendencia, se debe aumentar la parada.
Teniendo en cuenta los riesgos mencionados, se puede seguir optimizando en los siguientes aspectos:
Optimización de la estrategia de paradas para que se ajuste automáticamente a la volatilidad y la tendencia del mercado. Por ejemplo, la adición de paradas ATR, el endurecimiento de paradas en el momento de la oscilación, la relajación de paradas en la tendencia.
Optimice la proporción y la magnitud de la parálisis por lotes para lograr la combinación óptima de riesgos y beneficios. Agregue la función de optimización de parámetros para encontrar los parámetros óptimos.
Reducir el número de paradas y evitar el comercio demasiado frecuente. Por ejemplo, establecer una zona de amortización de precios, que sólo se detiene después de un cierto margen.
Tenga en cuenta el factor de las comisiones, cuando se espera que los beneficios de la suspensión sean inferiores a los gastos de la suspensión. O optimice el aumento de la suspensión de acuerdo con los gastos de la suspensión.
Utiliza el listador de paradas. Previene el movimiento de los precios de las paradas en función de las ofertas de prioridad de profundidad.
Esta estrategia logra el efecto de varios paradas por ciento, con cuatro paradas de salida del 1%, 2%, 3% y 4%, que se pueden parar por turno, mientras que el 2% de paradas evita grandes pérdidas en situaciones anormales. Esta estrategia puede equilibrar los beneficios de riesgo y evitar que se pierdan oportunidades de ganar más dinero. Pero también hay ciertos riesgos, como la propensión a la formación de oscilaciones transversales, el aumento de la frecuencia de negociación, etc. Estas recomendaciones son dignas de consideración para incorporar estrategias de optimización para que puedan operar de manera estable en más mercados.
/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 3h
basePeriod: 15m
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/
// © adolgov
//@version=4
strategy("Multiple %% profit exits example", overlay=false, default_qty_value = 10)
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
percentAsPoints(pcnt) =>
strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
lossPnt = percentAsPoints(2)
strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)
profitPercent(price) =>
posSign = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
(price - strategy.position_avg_price) / strategy.position_avg_price * posSign * 100
p1 = plot(profitPercent(high), style=plot.style_linebr, title = "open profit % upper bound")
p2 = plot(profitPercent(low), style=plot.style_linebr, title = "open profit % lower bound")
fill(p1, p2, color = color.red)