트리플 마이크로 채널 모멘텀 확률 다중 팩터 트레이딩 전략

ATR MC EOD TP SL RR
생성 날짜: 2025-05-20 14:16:22 마지막으로 수정됨: 2025-05-20 14:16:22
복사: 0 클릭수: 450
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

트리플 마이크로 채널 모멘텀 확률 다중 팩터 트레이딩 전략 트리플 마이크로 채널 모멘텀 확률 다중 팩터 트레이딩 전략

개요

트리플 미크로채널 동력 확률 다인자 거래 전략은 가격 형태에 기반한 정량 거래 방법이며, 전략의 핵심은 시장에서 연속적으로 세 개의 K 라인을 형성하는 미크로채널 구조를 식별하고, 거래 신호를 10 개의 핵심 요인에 의해 정량적으로 평가하여 거래 성공 가능성을 높이는 것입니다. 이 전략은 다양한 시간 주기 금융 시장에 적합하며, 특히 일간 단선 거래자에게 객관적이고 체계화된 입출체 메커니즘을 제공합니다.

전략 원칙

트리플 미크로채널 운동 확률 다인자 거래 전략의 핵심 원칙은 시장에서 연속적으로 세 개의 K선으로 형성되는 일방적인 운동 채널을 식별하는 것입니다. 이 전략은 다음과 같은 단계를 통해 작동합니다:

  1. 미세 통로 인식전략: 전략은 먼저 연속적으로 3개의 동방향 K선 ((모든 양선 또는 모든 음선)) 을 찾아서, 이는 시장이 단기 단방향 경향에 있을 수 있음을 나타냅니다.

  2. 다인자 점수 시스템10가지 핵심 요소를 평가하여 형상 품질에 대한 정량적인 평가를 합니다.

    • 요인 1: 세 K 선의 크기 일치
    • 요인 2: 위/아래 그림자 최소화
    • 인자 3: 미세한 틈이 존재한다 ((다목체형에서 현재 K선의 낮은 점은 3개의 K선 전의 높은 점보다 높다)
    • 요인 4: K선 엔터티 사이의 틈
    • 인자 5: 종결 가격 관계 ((다중형에서 현재 종결 가격은 이전 K 선의 최고점보다 높다)
    • 요인 6: 더 높은 하락점/ 더 낮은 고도
    • 인수 7: 개시 가격보다 높고/전 K 라인 개시 가격보다 낮다
    • 요인 8: 아래와 위가 없다.
    • 요인 9: 십자성 또는 역 K선
  3. 확률 점수: 기본 승률 ((70%) 과 인수점으로 각 거래 신호의 예상 승률을 계산한다.

  4. 입학 조건: 전체 점수가 기본 임계값 ((50%) 을 초과할 때, 시스템은 거래 신호를 생성한다。

  5. 위험 관리

    • 다중 입점 지점은 목표 K 선의 높은 지점이나 종점 가격 (상조선 크기에 따라) 에 위치한다.
    • 시작 K 라인의 오픈 가격 아래로 스톱 손실 설정
    • 목표값은 미리 예상된 위험과 수익률을 기반으로 합니다.
  6. 포지션 관리: 계좌 자금과 거래당 위험 비율에 따라 계약 수를 동적으로 계산합니다.

  7. 출전 메커니즘: 추적 스톱 손실 전략을 채택하고, 수익이 목표에 도달한 후에 수익의 일부를 잠금하고, 고정 스톱 손실과 일일 강제 평점 시간을 설정한다.

전략적 이점

코드의 심층적인 분석을 통해, 이 전략은 다음과 같은 중요한 장점을 보여준다:

  1. 객관적 수치 평가전략: 10개의 요소를 통해 각 거래 신호에 대한 정량적인 점수를 부여하여, 주관적인 판단을 줄이고 거래의 일관성과 객관성을 향상시킵니다.

  2. 적응력이 전략은 특정 시장의 특성보다는 일반적인 가격 형태에 기반하기 때문에 다양한 시장과 시기를 적용할 수 있습니다.

  3. 확률로 구동전략은 통계적 확률에 기반하며, 각 거래 신호에는 명확한 예상 승률이 있으며, 거래자는 데이터를 기반으로 의사 결정을 내릴 수 있습니다.

  4. 완벽한 위험 관리: 각 거래에는 명확한 스톱로스 위치가 있고, 동적 포지션 조정으로 계좌 자금의 고정된 비율 내에서 위험을 제한한다.

  5. 다중 출전 메커니즘이 전략은 여러 가지 출장 방법을 통합하여, 트레이킹 스톱, 고정 스톱 및 일일 필리피싱을 포함하며, 거래자의 자금을 완전히 보호합니다.

  6. 시각화된 피드백전략: 세부적인 거래 신호 표기 및 요소 점수를 차트에 제공하여 거래자가 각 신호의 질을 직관적으로 이해할 수 있습니다.

  7. 정확한 시간 관리거래시간 창을 제한하고 하루종일 매매를 의무화함으로써, 야간 매매 위험을 피할 수 있습니다.

전략적 위험

이 전략은 많은 장점들을 가지고 있지만, 다음과 같은 잠재적인 위험과 도전과제들이 있습니다.

  1. 과도한 적합성의 위험10 인수의 중량과 값 설정은 역사적 데이터에 지나치게 적합할 위험이 있으며, 이는 향후 성능이 좋지 않을 수 있습니다.

  2. 유동성이 낮은 시장의 위험: 유동성이 낮은 시장에서, 입출금 가격이 미끄러져 실제 거래 결과에 영향을 미칠 수 있다.

  3. 매개변수 민감도전략 성능은 ATR 길이, 승률 마이너스 및 리스크 수익률을 포함한 여러 파라미터에 매우 민감합니다. 파라미터를 적절하게 설정하지 않으면 전략 성능에 큰 영향을 줄 수 있습니다.

  4. 시장환경의존성: 이 전략은 추세가 명확한 시장 환경에서 가장 잘 작동하며, 흔들리는 시장이나 높은 변동성이 있는 시장에서는 잘못된 신호를 일으킬 수 있다.

  5. 신호 희소성여러 엄격한 조건이 충족되기 때문에 전략은 특정 기간 동안 거래 신호를 거의 생성하지 않을 수 있으며, 이는 전체 수익에 영향을 미칩니다.

  6. 계산 복잡도다중 요소 평가는 전략의 계산 복잡성을 증가시키고, 실시간 거래에서 지연 과제를 직면할 수 있다.

이러한 위험을 완화하기 위한 방법은 다음과 같습니다.

  • 전략에 대한 전체적인 재검토를 통해 다양한 시장과 시기를 통해 전략의 안정성을 검증합니다.
  • 소규모 포지션에서 실시 테스트를 한 후, 포지션을 점진적으로 늘립니다.
  • 정기적으로 재평가하고 다른 시장 환경에 맞게 변수를 조정합니다.
  • 추세 지표 또는 변동률 측정과 같은 추가 시장 환경 필터를 추가하는 것을 고려하십시오.

전략 최적화 방향

코드 분석을 바탕으로, 이 전략은 다음과 같은 방향으로 최적화될 수 있습니다:

  1. 인자 무게 최적화: 현재 모든 요소의 무게가 동일하다 (각 영향의 5%의 성공률), 기계 학습 방법을 통해 최적의 요소 무게를 결정하여 예측 정확도를 향상시킬 수 있다. 이러한 최적화는 일부 더 중요한 요소에 더 높은 무게를 부여하고 다른 요소의 영향력을 감소시킬 수 있다.

  2. 시장 환경 필터링: 트렌드 강도 또는 변동률 지표와 같은 시장 환경 평가 컴포넌트를 추가하여 유리한 시장 조건에서만 거래하십시오. 이것은 ADX, 변동률 백분율과 같은 지표를 추가하여 불리한 시장 환경에서 거래 신호를 피함으로써 가능합니다.

  3. 시간 필터 개선: 현재 전략은 고정된 거래 시간 창을 사용하며, 다른 시간 동안의 전략의 성과를 분석하여 거래 시간 범위를 최적화 할 수 있습니다. 예를 들어, 특정 시장은 특정 시간에 더 방향성이있을 수 있으며 다른 시간에 더 흔들릴 수 있습니다.

  4. 적응 변수: 고정된 매개 변수 (ATR 길이, 리스크 수익률과 같은) 를 시장 조건에 따라 동적으로 조정되는 매개 변수로 변환한다. 예를 들어, 높은 변동성 시장에서 리스크 수익률을 높이고, 낮은 변동성 시장에서 감소시킬 수 있다.

  5. 다중 시간 주기 확인: 더 높은 시간 주기의 확인 메커니즘을 도입합니다. 예를 들어, 일계 트렌드가 현재 거래 방향과 일치하도록 요구합니다. 이것은 전략의 성공률을 크게 높여 역전 거래를 피할 수 있습니다.

  6. 출전 메커니즘을 최적화: 현재 추적 스톱은 ATR 기반의 동적 추적 스톱으로 개선 될 수 있습니다. 또는 저항 지점을 지원하는 구조화된 출전. 이러한 최적화는 트렌드의 지속을 더 잘 포착 할 수 있으며, 트렌드가 끝날 때에도 정시에 퇴출 할 수 있습니다.

  7. 기계학습을 통합합니다.: 기계 학습 알고리즘을 사용하여 어떤 신호가 성공할 가능성이 더 높는지 예측하고, 각 거래 신호에 더 정확한 확률 점수를 할당합니다. 예를 들어, 더 복잡한 패턴을 추출하기 위해 임의의 숲이나 등급 상승 나무 모델을 사용하여 역사 신호를 분류 할 수 있습니다.

요약하다

트리플 마이크로채널 동력 확률 다인자 거래 전략은 가격 형태 인식과 다인자 평가를 결합한 체계화된 거래 방법이다. 연속적으로 세 개의 K선으로 형성된 마이크로채널 구조를 식별하고 10 개의 핵심 요소를 사용하여 신호 품질을 평가함으로써, 이 전략은 객관적이고 측정 가능한 거래 의사 결정 프레임워크를 제공합니다.

이 전략의 핵심 장점은 객관적인 신호 점수 시스템, 엄격한 위험 제어 및 유연한 출전 메커니즘에 있다. 각 신호의 예상 승률을 계산함으로써, 거래자는 주관적인 느낌에 의존하지 않고 더 많은 데이터에 의해 주도되는 결정을 내릴 수 있다. 동시에, 전략의 동적 포지션 관리는 계정 규모에 관계없이 위험 제어의 일관성을 보장한다.

매개 변수 민감성 및 시장 환경 의존성 등의 도전 과제에도 불구하고, 제안 된 최적화 방향, 특히 요소 무게 최적화, 시장 환경 필터링 및 출전 메커니즘 개선으로 전략의 성능이 더욱 향상 될 것으로 예상됩니다. 또한, 기계 학습 기술을 도입하는 것은 전략의 미래 발전의 중요한 방향이 될 수 있으며, 역사적 데이터에서 더 복잡한 패턴을 발견 할 잠재력이 있습니다.

양자 거래자에 대한 전략은 개인 위험 선호와 거래 스타일에 따라 사용자 정의 및 확장 할 수있는 견고한 기본 프레임 워크를 제공합니다. 궁극적으로 전략의 성공은 기술적으로 구현되는 것뿐만 아니라 거래자의 전략 규칙에 대한 이해와 실행 규율에 달려 있습니다.

전략 소스 코드
/*backtest
start: 2024-05-20 00:00:00
end: 2025-05-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDC"}]
*/



//@version=5
strategy("Ali 3-Bar MC v6 10 Factor", overlay=true, pyramiding=0)

// === INPUTS ===
showLabels = input.bool(true, title="Show Entry Labels")
rewardMultiple = input.float(1, title="Reward : Risk")


atrLength = input.int(4, title="ATR Length")
var int bullSignalBarIndex = na
var int bearSignalBarIndex = na

// === ATR ===
atr = ta.sma(ta.tr(true), atrLength)

signalTimeout = 1  // 例如3根bar




// === 风险控制参数 ===
riskPerTradePercent = input.float(1, title="每笔风险占比 (%)")  // 如 1%
pointValue = input.float(5, title="每点价值,例如 ES 是 $50/pt")

// 10 Factor 
//@version=5

baseWinRate = 0.70
tick = syminfo.mintick
tolerance = 0.2  // 用于判断 bar 大小一致的容忍比例


// 获取3根 bar 的关键数据
body(i) => math.abs(close[i] - open[i])
barSize(i)  => math.abs(high[i] - low[i])
upperTailRatio(i) => (high[i] - math.max(close[i], open[i])) / barSize(i)
lowerTailRatio(i) => (math.min(close[i], open[i]) - low[i])/barSize(i)

upperTailTolerance = 0.15
lowerTailTolerance = 0.15
bodyTolerance = 0.7
barUniformTolerance = 0.3
win_threshold = 0.5
// 检测 BL MC(3-bar micro channel 向上)
isBLMC = close[2] > open[2] and close[1] > open[1] and close > open

// === 各项因子判断 ===
//f1_uniform = math.max(barSize(2)/barSize(1), barSize(1)/barSize(2)) < 1 + barUniformTolerance and  math.max(barSize(1)/barSize(0), barSize(1)/barSize(0)) < 1 + barUniformTolerance
f1_uniform = math.max(barSize(2)/barSize(0) , barSize(0)/barSize(2)) < 1 + barUniformTolerance 


f2_mostCOH = ((upperTailRatio(2) < upperTailTolerance? 1:0) +  (upperTailRatio(1) < upperTailTolerance? 1:0)  +  (upperTailRatio(0) < upperTailTolerance? 1:0) )>=2
f3_microGap = low > high[2] 
f4_tickGap = open > close[1] or open[1] > close[2] 
f5_closesAboveHigh = close > high[1] and close[1] > high[2]
f6_higherLows = low > low[1] and low[1] > low[2]
f7_opensAbovePriorClose = open >= close[1] or open[1] >= close[2]
f8_noLowerTail =  ((lowerTailRatio(2) < lowerTailTolerance? 1:0) +  (lowerTailRatio(1) < lowerTailTolerance? 1:0)  +  (lowerTailRatio(0) < lowerTailTolerance? 1:0) )>=1
f9_noDojiOrOpposite  =body(2) /  barSize(2) > bodyTolerance and body(1) /  barSize(1) > bodyTolerance and body(0) /  barSize(0) > bodyTolerance

// === 总评分计算 ===
score = 0
score := score - (f1_uniform ? 0 : 1)
score := score - (f2_mostCOH ? 0 : 1)
score := score - (f3_microGap ? 0 : 4)
score := score - (f4_tickGap ? 0 : 1)
score := score - (f5_closesAboveHigh ? 0 : 1)
score := score - (f6_higherLows ? 0 : 1)
score := score - (f7_opensAbovePriorClose ? 0 : 1)
score := score - (f8_noLowerTail ? 0 : 1)
score := score - (f9_noDojiOrOpposite ? 0 : 1)

winProb = baseWinRate + (score * 0.05)  // 每个因子加5%,最高 1.20

// === 图上标记 ===
if isBLMC


    labelText = str.tostring(winProb * 100, "#.##") + "%\n" +        "1️⃣ uniform: " + str.tostring(f1_uniform) + "\n" +         "2️⃣ mostCOL: " + str.tostring(f2_mostCOH) + "\n" +        "3️⃣ microGap: " + str.tostring(f3_microGap) + "\n" +        "4️⃣ tickGap: " + str.tostring(f4_tickGap) + "\n" +        "5️⃣ closes<priorLow: " + str.tostring(f5_closesAboveHigh) + "\n" +        "6️⃣ lowerHighs: " + str.tostring(f6_higherLows) + "\n" +        "7️⃣ opensBelowClose: " + str.tostring(f7_opensAbovePriorClose) + "\n" +        "8️⃣ noLowerTail: " + str.tostring(f8_noLowerTail) + "\n" +        "9️⃣ noDoji: " + str.tostring(f9_noDojiOrOpposite)    ,
    label.new(        bar_index,         low,         text=labelText,         style=label.style_label_up,         color=color.new(color.green, 0),         textcolor=color.white,         size=size.small    )



// === Ali BULL MC ===


isAliBull =  isBLMC and  winProb>=win_threshold

// === 检测 Bear Micro Channel ===
isBRMC = close[2] < open[2] and close[1] < open[1] and close < open

// === Bear 各项因子 ===
br_f1_uniform = math.max(barSize(2)/barSize(0) , barSize(0)/barSize(2)) < 1 + barUniformTolerance 
br_f2_mostCOL = ((lowerTailRatio(2) < lowerTailTolerance ? 1:0) +  (lowerTailRatio(1) < lowerTailTolerance ? 1:0) +  (lowerTailRatio(0) < lowerTailTolerance ? 1:0)) >= 2
br_f3_microGap = low[2] > high 
br_f4_tickGap = open < close[1] or open[1] < close[2]
br_f5_closesBelowLow = close < low[1] and close[1] < low[2]
br_f6_lowerHighs = high < high[1] and high[1] < high[2]
br_f7_opensBelowPriorClose = open < close[1] or open[1] < close[2]
br_f8_noUpperTail = ((upperTailRatio(2) < upperTailTolerance ? 1:0) +  (upperTailRatio(1) < upperTailTolerance ? 1:0) +  (upperTailRatio(0) < upperTailTolerance ? 1:0)) >= 1
br_f9_noDojiOrOpposite = body(2)/barSize(2) > bodyTolerance and body(1)/barSize(1) > bodyTolerance and body(0)/barSize(0) > bodyTolerance

// === Bear 总评分计算 ===
br_score = 0
br_score := br_score - (br_f1_uniform ? 0 : 1)
br_score := br_score - (br_f2_mostCOL ? 0 : 1)
br_score := br_score - (br_f3_microGap ? 0 : 4)
br_score := br_score - (br_f4_tickGap ? 0 : 1)
br_score := br_score - (br_f5_closesBelowLow ? 0 : 1)
br_score := br_score - (br_f6_lowerHighs ? 0 : 1)
br_score := br_score - (br_f7_opensBelowPriorClose ? 0 : 1)
br_score := br_score - (br_f8_noUpperTail ? 0 : 1)
br_score := br_score - (br_f9_noDojiOrOpposite ? 0 : 1)

br_winProb = baseWinRate + (br_score * 0.05)

// === Bear 图上标记 ===
if isBRMC

    labelText = str.tostring(br_winProb * 100, "#.##") + "%\n" +        "1️⃣ uniform: " + str.tostring(br_f1_uniform) + "\n" +         "2️⃣ mostCOL: " + str.tostring(br_f2_mostCOL) + "\n" +        "3️⃣ microGap: " + str.tostring(br_f3_microGap) + "\n" +        "4️⃣ tickGap: " + str.tostring(br_f4_tickGap) + "\n" +        "5️⃣ closes<priorLow: " + str.tostring(br_f5_closesBelowLow) + "\n" +        "6️⃣ lowerHighs: " + str.tostring(br_f6_lowerHighs) + "\n" +        "7️⃣ opensBelowClose: " + str.tostring(br_f7_opensBelowPriorClose) + "\n" +        "8️⃣ noUpperTail: " + str.tostring(br_f8_noUpperTail) + "\n" +        "9️⃣ noDoji: " + str.tostring(br_f9_noDojiOrOpposite)    ,
    label.new(        bar_index,         low,         text=labelText,         style=label.style_label_up,         color=color.new(color.red, 0),         textcolor=color.white,         size=size.small    )







// === Ali BEAR MC ===



isAliBear = isBRMC  and br_winProb >=win_threshold

// === ENTRY/RISK/TARGET ===
bullEntry = (upperTailRatio(0)<0.1 ? close :high + tick) 
bullStop =  open[2] - tick
bullRisk = bullEntry - bullStop
bullTarget = bullEntry + bullRisk * rewardMultiple

bearEntry = (lowerTailRatio(0)<0.1? close :low - tick) 
bearStop = open[2]  + tick
bearRisk =  bearStop - bearEntry 
bearTarget = bearEntry - bearRisk * rewardMultiple

// === 动态仓位计算(基于账户资金和止损大小) ===
riskAmount = strategy.equity * (riskPerTradePercent / 100)
bullContracts = math.max(math.floor(riskAmount / (bullRisk * pointValue)),1)
bearContracts = math.max(math.floor(riskAmount / (bearRisk * pointValue)),1)


// === STATE ===
var float bullGapCloseLine = na
var float bearGapCloseLine = na
var bool inLong = false
var bool inShort = false
var bool bullStructureExitArmed = false
var bool bearStructureExitArmed = false
var float lastBullOpen = na
var float lastBearOpen = na
var line currentTPLine = na
var line currentSLLine = na
var float fixedBullStop = na
var float fixedBullTarget = na
var float fixedBearStop = na
var float fixedBearTarget = na

canTradeNow = not na(time(timeframe.period, "0930-1545", "America/New_York"))  // 只在盘中前6小时交易




// === BULL ENTRY ===
if isAliBull and na(bullSignalBarIndex) and canTradeNow and strategy.position_size  == 0
    strategy.entry("Ali Long", strategy.long, stop=bullEntry, qty=bullContracts)
    strategy.exit("Close Long", from_entry = "Ali Long", stop = bullStop, trail_price = bullTarget, trail_offset =    atrLength )
    bullSignalBarIndex := bar_index
    fixedBullStop := bullStop
    fixedBullTarget := bullTarget

// === BEAR ENTRY ===
if isAliBear and na(bearSignalBarIndex) and canTradeNow and strategy.position_size  == 0
    strategy.entry("Ali Short", strategy.short, stop=bearEntry, qty=bearContracts)
    strategy.exit("Close Short", from_entry = "Ali Short", stop = bearStop,trail_price = bearTarget, trail_offset =    atrLength)
    bearSignalBarIndex := bar_index
    fixedBearStop := bearStop
    fixedBearTarget := bearTarget





// === RESET ===
if strategy.position_size != 0
    bullSignalBarIndex := na
    bearSignalBarIndex := na

if not na(bullSignalBarIndex) and (bar_index - bullSignalBarIndex >= signalTimeout) and strategy.opentrades == 0
    strategy.cancel("Ali Long")
    bullSignalBarIndex := na
    fixedBullStop := na
    fixedBullTarget := na

if not na(bearSignalBarIndex) and (bar_index - bearSignalBarIndex >= signalTimeout) and strategy.opentrades == 0
    strategy.cancel("Ali Short")
    bearSignalBarIndex := na
    fixedBearStop := na
    fixedBearTarget := na



eodTime = timestamp("America/New_York", year, month, dayofmonth, 15, 55)

if time >= eodTime and strategy.position_size != 0
    strategy.close_all(comment="EOD Exit")
    label.new(bar_index, close, "Exit: EOD", style=label.style_label_down, color=color.gray, textcolor=color.white, size=size.small)
    bearSignalBarIndex := na
    bullSignalBarIndex:=na
    fixedBearStop := na
    fixedBearTarget := na


plot(fixedBearTarget, title="Bull TP", color=color.green, style=plot.style_linebr)
plot(fixedBearStop, title="Bull SL", color=color.red, style=plot.style_linebr)