이 전략은
이 전략은 주로 가격 추세와 입점 지점을 결정하기 위해 볼링거 밴드 지표에 의존합니다. 볼링거 밴드는 세 가지 라인을 포함합니다.
가격 이 상위 라인 을 통해 하위 라인 에서 상향으로 돌파 할 때, 상승 추세가 확인 됩니다. 가격 이 상위 라인 을 통해 하위 라인 을 통해 하향으로 돌파 할 때, 하향 추세가 시작 됩니다. 이 두 가지 유형의 돌파가 발생 할 때 전략 은 길거나 짧게 들어가게 됩니다.
구체적으로, 전략 논리는 다음과 같습니다.
거짓 브레이크오프를 피하기 위해 이동 평균 필터를 추가합니다. 엔트리는 이동 평균을 깨는 것과 함께 밴드를 닫을 때만 발생합니다.
여기서는 지수적인 이동 평균을 지표로 사용합니다.
요약하자면, 트렌드 브레이크를 결정하는 기준은 다음과 같습니다.
엔트리 후, 스톱 로스는 중간선을 추적합니다. 가격이 다시 중간선을 만질 때 종료됩니다.
이 전략의 주요 장점은 다음과 같습니다.
이 전략의 장점에도 불구하고 다음과 같은 위험이 있습니다.
위의 위험을 통제하기 위해 다음 최적화를 수행 할 수 있습니다.
위험 분석을 바탕으로 다음 영역에서 더 많은 최적화를 할 수 있습니다.
매개 변수 최적화: 유전자 알고리즘과 같은 보다 체계적인 방법을 사용하여 밴드와 이동 평균에 대한 최적의 매개 변수 조합을 찾아 전략을 더 안정적이고 수익성있게하십시오.
손실 최적화 중지: ATR 스톱, 트레일링 스톱 등과 같은 다른 스톱 손실 기술을 테스트하여 최상의 스톱 메커니즘을 결정합니다.
필터 최적화: 추가 필터로 RSI, KD 등과 같은 다른 지표를 추가하여 잘못된 신호 확률을 낮추고 수익률을 높이는 것을 시도하십시오.
입시 기준 최적화: 트렌드 조건, 비정상적인 볼륨 등과 같은 다른 고려 사항을 추가하여 입력 시기를 엄격하게 선택하여 불필요한 항목을 피하십시오.
기계 학습: LSTM, RNN 및 다른 딥 러닝 모델을 구축하기 위해 더 많은 역사적 데이터를 수집하여 AI가 가장 좋은 입출시기를 가능하게합니다.
역동적 위험 보상 관리: 일정한 수익 수준에 도달 한 후 고정 비율 정지, 수익 목표 급증 등을 통합하여 위험 지불을 동적으로 제어합니다.
위의 영역의 최적화를 통해 안정성, 수익성, 위험 조정 능력과 같은 주요 메트릭은 포괄적으로 개선 될 수 있으며, 전략을 라이브 거래에 적합한 생산 수준의 알고리즘으로 변환 할 수 있습니다.
결론적으로,
/*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) // ======================================================================================================================