볼 밴드 채널 모멘텀 변동성 전략


생성 날짜: 2023-10-31 15:54:41 마지막으로 수정됨: 2023-10-31 15:54:41
복사: 0 클릭수: 733
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

볼 밴드 채널 모멘텀 변동성 전략

개요

이 전략은 볼带通道 안과 밖의 비교를 이용하여 트렌드를 판단하고, 동량 지표 추적 트렌드를 결합하여, 트렌드 추적 전략의 일종이다. 策略은 channel 안의 변동이 channel 외보다 작을 때 새로운 트렌드 방향 신호를 생성하고, 포지션을 열어준다. 포지션 중지 손실은 ATR 곱수를 채택하고, 스톱은 ATR 곱하기 위험 수익률이다.

원칙

이 전략은 다음과 같은 부분들로 구성됩니다.

  1. 볼띠 설정: 큰 볼띠 길이 40주기, 작은 볼띠 길이 20주기, 통로 폭은 표준 차이의 2배이다.

  2. 통로 폭발oin 판단: 큰 볼띠의 오르락이 작은 볼띠의 오르락보다 낮고, 큰 볼띠의 하락이 작은 볼띠의 하락보다 높으면, 파동이 커지고 새로운 트렌드 방향 신호를 생성한다는 것을 나타냅니다.

  3. 동력 지표: 240주기의 14일 EMA, 트렌드 방향을 판단한다.

  4. ATR 스탠더드 스탠더드: ATR의 14배의 스탠더드 거리, 스탠더드 스탠더드의 1.5배의 스탠더드 거리

전략은 먼저 통로가 터지는지 판단하고, 통로가 터지면 동력 방향을 판단하고, 더하거나 공백을 결정한다. 출전 후, ATR 배수로 중지 손해 중지 관리를 한다.

장점

  1. 이중극대구조를 사용하여, 다른 시간주기의 변동 상황을 비교하여 트렌드 폭발점을 판단할 수 있다.

  2. 동력 지표로 트렌드 방향을 판단하고, 흔들리는 시장의 휘프사우를 피하십시오.

  3. ATR을 이용하여 손해지침을 관리할 수 있으며, 시장의 변동에 따라 손해지침 거리를 조정할 수 있다.

  4. 위험과 이익의 비율이 적당하고, 지나치게 추구하는 것을 피하고, 너무 보수적이지 않습니다.

위험

  1. 명확한 추세가 없는 진동상태에서 쉽게 잡힐 수 있다. 동력 지표 매개 변수를 최적화함으로써 잘못된 판단을 줄일 수 있다.

  2. ATR 정지는 너무 보수적일 수 있으며, 이동식 정지와 같은 다른 정지를 테스트할 수 있다.

  3. 고정된 스톱로스 스배수는 모든 품종에 적합하지 않을 수 있으며, 이를 조정할 수 있도록 고려할 수 있다.

  4. 쌍방향띠 판단 트렌드 전환점 효과는 의심스럽고, KD 채널 등과 같은 다른 채널 지표를 테스트 할 수 있다.

최적화 방향

  1. 다양한 동력 지표 변수를 테스트하여 최적의 변수 조합을 찾습니다.

  2. 이동식 중지, 자동 ATR 등과 같은 다른 중지 방법을 시도하십시오.

  3. 스피드 로스 스피드 배수는 다양한 품종과 시장 환경에 따라 최적화 할 수 있습니다.

  4. 다양한 통로 지표의 효과를 테스트하고, 보다 안정적인 통로 지표를 선택한다.

  5. 이윤 관리를 고려해 수익을 통제할 수 있도록 한다.

  6. “이번 대회에서 우승률을 높이기 위해, 시간, 시간대 등을 필터링할 수 있습니다”.

요약하다

이 전략의 전체적인 아이디어는 명확하며, 쌍방향을 이용한 트렌드 터진 지점을 판단하는 것이 가장 큰 장점이다. 그러나 여전히 손해 방지 방법, 통로 지표, 위험 관리 등에 대한 최적화 테스트가 필요하므로 전략 매개 변수가 더 적응할 수 있고, 다양한 시장 환경에서 안정적으로 작동할 수 있다.

