리소스 로딩... 로딩...

다기간의 슈퍼트렌드 다이내믹 피라미딩 거래 전략

저자:차오장, 날짜: 2025-01-06 17:02:35
태그:ATRSTSL

img

전반적인 설명

이 전략은 여러 개의 슈퍼트렌드 지표를 기반으로 하는 피라미드 트레이딩 전략이다. 이 전략은 다양한 기간과 인수와 함께 세 개의 슈퍼트렌드 지표를 사용하여 높은 확률의 거래 기회를 식별한다. 이 전략은 최대 세 개의 포지션을 허용하는 동적 피라미드 엔트리를 사용하여, 동적 스톱 로스 및 유연한 출구 조건과 결합하여 위험을 제어하면서 이익을 극대화합니다.

전략 원칙

이 전략은 세 개의 슈퍼트렌드 지표를 사용하여 다른 매개 변수 설정을 사용합니다. 빠르고, 중량, 느립니다. 엔트리 신호는이 지표의 크로스오버와 트렌드 방향을 기반으로 하며, 3층 피라미드 접근 방식을 구현합니다. 빠른 지표가 아래로 지표하고 중간 지표가 올라가고 느린 지점이 내려갈 때 첫 번째 엔트리; 빠르고 중간 지표가 모두 아래로 지표 할 때 두 번째 엔트리 브레이크; 가격이 새로운 최고치를 만들 때 세 번째 엔트리 브레이크를 통해 출입. 출입은 동적 스톱-러스, 평균 가격 스톱 및 전반적인 트렌드 역전 등 여러 메커니즘을 통해 관리됩니다.

전략적 장점

  1. 다중 확인 메커니즘은 거래 정확성을 향상시킵니다.
  2. 피라미드 방식은 유행 시장에서 수익을 크게 증폭시킵니다.
  3. 동적 스톱 로스 메커니즘은 이윤을 보호하면서 트렌드 개발을 허용합니다.
  4. 유연한 출구 메커니즘은 다른 시장 조건에 잘 적응합니다.
  5. 비율에 기반한 포지션 크기는 다른 자본 크기에 적응합니다.

전략 위험

  1. 다양한 시장에서 자주 잘못된 신호를 생성 할 수 있습니다.
  2. 피라미딩 방식은 급격한 트렌드 역전 시 더 큰 인출을 초래할 수 있습니다.
  3. 여러 표시가 시그널 지연을 초래할 수 있습니다.
  4. 매개 변수 최적화에는 과도한 적합성 위험이 있습니다. 이러한 위험을 통제하기 위해 엄격한 자금 관리와 백트 테스트를 실시하는 것이 좋습니다.

최적화 방향

  1. 변동성에 기반한 매개 변수를 동적으로 조정하기 위해 시장 환경 필터를 추가합니다.
  2. 입구 간격 및 위치 크기 할당을 최적화
  3. 거짓 신호를 필터링하기 위한 추가적인 기술 지표를 도입
  4. 시장 변화에 적응하기 위한 적응적 매개 변수 메커니즘 개발
  5. 수익 목표 및 시간 기반 정지를 추가하여 출구 메커니즘을 강화합니다.

요약

이 전략은 다중 슈퍼트렌드 지표와 피라미딩 엔트리를 통해 트렌딩 기회를 포착하며, 동적 스톱 로스 및 유연한 출구 메커니즘으로 위험을 제어합니다. 특정 한계에도 불구하고 지속적인 최적화 및 엄격한 위험 통제로 전략은 좋은 실용적 응용 가치를 보여줍니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy('4Vietnamese 3x Supertrend', overlay=true, max_bars_back=1000, initial_capital = 10000000000, slippage = 2, commission_type = strategy.commission.percent, commission_value = 0.013, default_qty_type=strategy.percent_of_equity, default_qty_value = 33.33, pyramiding = 3, margin_long = 0, margin_short = 0)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inputs

