MACD TrueLevel 전략

저자:차오장, 날짜: 2023-10-07 10:23:01
태그:

전반적인 설명

MACD TrueLevel 전략은 MACD 지표와 TrueLevel 대역을 사용하여 구매 및 판매 신호를 결정합니다. 트렌드의 시작과 끝을 더 정확하게 파악하기 위해 MACD 위에 TrueLevel 대역을 추가합니다.

원칙

이 전략은 먼저 MACD 지표를 계산하고, 그 다음 다른 기간의 14 TrueLevel 밴드를 계산합니다. TrueLevel 밴드는 선형 회귀선과 다른 길이 기간 동안 가격의 표준편차를 기반으로 계산됩니다. 그 다음 브레이크아웃 신호를 위해 가장 높은 상위 밴드와 가장 낮은 하위 밴드를 선택합니다.

구체적으로, 출입 신호는 신호 라인 위의 MACD 라인 크로스오버 또는 선택된 TrueLevel 하위 밴드 위의 가격 브레이크오버이다. 출구 신호는 신호 라인 아래의 MACD 라인 크로스오버 또는 선택된 TrueLevel 상위 밴드 아래의 가격 브레이크오버이다.

트루레벨 밴드를 사용하는 장점은 트렌드 방향과 변동성 범위를 결합하여 트렌드의 시작과 끝을 더 정확하게 결정한다는 것입니다. MACD와 비교하면 TrueLevel 밴드 필터를 추가하면 잘못된 신호를 줄일 수 있습니다.

이점 분석

  1. MACD는 트렌드 방향을 효과적으로 판단하고 트렌드를 잘 추적합니다.

  2. 트루레벨 대역을 추가하면 잘못된 브레이크오웃을 필터링하고 트렌드를 확인 할 수 있습니다. 트루레벨 대역은 트렌드와 변동성을 모두 고려하여 판단이 더 정확합니다.

  3. TrueLevel 대역은 여러 기간을 포함하고, 트렌드 변화를 포괄적으로 판단합니다.

  4. 조절 가능한 TrueLevel 대역 매개 변수는 다른 시장 환경에 적합합니다.

  5. 트렌드 기회를 완전히 포착하기 위해 긴 포지션과 짧은 포지션을 지원합니다.

위험 분석

  1. MACD 단독으로 더 많은 잘못된 신호를 생성할 수 있으며 TrueLevel 필터가 필요합니다.

  2. 잘못된 TrueLevel 대역 매개 변수 설정으로 인해 입력 또는 출구가 놓칠 수 있습니다. 매개 변수는 시장을 기반으로 조정해야합니다.

  3. 긴 포지션과 짧은 포지션은 충분한 자본 지원을 필요로 하고, 그렇지 않으면 마진 콜이 발생할 수 있습니다.

  4. 브레이크오웃 거래 자체는 중단될 위험이 있으며, 적시에 스톱 로스를 요구합니다.

  5. 모든 지표 전략은 상품과 암호화폐와 같은 고휘발성 상품에서 잘 작동하지 않을 위험이 있습니다.

최적화 방향

  1. 시장에 최적의 값을 찾기 위해 더 많은 기간 매개 변수를 테스트합니다.

  2. 손실 위험을 줄이기 위해 스톱 로스 전략을 추가합니다.

  3. 부피, KDJ 등과 같은 다른 지표 필터를 추가하여 잘못된 파장을 줄이십시오.

  4. 수익률을 높이기 위해 이전 최고/하위점을 깨는 것과 같은 입구점을 최적화합니다.

  5. 트렌드 확률을 판단하기 위해 기계 학습 모델을 추가하여 수동 매개 변수 조정을 줄입니다.

요약

MACD TrueLevel 전략은 트렌드 및 범위 분석을 통합합니다. MACD보다 트렌드의 시작과 끝을 더 정확하게 파악하기 위해 MACD 위에 TrueLevel 밴드를 추가합니다. 잘못된 신호를 효과적으로 필터하고 트렌드를 잡을 수 있습니다. 여전히 매개 변수 및 스톱 로스 최적화가 필요한 위험이 있습니다. 전반적으로 트렌드 거래에 적합하며 중장기 시장 트렌드를 꾸준히 잡습니다.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 4h
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/
// © Julien_Eche

//@version=4
strategy("MACD TrueLevel Strategy", shorttitle="MACD TL", overlay=true)

// Input parameters for MACD
fastLength = input(12, title="Fast Length", type=input.integer)
slowLength = input(26, title="Slow Length", type=input.integer)
signalLength = input(9, title="Signal Length", type=input.integer)

// Inputs for selecting bands
entry_band = input(12, title="Entry TrueLevel Band", type=input.integer, minval=1, maxval=14)
exit_band = input(12, title="Exit TrueLevel Band", type=input.integer, minval=1, maxval=14)

