이 전략은 Botvenko 지표에 기반하여 자동으로 시장 트렌드를 식별하고 긴 / 짧은 포지션을 설정하기 위해 개발되었습니다. 이 Botvenko 지표, 이동 평균 및 수평 지원 라인을 통합하여 자동으로 브레이크오웃 신호를 인식하고 포지션을 설정합니다.
이 전략의 핵심 지표는 보트벤코 지표입니다. 다른 거래 날의 폐쇄 가격 사이의 로그아리듬 차이를 계산함으로써 시장 추세와 중요한 지원/저항 수준을 판단합니다. 지표가 특정 레벨 라인을 넘을 때 길게 이동하고 아래를 넘을 때 짧게 이동합니다.
또한, 전략은 21일, 55일 및 기타 이동 평균으로 구성된 EMA 보호 벨트를 통합합니다. 이 전략은 현재 상태가 이 이동 평균의 분류 관계에 따라 황소 시장, 호황 시장 또는 통합 시장인지 결정하고 따라서 짧은 또는 긴 거래를 제한합니다.
보트벤코 지표로 거래 신호를 식별하고 이동 평균으로 시장 단계를 판단하면 합동으로 사용되면 부적절한 위치 설정이 피할 수 있습니다.
이 전략의 가장 큰 장점은 시장의 긴 / 짧은 트렌드를 자동으로 식별 할 수 있다는 것입니다. Botvenko 지표는 두 기간 동안 가격의 차이에 매우 민감하며 주요 지원 / 저항 수준을 신속하게 찾을 수 있습니다. 동시에 이동 평균의 분류는 현재 긴 또는 짧은 것이 더 좋는지 효과적으로 판단 할 수 있습니다.
빠른 지표와 트렌드 지표를 결합하는 이 아이디어는 전략이 부적절한 구매 및 판매를 방지하는 동시에 입력 및 출구 지점을 신속하게 찾을 수있게합니다. 이것은 가장 큰 장점입니다.
이 전략의 위험은 주로 두 가지 측면에서 발생합니다. 첫째, Botvenko 지표 자체는 가격 변화에 매우 민감하며, 많은 불필요한 거래 신호를 생성 할 수 있습니다. 둘째, 이동 평균의 분류는 옆으로 이동하는 동안 엉망이 될 수 있으며, 엉망이 되는 위치 확립으로 이어집니다.
첫 번째 위험을 해결하기 위해 Botvenko 지표의 매개 변수를 조정하여 계산 주기를 늘리고 불필요한 거래를 줄일 수 있습니다. 두 번째 위험에 대해 추세 판단을 더 정확하게하기 위해 더 많은 이동 평균을 추가 할 수 있습니다.
주요 최적화 방향은 매개 변수 조정 및 필터 조건을 추가하는 것입니다.
보트벤코 지표의 경우, 최적의 조합을 찾기 위해 다른 기간 매개 변수를 시도할 수 있다. 이동 평균의 경우, 더 완전한 트렌드 판단 시스템을 형성하기 위해 더 많은 것을 추가할 수 있다. 또한, 변동성 지표, 거래량 지표 등도 잘못된 신호를 필터링하기 위해 도입될 수 있다.
매개 변수와 필터 조건의 포괄적 인 조정으로 전략의 안정성과 수익성이 더욱 향상 될 수 있습니다.
적응형 보트벤코 장기/단기 전략은 주요 시장 지점을 자동으로 식별하고 올바른 포지션을 설정하기 위해 신속하고 트렌드 인디케이터를 성공적으로 결합합니다. 이의 장점은 빠른 위치 및 부적절한 포지션 예방에 있습니다. 다음 단계는 매개 변수 및 조건 최적화를 통해 안정성과 수익성을 더욱 향상시키는 것입니다.
/*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)