
La estrategia se basa en el desarrollo de un indicador de Buwinko para identificar automáticamente las tendencias del mercado y establecer posiciones abiertas. Integra indicadores técnicos como el indicador de Buwinko, las medias móviles y las líneas de soporte horizontal para identificar automáticamente las señales de ruptura y establecer posiciones.
El indicador central de esta estrategia es el indicador de Buwenko, que determina la tendencia del mercado y los puntos importantes de soporte/resistencia calculando el diferencial logarítmico de los precios de cierre de diferentes días de negociación.
Además, la estrategia integra el cinturón de protección de la banda de protección de la EMA, que consiste en una serie de medias móviles de 21 días, 55 días, etc. Según la relación de ordenamiento de estas líneas uniformes, se puede juzgar que el mercado actual es un mercado múltiple, vacío o completo, y limitar el vacío o la operación múltiple.
La combinación de los indicadores de Buwenko para identificar señales de negociación y las medias móviles para determinar la fase del mercado evita la creación de posiciones inadecuadas.
La mayor ventaja de esta estrategia es que se puede identificar automáticamente la tendencia a la volatilidad en el mercado. El indicador de Buwenko es muy sensible a la diferencia de precios entre los dos períodos de tiempo, lo que permite ubicar rápidamente la resistencia de soporte clave. Al mismo tiempo, la clasificación de las medias móviles permite determinar con eficacia la situación actual.
Esta combinación de indicadores rápidos con indicadores de tendencia permite a la estrategia ubicar rápidamente los puntos de compra y venta, al tiempo que evita compras inadecuadas. Esta es la mayor ventaja de la estrategia.
El riesgo de esta estrategia proviene principalmente de dos aspectos, uno es que el índice de Buwenko es muy sensible a los cambios en los precios y puede generar muchas señales de negociación innecesarias; y el segundo es que los promedios móviles se ordenan de manera confusa cuando están en el horizonte, lo que lleva a la confusión de las posiciones.
Para el primer riesgo, se pueden ajustar adecuadamente los parámetros del índice de Buwenko, aumentando el ciclo de cálculo del índice y reduciendo las transacciones innecesarias; para el segundo riesgo, se pueden agregar más medias móviles para que el juicio de la tendencia sea más preciso.
La principal optimización de la estrategia fue el ajuste de parámetros y el aumento de las condiciones de filtración.
Para el indicador de Buwenko, se pueden probar diferentes parámetros de ciclo para encontrar la combinación óptima de parámetros; para las medias móviles, se pueden seguir agregando más medias, formando un sistema de juicio de tendencias más completo. Además, se pueden agregar condiciones de filtro como el indicador de tasa de volatilidad, el indicador de volumen de transacción y otros, para reducir las señales falsas.
La estabilidad y la rentabilidad de la estrategia se pueden mejorar aún más mediante la adaptación integral de los parámetros y las condiciones.
La estrategia de adaptación de Buen Codo, que combina con éxito los indicadores rápidos con los indicadores de tendencia, puede identificar automáticamente los puntos clave del mercado y establecer la posición correcta. Su ventaja es la capacidad de posicionarse rápidamente y evitar la creación de posiciones inadecuadas. El siguiente paso puede optimizarse a través de parámetros y condiciones, mejorando aún más la estabilidad de la estrategia y el nivel de rentabilidad.
/*backtest
start: 2023-12-27 00:00:00
end: 2024-01-03 00:00:00
period: 1m
basePeriod: 1m
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/
// © boftei
//@version=5
strategy("Boftei's Strategy", overlay=false, pyramiding=1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, margin_long = 100, margin_short = 100, slippage=0, commission_type=strategy.commission.percent, commission_value = 0, initial_capital = 40, precision = 6)
strat_dir_input = input.string("all", "strategy direction", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
//DATA
testStartYear = input(2005, "Backtest Start Year")
testStartMonth = input(7, "Backtest Start Month")
testStartDay = input(16, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
//////////////////////////////////////////////////////////////////////
sell = input.float(0.0065, "sell level")
buy = input.float(0, "buy level")
long1 = input.float(-0.493, "long retry - too low")
long2 = input.float(2, "long close up")
long3 = input.float(-1.5, "long close down")
short1 = input.float(1.26, "short retry - too high")
short2 = input.float(-5, "dead - close the short")
///< botvenko script
nn = input(60, "Histogram Period")
float x = 0
float z = 0
float k = 0
y = math.log(close[0]) - math.log(close[nn])
if y>0
x := y
else
k := y
//---------------------------------------------
plot(y > 0 ? x: 0, color = color.green, linewidth = 4)
plot(y <= 0 ? k: 0, color = color.maroon, linewidth = 4)
plot(y, color = color.yellow, linewidth = 1)
co = ta.crossover(y, buy)
cu = ta.crossunder(y, sell)
retry_long = ta.crossunder(y, long1)
deadline_long_up = ta.crossover(y, long2)
deadline_long_down = ta.crossunder(y, long3)
retry_short = ta.crossover(y, short1)
deadline_short = ta.crossunder(y, short2)
hline(buy, title='buy', color=color.green, linestyle=hline.style_dotted, linewidth=2)
hline(0, title='zero', color=color.white, linestyle=hline.style_dotted, linewidth=1)
hline(sell, title='sell', color=color.red, linestyle=hline.style_dotted, linewidth=2)
hline(long1, title='long retry', color=color.blue, linestyle=hline.style_dotted, linewidth=2)
hline(long2, title='overbought', color=color.teal, linestyle=hline.style_dotted, linewidth=2)
hline(long3, title='oversold', color=color.maroon, linestyle=hline.style_dotted, linewidth=2)
hline(short1, title='short retry', color=color.purple, linestyle=hline.style_dotted, linewidth=2)
hline(short2, title='too low to short - an asset may die', color=color.navy, linestyle=hline.style_dotted, linewidth=2)
////////////////////////////////////////////////////////////EMAprotectionBLOCK
ema_21 = ta.ema(close, 21)
ema_55 = ta.ema(close, 55)
ema_89 = ta.ema(close, 89)
ema_144 = ta.ema(close, 144)
//ema_233 = ta.ema(close, 233)
// ema_377 = ta.ema(close, 377)
long_st = ema_21>ema_55 and ema_55>ema_89 and ema_89>ema_144 //and ema_144>ema_233 and ema_233>ema_377
short_st = ema_21<ema_55 and ema_55<ema_89 and ema_89<ema_144 //and ema_144<ema_233 and ema_233<ema_377
g_v = long_st == true?3:0
r_v = short_st == true?-2:0
y_v = long_st != true and short_st != true?2:0
plot(math.log(ema_21), color = color.new(#ffaf5e, 50))
plot(math.log(ema_55), color = color.new(#b9ff5e, 50))
plot(math.log(ema_89), color = color.new(#5eff81, 50))
plot(math.log(ema_144), color = color.new(#5effe4, 50))
//plot(math.log(ema_233), color = color.new(#5e9fff, 50))
//plot(math.log(ema_377), color = color.new(#af5eff, 50))
plot(long_st == true?3:0, color = color.new(color.green, 65), linewidth = 5)
plot(short_st == true?-2:0, color = color.new(color.red, 65), linewidth = 5)
plot(long_st != true and short_st != true?2:0, color = color.new(color.yellow, 65), linewidth = 5)
////////////////////////////////////////////////////////////EMAprotectionBLOCK
if (co and testPeriod() and (g_v == 3 or y_v == 2))
strategy.close("OH BRO", comment = "EXIT-SHORT")
strategy.close("OH DUDE", comment = "EXIT-SHORT")
strategy.entry("OH DAMN", strategy.long, comment="ENTER-LONG 'co'")
if (retry_long and testPeriod() and (g_v == 3 or y_v == 2))
strategy.close("OH DAMN", comment = "EXIT-LONG")
strategy.entry("OH BRUH", strategy.long, comment="ENTER-LONG 'retry_long'")
if (cu and testPeriod() and (r_v == -2 or y_v == 2))
strategy.close("OH DAMN", comment = "EXIT-LONG")
strategy.close("OH BRUH", comment = "EXIT-LONG")
strategy.entry("OH BRO", strategy.short, comment="ENTER-SHORT 'cu'")
if (retry_short and testPeriod() and (r_v == -2 or y_v == 2))
strategy.close("OH BRO", comment = "EXIT-SHORT")
strategy.entry("OH DUDE", strategy.short, comment="ENTER-SHORT 'retry_short'")
if (deadline_long_up and testPeriod() or r_v == -2 and testPeriod())
strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_up'")
if (deadline_long_down and testPeriod())
strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_down'")
if (deadline_short and testPeriod() or g_v == 3 and testPeriod())
strategy.close("OH BRO", comment = "EXIT-SHORT 'deadline_short'")
// (you can use strategy.close_all(comment = "close all entries") here)