// Input for long and short mode
long_and_short = input(false, title="Enable Long and Short", type=input.bool)

// Calculate the MACD
[macdLine, signalLine, _] = macd(close, fastLength, slowLength, signalLength)


// User inputs
len1 = input(title="Length 1", type=input.integer, defval=126)
len2 = input(title="Length 2", type=input.integer, defval=189)
len3 = input(title="Length 3", type=input.integer, defval=252)
len4 = input(title="Length 4", type=input.integer, defval=378)
len5 = input(title="Length 5", type=input.integer, defval=504)
len6 = input(title="Length 6", type=input.integer, defval=630)
len7 = input(title="Length 7", type=input.integer, defval=756)
len8 = input(title="Length 8", type=input.integer, defval=1008)
len9 = input(title="Length 9", type=input.integer, defval=1260)
len10 = input(title="Length 10", type=input.integer, defval=1638)
len11 = input(title="Length 11", type=input.integer, defval=2016)
len12 = input(title="Length 12", type=input.integer, defval=2646)
len13 = input(title="Length 13", type=input.integer, defval=3276)
len14 = input(title="Length 14", type=input.integer, defval=4284)

fill_color = input(title="Fill Color", type=input.color, defval=color.rgb(0, 191, 255, 95))
mult = input(title="Multiple", type=input.float, defval=1, step=0.2, options=[0.6, 0.8, 1, 1.2, 1.4])
src = input(title="Source", type=input.source, defval=close)

// Upper band calculation function
upperBand(length) =>
    linreg = linreg(src, length, 0)
    stddev = mult * stdev(src, length)
    upperband = linreg + stddev
    upperband

// Lower band calculation function
lowerBand(length) =>
    linreg = linreg(src, length, 0)
    stddev = mult * stdev(src, length)
    lowerband = linreg - stddev
    lowerband

// Calculate upper and lower bands for each length
upperband_1 = upperBand(len1)
upperband_2 = upperBand(len2)
upperband_3 = upperBand(len3)
upperband_4 = upperBand(len4)
upperband_5 = upperBand(len5)
upperband_6 = upperBand(len6)
upperband_7 = upperBand(len7)
upperband_8 = upperBand(len8)
upperband_9 = upperBand(len9)
upperband_10 = upperBand(len10)
upperband_11 = upperBand(len11)
upperband_12 = upperBand(len12)
upperband_13 = upperBand(len13)
upperband_14 = upperBand(len14)

lowerband_1 = lowerBand(len1)
lowerband_2 = lowerBand(len2)
lowerband_3 = lowerBand(len3)
lowerband_4 = lowerBand(len4)
lowerband_5 = lowerBand(len5)
lowerband_6 = lowerBand(len6)
lowerband_7 = lowerBand(len7)
lowerband_8 = lowerBand(len8)
lowerband_9 = lowerBand(len9)
lowerband_10 = lowerBand(len10)
lowerband_11 = lowerBand(len11)
lowerband_12 = lowerBand(len12)
lowerband_13 = lowerBand(len13)
lowerband_14 = lowerBand(len14)