전략 소스 코드
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
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/
// © kasaism
//@version=4
// strategy(title="[EURUSD60] BB Expansion Strategy", shorttitle="[EURUSD60] BBEXP",overlay=true, max_bars_back=5000, max_labels_count=500)

// === INPUTS === //
////BB
largeBbRes = input(title="Large BB Resolution", type=input.resolution, defval="", group="BB")
largeBbLength = input(title="Large BB Length", type=input.integer, defval=40, minval=1, group="BB")
smallBbRes = input(title="Small BB Resolution ", type=input.resolution, defval="", group="BB")
smallBbLength = input(title="Small BB Length", type=input.integer, defval=20, minval=1, group="BB")
multi = input(title="BB StdDev", type=input.float, defval=2.0, maxval=10, minval=0.01, group="BB")
validLen = input(title="BB expand valid length", defval=14, group="BB")

// 3 each EMA settings. EMA directions are as each time frame directions. 
resFirstTime = input(title="EMA Trend t/f", type=input.resolution, defval="240", group="SMT")
// resSecondTime = input(title="Second t/f", type=input.resolution, defval="30", group="SMT") 
// resThirdTime = input(title="Third t/f", type=input.resolution, defval="", group="SMT")
emaLen = input(14, minval=1, title="Length", group="SMT") 
smooth = input(3, minval=1, title="Smooth factor", group="SMT")

//Lisk Management
var riskManagementRule1 = "ATR"
var riskManagementRule2 = "Bracket"
riskManagementRule = input(riskManagementRule1, "Detect Risk Management Based On", options=[riskManagementRule1, riskManagementRule2, "No detection"], group="Trade")
atrMulti = input(3.0, title="ATR Multiple", type=input.float, minval = 1.0, group="ATR")
riskRewardRatio = input(1.5, title="Risk Reward Ratio for ATR", type=input.float, minval = 0.01, group="ATR")
stopLossPoint = input(100, title="Stop Loss Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
takeProfitPoint = input(200, title="Take Profit Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
// === /INPUTS/ === //

// === CONSTANT === //
//For barmerge.lookahead_off
index = barstate.isrealtime ? 1 : 0

//For Entry
NOENTRY=0
LONG=1
SHORT=2

//SMT color
int up=1
int dn=2
int up_HL=3
int dn_HL=4

//label color
color_bearish = color.red
color_bullish = color.blue
C_label_color_bearish = color.red
C_label_color_bullish = color.blue
// === /CONSTANT/ === //


// === FUNCTIONS === //
//BB trade direction
bbTradeDetection(lrgUpper, lrgLower, smlUpper, smlLower) =>
    if not(na(lrgUpper) or na(lrgLower) or na(smlUpper) or na(smlLower))
        if lrgUpper < smlUpper and lrgLower > smlLower
            true
        else
            false
    else
        na
// === /FUNCTIONS/ === //


// === CALCURATES === //
////BB
//large BB
lrgBbBasis = security(syminfo.tickerid, largeBbRes, sma(close[index], largeBbLength))
lrgBbDev = multi * security(syminfo.tickerid, largeBbRes, stdev(close[index], largeBbLength))
lrgBbUpper = lrgBbBasis + lrgBbDev
lrgBbLower = lrgBbBasis - lrgBbDev

//small BB
smlBbBasis = security(syminfo.tickerid, smallBbRes, sma(close[index], smallBbLength))
smlBbDev = multi * security(syminfo.tickerid, smallBbRes, stdev(close[index], smallBbLength))
smlBbUpper = smlBbBasis + smlBbDev
smlBbLower = smlBbBasis - smlBbDev

bbTrade = bbTradeDetection(lrgBbUpper, lrgBbLower, smlBbUpper, smlBbLower)

//EMA Trend
base=security(syminfo.tickerid, resFirstTime, ema(close[index],emaLen))
sig=security(syminfo.tickerid, resFirstTime, ema(base[index],smooth))
emaTrend = not(na(base) or na(sig)) ? base < sig ? dn : up : na

////LISK MANAGEMENT
float stopLossLineForLong = na
float stopLossLineForShort = na
float takeProfitLineForLong = na
float takeProfitLineForShort = na
atr_ = atr(14) * atrMulti

if riskManagementRule == riskManagementRule1
    stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : round(close[index] - atr_,3) : na
    stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : round(close[index] + atr_,3) : na
    takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] + atr_*riskRewardRatio : na
    takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - atr_*riskRewardRatio : na

if riskManagementRule == riskManagementRule2
    stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : close[index] - stopLossPoint * syminfo.mintick : na
    stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : close[index] + stopLossPoint * syminfo.mintick : na
    takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] +takeProfitPoint * syminfo.mintick : na
    takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - takeProfitPoint * syminfo.mintick : na