// Supertrend Settings
STATRLENGTH1 = input.int(10, title='Fast Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT1 = input.float(1, title='Fast Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH2 = input.int(11, title='Medium Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT2 = input.float(2, title='Medium Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH3 = input.int(12, title='Slow Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT3 = input.float(3, title='Slow Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')

isUseHighestOf2RedCandleSetup = input.bool(false, group = "Setup Filters")


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculations 
[superTrend1, dir1] = ta.supertrend(STATRMULT1, STATRLENGTH1)
[superTrend2, dir2] = ta.supertrend(STATRMULT2, STATRLENGTH2)
[superTrend3, dir3] = ta.supertrend(STATRMULT3, STATRLENGTH3)

// directionST1 = dir1 == 1 and dir1[1] == 1 ? false : dir1 == -1 and dir1[1] == -1 ? true : false
// directionST2 = dir2 == 1 and dir2[1] == 1 ? false : dir2 == -1 and dir2[1] == -1 ? true : false
// directionST3 = dir3 == 1 and dir3[1] == 1 ? false : dir3 == -1 and dir3[1] == -1 ? true : false


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculate highest from supertrend1 uptrend
var float highestGreen = 0
if dir1 < 0 and highestGreen == 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    highestGreen := high
if highestGreen > 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    if high > highestGreen
        highestGreen := high
if dir1 >= 0
    highestGreen := 0


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry SL
var entrySL4Long1 = false
var entrySL4Long2 = false
var entrySL4Long3 = false

isUseEntrySL = input.bool(true, group = "Entry SL Option")
dataToCalculate = input.source(low, group = "Entry SL Option")

if isUseEntrySL and (dir1 > 0 and dir2 < 0 and dir3 < 0)
    if strategy.opentrades >= 1
        if dataToCalculate > strategy.opentrades.entry_price(0)
            entrySL4Long1 := true
        else 
            entrySL4Long1 := false

        if entrySL4Long1 and close > strategy.opentrades.entry_price(0)
            strategy.exit('exit1', from_entry = 'long1', stop = strategy.opentrades.entry_price(0))

    if strategy.opentrades >= 2 
        if dataToCalculate > strategy.opentrades.entry_price(1)
            entrySL4Long2 := true
        else 
            entrySL4Long2 := false
    
        if entrySL4Long2 and close > strategy.opentrades.entry_price(1)
            strategy.exit('exit2', from_entry = 'long2', stop = strategy.opentrades.entry_price(1))   

    if strategy.opentrades >= 3 
        if dataToCalculate > strategy.opentrades.entry_price(2) 
            entrySL4Long3 := true
        else 
            entrySL4Long3 := false
    
        if entrySL4Long3 and close >  strategy.opentrades.entry_price(2)
            strategy.exit('exit3', from_entry = 'long3', stop = strategy.opentrades.entry_price(2))

if strategy.closedtrades > strategy.closedtrades[1]
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit3'
        entrySL4Long3 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit2'
        entrySL4Long2 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit1'
        entrySL4Long1 := false

    
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry
if dir3 < 0
    if dir2 > 0 and dir1 < 0
        strategy.entry('long1', strategy.long)
    else if dir2 < 0
        strategy.entry('long2', strategy.long, stop=superTrend1)
else
    if dir1 < 0 and highestGreen > 0
        strategy.entry('long3', strategy.long, stop=highestGreen)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Exit
isUseAllDowntrendExit = input.bool(true, group = "Exit Type")
if isUseAllDowntrendExit and dir3 > 0 and dir2 > 0 and dir1 > 0 and close < open
    strategy.close_all()

isUseAvgPriceInLoss = input.bool(true, group = "Exit Type")
if isUseAvgPriceInLoss and strategy.position_avg_price > close //and strategy.position_avg_price <= close[1]
    //  and (dir1 > 0 or dir2 > 0 or dir3 > 0)
    //  and strategy.opentrades >= 1  
    //  and strategy.opentrades >= 3  
    strategy.close_all()

isUseAllPositionsInLoss = input.bool(false, group = "Exit Type")
if isUseAllPositionsInLoss
      and (
       false
         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close)
             and ((not na(strategy.opentrades.entry_price(2))) and strategy.opentrades.entry_price(2) > close))
         )
    strategy.close_all()


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Plot
plot(superTrend1, title='Fast Supertrend',      color=dir1 == 1 and dir1[1] == 1 ? color.red : dir1 == -1 and dir1[1] == -1 ? color.green : na)
plot(superTrend2, title='Medium Supertrend',    color=dir2 == 1 and dir2[1] == 1 ? color.red : dir2 == -1 and dir2[1] == -1 ? color.green : na)
plot(superTrend3, title='Slow Supertrend',      color=dir3 == 1 and dir3[1] == 1 ? color.red : dir3 == -1 and dir3[1] == -1 ? color.green : na)


관련

더 많은