// Plot envelope bands for each length
upperband_1_plot = plot(upperband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 1")
lowerband_1_plot = plot(lowerband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 1")

upperband_2_plot = plot(upperband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 2")
lowerband_2_plot = plot(lowerband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 2")

upperband_3_plot = plot(upperband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 3")
lowerband_3_plot = plot(lowerband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 3")

upperband_4_plot = plot(upperband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 4")
lowerband_4_plot = plot(lowerband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 4")

upperband_5_plot = plot(upperband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 5")
lowerband_5_plot = plot(lowerband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 5")

upperband_6_plot = plot(upperband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 6")
lowerband_6_plot = plot(lowerband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 6")

upperband_7_plot = plot(upperband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 7")
lowerband_7_plot = plot(lowerband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 7")

upperband_8_plot = plot(upperband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 8")
lowerband_8_plot = plot(lowerband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 8")

upperband_9_plot = plot(upperband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 9")
lowerband_9_plot = plot(lowerband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 9")

upperband_10_plot = plot(upperband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 10")
lowerband_10_plot = plot(lowerband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 10")

upperband_11_plot = plot(upperband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 11")
lowerband_11_plot = plot(lowerband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 11")

upperband_12_plot = plot(upperband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 12")
lowerband_12_plot = plot(lowerband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 12")

upperband_13_plot = plot(upperband_13, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 13")
lowerband_13_plot = plot(lowerband_13, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 13")

upperband_14_plot = plot(upperband_14, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 14")
lowerband_14_plot = plot(lowerband_14, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 14")


// Plot fills for each length
fill(upperband_1_plot, lowerband_1_plot, color=fill_color, title="Fill 1")
fill(upperband_2_plot, lowerband_2_plot, color=fill_color, title="Fill 2")
fill(upperband_3_plot, lowerband_3_plot, color=fill_color, title="Fill 3")
fill(upperband_4_plot, lowerband_4_plot, color=fill_color, title="Fill 4")
fill(upperband_5_plot, lowerband_5_plot, color=fill_color, title="Fill 5")
fill(upperband_6_plot, lowerband_6_plot, color=fill_color, title="Fill 6")
fill(upperband_7_plot, lowerband_7_plot, color=fill_color, title="Fill 7")
fill(upperband_8_plot, lowerband_8_plot, color=fill_color, title="Fill 8")
fill(upperband_9_plot, lowerband_9_plot, color=fill_color, title="Fill 9")
fill(upperband_10_plot, lowerband_10_plot, color=fill_color, title="Fill 10")
fill(upperband_11_plot, lowerband_11_plot, color=fill_color, title="Fill 11")
fill(upperband_12_plot, lowerband_12_plot, color=fill_color, title="Fill 12")
fill(upperband_13_plot, lowerband_13_plot, color=fill_color, title="Fill 13")
fill(upperband_14_plot, lowerband_14_plot, color=fill_color, title="Fill 14")

// Add variables to store the highest upper band and lowest lower band values
var float highestUpperBand = na
var float lowestLowerBand = na

// Calculate the trueLevelUpperBand and trueLevelLowerBand
trueLevelUpperBand = max(upperband_1, max(upperband_2, max(upperband_3, max(upperband_4, max(upperband_5, max(upperband_6, max(upperband_7, max(upperband_8, max(upperband_9, max(upperband_10, max(upperband_11, max(upperband_12, max(upperband_13, upperband_14)))))))))))))
trueLevelLowerBand = min(lowerband_1, min(lowerband_2, min(lowerband_3, min(lowerband_4, min(lowerband_5, min(lowerband_6, min(lowerband_7, min(lowerband_8, min(lowerband_9, min(lowerband_10, min(lowerband_11, min(lowerband_12, min(lowerband_13, lowerband_14)))))))))))))

// Update the highest upper band and lowest lower band
highestUpperBand := highest(trueLevelUpperBand, 1)
lowestLowerBand := lowest(trueLevelLowerBand, 1)

// Store the upper and lower bands in an array for easy access
upperbands = array.new_float(14)
lowerbands = array.new_float(14)

array.set(upperbands, 0, upperband_1)
array.set(upperbands, 1, upperband_2)
array.set(upperbands, 2, upperband_3)
array.set(upperbands, 3, upperband_4)
array.set(upperbands, 4, upperband_5)
array.set(upperbands, 5, upperband_6)
array.set(upperbands, 6, upperband_7)
array.set(upperbands, 7, upperband_8)
array.set(upperbands, 8, upperband_9)
array.set(upperbands, 9, upperband_10)
array.set(upperbands, 10, upperband_11)
array.set(upperbands, 11, upperband_12)
array.set(upperbands, 12, upperband_13)
array.set(upperbands, 13, upperband_14)

array.set(lowerbands, 0, lowerband_1)
array.set(lowerbands, 1, lowerband_2)
array.set(lowerbands, 2, lowerband_3)
array.set(lowerbands, 3, lowerband_4)
array.set(lowerbands, 4, lowerband_5)
array.set(lowerbands, 5, lowerband_6)
array.set(lowerbands, 6, lowerband_7)
array.set(lowerbands, 7, lowerband_8)
array.set(lowerbands, 8, lowerband_9)
array.set(lowerbands, 9, lowerband_10)
array.set(lowerbands, 10, lowerband_11)
array.set(lowerbands, 11, lowerband_12)
array.set(lowerbands, 12, lowerband_13)
array.set(lowerbands, 13, lowerband_14)

// Get the selected bands for entry and exit
selected_entry_lowerband = array.get(lowerbands, entry_band - 1)
selected_exit_upperband = array.get(upperbands, exit_band - 1)


// Entry conditions
longCondition = crossover(macdLine, signalLine) or crossover(close, selected_entry_lowerband)
shortCondition = crossunder(macdLine, signalLine) or crossunder(close, selected_exit_upperband)

// Exit conditions
exitLongCondition = crossunder(macdLine, signalLine) or crossunder(close, selected_exit_upperband)
exitShortCondition = crossover(macdLine, signalLine) or crossover(close, selected_entry_lowerband)

// Strategy execution
strategy.entry("Long", strategy.long, when = longCondition)
strategy.entry("Short", strategy.short, when = shortCondition and long_and_short)
strategy.close("Long", when = exitLongCondition)
strategy.close("Short", when = exitShortCondition)

더 많은