볼링거 밴드 트렌드 전략

저자:차오장, 날짜: 2024-01-15 14:31:21
태그:

img

전반적인 설명

이 전략은 볼링거 밴드 트렌드 다음 전략이라고 불린다. 그것은 가격 추세를 결정하기 위해 볼링거 밴드 지표를 사용하고, 가격이 볼링거 밴드 채널에서 벗어날 때 길거나 짧게 입력한다. 그것은 파기 후 트렌드 방향을 판단하는 이동 평균 필터를 포함하고, 따라서 길고 짧은 엔트리를 결정한다.

원칙

이 전략은 주로 가격 추세와 입점 지점을 결정하기 위해 볼링거 밴드 지표에 의존합니다. 볼링거 밴드는 세 가지 라인을 포함합니다.

  1. 중간선: n일 이동평균
  2. 상줄기: n일 표준편차 상승
  3. 아래쪽 선: n일 표준편차가 아래로

가격 이 상위 라인 을 통해 하위 라인 에서 상향으로 돌파 할 때, 상승 추세가 확인 됩니다. 가격 이 상위 라인 을 통해 하위 라인 을 통해 하향으로 돌파 할 때, 하향 추세가 시작 됩니다. 이 두 가지 유형의 돌파가 발생 할 때 전략 은 길거나 짧게 들어가게 됩니다.

구체적으로, 전략 논리는 다음과 같습니다.

  1. 의 하위선에서 위로 을 때 롱을 입력합니다.
  2. 스 상위선에서 아래로 내려갈 때 단축을 입력합니다.

거짓 브레이크오프를 피하기 위해 이동 평균 필터를 추가합니다. 엔트리는 이동 평균을 깨는 것과 함께 밴드를 닫을 때만 발생합니다.

여기서는 지수적인 이동 평균을 지표로 사용합니다.

요약하자면, 트렌드 브레이크를 결정하는 기준은 다음과 같습니다.

  1. 긴 신호: 닫는 파업 반지 상줄 && 닫는 파업 이동 평균
  2. 짧은 신호: 닫는 파업 하위 선 && 닫는 파업 이동 평균

엔트리 후, 스톱 로스는 중간선을 추적합니다. 가격이 다시 중간선을 만질 때 종료됩니다.

강도 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 중간 선의 브레이크에 의해 형성된 새로운 트렌드를 포착합니다. 밴드 채널은 가격 변동의 공간을 제공합니다. 브레이크 신호는 새로운 방향의 시작입니다.
  2. 이동 평균 필터를 통해 잘못된 브레이크를 피하고, 실제 트렌드 역전 시에만 진입을 보장합니다.
  3. 중간선을 추적하여 스톱 로스 메커니즘을 구축하여 위험을 효과적으로 제어합니다.
  4. 단순하고 명확한 논리, 이해하기 쉽고 구현하기 쉬운, 알고 거래 전략에 적합합니다.
  5. 채널 및 이동 평균 지표를 활용합니다. 가격을 예측할 필요가 없습니다. 사실에 대한 증거에 기초하여 추세를 식별합니다.

위험 분석

이 전략의 장점에도 불구하고 다음과 같은 위험이 있습니다.

  1. 부적절한 대역 매개 변수는 거래 빈도와 위험을 증가시킬 수 있습니다. 과도하게 민감한 설정은 과도한 잘못된 브레이크와 높은 시스템 변동을 유발할 수 있습니다.
  2. 부적절한 이동 평균 매개 변수 선택은 실제 트렌드가 누락되거나 잘못된 신호를 생성할 수 있습니다. 반복적인 테스트와 최적화를 통해 매개 변수 조정이 필요합니다.
  3. 스톱 로스는 중간에 의존하고, 조기 종료하거나 너무 많은 리트레이싱 공간을 허용 할 수 있습니다. 이것은 대부분의 수익을 놓치거나 손실 위험을 증가시킬 수 있습니다.

위의 위험을 통제하기 위해 다음 최적화를 수행 할 수 있습니다.

  1. 밴드 매개 변수를 적절히 조정하고 채널 너비를 늘려서 거짓 파업 가능성을 줄여라
  2. 최적의 조합을 찾기 위해 다른 이동 평균 유형과 길이를 테스트합니다.
  3. 다른 스톱 손실 방법을 시도하십시오. 예를 들어, 후속 스톱 손실 또는 점진적 스톱 손실 레벨.

최적화 방향

위험 분석을 바탕으로 다음 영역에서 더 많은 최적화를 할 수 있습니다.

  1. 매개 변수 최적화: 유전자 알고리즘과 같은 보다 체계적인 방법을 사용하여 밴드와 이동 평균에 대한 최적의 매개 변수 조합을 찾아 전략을 더 안정적이고 수익성있게하십시오.

  2. 손실 최적화 중지: ATR 스톱, 트레일링 스톱 등과 같은 다른 스톱 손실 기술을 테스트하여 최상의 스톱 메커니즘을 결정합니다.

  3. 필터 최적화: 추가 필터로 RSI, KD 등과 같은 다른 지표를 추가하여 잘못된 신호 확률을 낮추고 수익률을 높이는 것을 시도하십시오.

  4. 입시 기준 최적화: 트렌드 조건, 비정상적인 볼륨 등과 같은 다른 고려 사항을 추가하여 입력 시기를 엄격하게 선택하여 불필요한 항목을 피하십시오.

  5. 기계 학습: LSTM, RNN 및 다른 딥 러닝 모델을 구축하기 위해 더 많은 역사적 데이터를 수집하여 AI가 가장 좋은 입출시기를 가능하게합니다.

  6. 역동적 위험 보상 관리: 일정한 수익 수준에 도달 한 후 고정 비율 정지, 수익 목표 급증 등을 통합하여 위험 지불을 동적으로 제어합니다.

위의 영역의 최적화를 통해 안정성, 수익성, 위험 조정 능력과 같은 주요 메트릭은 포괄적으로 개선 될 수 있으며, 전략을 라이브 거래에 적합한 생산 수준의 알고리즘으로 변환 할 수 있습니다.

결론

결론적으로, 볼링거 밴드 트렌드 다음 전략은 주요 브레이크아웃 포인트에 입력하여 밴드 지표와 이동 평균을 사용하여 가격 추세를 식별합니다. 명확한 논리, 단순성, 구현 용이성 등의 장점이 있으며 매개 변수 조정, 스톱 로스 메커니즘과 같은 개선 사항도 있습니다. 매개 변수 최적화, 스톱 로스 향상, 기계 학습 통합과 같은 추가 정교는 견고하고 안정적인 알고 거래 시스템으로 전환 할 수 있습니다.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================


더 많은