// === /CALCURATES/ === //


// === CONDITIONS === //
//BB
bool isBbEntry = na
for i=0 to validLen
    isBbEntry := bbTrade==true ? true : bbTrade[i]==true ? true : false
//plotshape(isBbEntry, style=shape.circle, location=location.bottom)

isBbLong = isBbEntry and open[index] < smlBbBasis[index] and close[index] > smlBbBasis[index]
isBbShort = isBbEntry and open[index] > smlBbBasis[index] and close[index] < smlBbBasis[index]  

//SMT
isEmaLong = emaTrend == up 
isEmaShort = emaTrend == dn

//ATR
isAtrLongStop = low[index] <= stopLossLineForLong
isAtrShortStop = high[index] >= stopLossLineForShort
isAtrLongLimit = high[index] >= takeProfitLineForLong
isAtrShortLimit = low[index] <= takeProfitLineForShort
// === /CONDITIONS/ === //


// === TRADE === //
//ENTRY
if (isBbLong and isEmaLong)
    strategy.entry("LongEntry", strategy.long,  comment="LongEntry")
    if riskManagementRule == riskManagementRule2
        strategy.exit("LongEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
if (isBbShort and isEmaShort)
    strategy.entry("ShortEntry", strategy.short,  comment="ShortEntry")
    if riskManagementRule == riskManagementRule2	        
        strategy.exit("ShortEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
//EXIT
if riskManagementRule == riskManagementRule1
    if(isAtrLongStop)
        strategy.close("LongEntry", when=isAtrLongStop, comment="ATR Stop")
    if(isAtrShortStop)
        strategy.close("ShortEntry", when=isAtrShortStop, comment="ATR Stop")
    if(isAtrLongLimit)
        strategy.close("LongEntry", when=isAtrLongLimit, comment="ATR Limit")
    if(isAtrShortLimit)
        strategy.close("ShortEntry", when=isAtrShortLimit, comment="ATR Limit")
//  === /TRADE/ === //


// === PLOTS === //
plot(lrgBbBasis, title="Large BB Basis", linewidth=2, color=color.gray)
plot(lrgBbUpper, title="Large BB Upper", linewidth=2, color=color.gray)
plot(lrgBbLower, title="Large BB Lower", linewidth=2, color=color.gray)
plot(smlBbBasis, title="Small BB Basis", color=color.white)
plot(smlBbUpper, title="Small BB Upper", color=color.white)
plot(smlBbLower, title="Small BB Lower", color=color.white)
plot(base, title="EMA Line", color= emaTrend==dn ? color_bearish : emaTrend==up ? color_bullish : color.gray)

plot(stopLossLineForLong ? stopLossLineForLong : na, title="S/L Line For Long", color=color.yellow, style=plot.style_circles)
plot(stopLossLineForShort ? stopLossLineForShort : na, title="S/L Line For Short", color=color.yellow, style=plot.style_circles)
plot(takeProfitLineForLong ? takeProfitLineForLong : na, title="T/P Line For Long", color=color.purple, style=plot.style_circles)
plot(takeProfitLineForShort ? takeProfitLineForShort : na, title="T/P Line For Short", color=color.purple, style=plot.style_circles)
// /=== PLOTS ===/ //