Адаптивный индикатор Ботвенко Долгая краткосрочная стратегия

Автор:Чао Чжан, Дата: 2024-01-04 16:09:30
Тэги:

img

Обзор

Эта стратегия разработана на основе индикатора Ботвенко для автоматического выявления рыночных тенденций и установления длинных/коротких позиций. Она интегрирует индикатор Ботвенко, скользящие средние и горизонтальные линии поддержки для автоматического распознавания сигналов прорыва и установления позиций.

Принцип стратегии

Основным показателем этой стратегии является индикатор Ботвенко. Вычисляя логарифмическую разницу между ценами закрытия в разные торговые дни, он оценивает тенденцию рынка и важные уровни поддержки / сопротивления.

Кроме того, стратегия включает в себя EMA Protection Belt, состоящий из 21-дневных, 55-дневных и других скользящих средних. Она определяет, является ли текущее состояние бычьим рынком, медвежьим рынком или рынком консолидации на основе сортировочных отношений этих скользящих средних, и соответственно ограничивает короткие или длинные операции.

При использовании в сочетании с индикатором Ботвенко можно избежать неправильного установления позиции, определяя торговые сигналы и оценивая этапы рынка с помощью скользящих средних.

Анализ преимуществ

Наибольшее преимущество этой стратегии заключается в том, что она может автоматически идентифицировать длинные/короткие тенденции рынка. Индикатор Ботвенко очень чувствителен к разнице между ценами в течение двух периодов времени и может быстро определить ключевые уровни поддержки/сопротивления. В то же время сортировка скользящих средних может эффективно оценить, лучше ли в настоящее время быть длинным или коротким.

Эта идея сочетания быстрых и тенденционных индикаторов позволяет стратегии быстро определять точки входа и выхода, предотвращая ненадлежащие покупки и продажи.

Анализ рисков

Риски этой стратегии в основном исходят из двух аспектов. Во-первых, сам индикатор Ботвенко очень чувствителен к изменениям цен, которые могут генерировать много ненужных торговых сигналов. Во-вторых, сортировка скользящих средних может стать беспорядочной во время боковых движений, что приводит к беспорядочному установлению позиции.

Для решения первого риска параметры индикатора Ботвенко могут быть скорректированы, чтобы увеличить цикл расчета и уменьшить ненужные сделки.

Руководство по оптимизации

Основными направлениями оптимизации являются настройка параметров и добавление условий фильтра.

Для индикатора Ботвенко можно попробовать различные параметры периода, чтобы найти оптимальную комбинацию. Для скользящих средних можно добавить больше из них, чтобы сформировать более полную систему оценки тренда. Кроме того, для фильтрации ложных сигналов также могут быть введены индикаторы волатильности, индикаторы объема торговли и т. д.

Благодаря всесторонней корректировке параметров и условий фильтрации стабильность и рентабельность стратегии могут быть еще более повышены.

Резюме

Адаптивная стратегия длинного/короткого ценового курса Ботвенко успешно сочетает в себе быстрые и трендовые индикаторы для автоматического выявления ключевых рыночных точек и установления правильных позиций. Ее преимущества заключаются в быстром расположении и предотвращении неуместных позиций. Следующим шагом является дальнейшее улучшение стабильности и прибыльности посредством оптимизации параметров и условий.


/*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)



Больше