다중 지표에 따른 동적 추세 일괄 이익 실현 거래 전략

EMA MACD RSI ATR
생성 날짜: 2025-02-10 14:49:11 마지막으로 수정됨: 2025-02-10 14:49:11
복사: 2 클릭수: 378
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 지표에 따른 동적 추세 일괄 이익 실현 거래 전략

개요

이것은 트렌드 추적과 기술 분석을 결합한 정량 거래 전략이다. 이 전략은 다수의 기술 지표들을 통해 거래 신호를 확인하고, 분기된 정지 및 동적 포지션 관리 메커니즘을 적용하여 시장의 주요 트렌드를 포착하면서 위험을 제어한다. 이 전략은 EMA, MACD 및 RSI와 같은 여러 기술 지표를 통합하여 지표들 사이의 교차와 오차를 통해 잠재적인 거래 기회를 식별한다.

전략 원칙

이 전략의 핵심 거래 논리는 다음과 같은 핵심 요소에 기반합니다.

  1. 입시 신호는 다중 기술 지표 필터링을 사용합니다: 빠른 EMA와 느린 EMA의 교차, MACD 금叉/죽은 포크 신호 및 RSI 초상가 초상가 지표. 다중 입시는 빠른 EMA에서 느린 EMA, MACD 금叉을 통과하고 RSI가 70보다 낮습니다. 공중 입시는 빠른 EMA 아래에서 느린 EMA, MACD 죽은 포크를 통과하고 RSI가 30 이상입니다.
  2. 리스크 컨트롤은 고정 비율의 정지 손실을 채택하고, 포지션 개시 가격의 5%에서 설정한다.
  3. 배열 중지 메커니즘: 첫 번째 중지 8%에서, 두 번째 중지 12%에서, 두 번째 중지 위치를 동적으로 조정하여 시장의 변동에 적응한다.
  4. 포지션 관리는 ATR 동적 계산에 기초하여, 단일 최대 위험은 5%로, 최대 포지션은 계정 지분의 40%를 초과하지 않는다.

전략적 이점

  1. 다중 기술 지표의 교차 검증으로 가짜 신호를 효과적으로 필터링하고 거래 품질을 향상시킬 수 있습니다.
  2. 롯데제작은 수익의 일부를 고정시키면서도 계속되는 수익을 완전히 놓치지 않습니다.
  3. 동적 포지션 관리 시스템은 시장의 변동성에 따라 거래 규모를 자동으로 조정하여 위험을 효과적으로 제어합니다.
  4. 고정된 손실, 동적 포지션 및 최대 포지션 제한을 포함한 완벽한 풍력 제어 시스템은 전략의 장기적인 안정성을 보장한다.
  5. 전략 논리가 명확하고, 매개 변수가 조정 가능하며, 다양한 시장 환경에 따라 최적화 할 수 있습니다.

전략적 위험

  1. 빠르게 변동하는 시장에서 스톱 로즈가 자주 발생할 수 있으며, 시장 변동이 너무 높을 때 매개 변수를 조정하거나 거래를 중단하는 데 주의를 기울여야 한다.
  2. 수평 시장의 흔들림으로 인해 연속적인 손실이 발생할 수 있으므로 수평 판단 메커니즘을 추가하는 것이 좋습니다.
  3. 다중 지표 필터링은 일부 시장을 놓칠 수 있으며, 강한 트렌드 시장에서 단일 지표 전략보다 좋지 않을 수 있습니다.
  4. 급격한 반전 시장에서 분량 정지 메커니즘은 적시에 청산되지 않을 수 있으며, 반전 신호 판단을 추가하는 것을 고려해야 한다.

전략 최적화 방향

  1. 시장의 변동률 필터링 장치를 도입하는 것을 고려하고, 변동률이 너무 높을 때 포지션을 줄이거나 거래를 중단하십시오.
  2. 트렌드 강도를 판단할 수 있고, 강한 트렌드 중에 스톱 포지션을 조정하여 더 많은 트렌드 수익을 얻을 수 있다.
  3. 포지션 관리 시스템을 최적화하고, 수익/손실비율에 기반한 동적 포지션 조정을 추가하는 것을 고려한다.
  4. 시장 상태를 판단하는 메커니즘을 추가하여 다른 시장 상태에서 다른 파라미터 조합을 사용합니다.
  5. 거래량 지표를 추가하여 거래 신호의 신뢰성을 높이는 것을 고려하십시오.

요약하다

이 전략은 여러 기술 지표의 조합 사용과 함께 분기 중지 및 동적 포지션 관리와 결합하여 비교적 완벽한 거래 시스템을 구축합니다. 전략의 장점은 위험 통제가 전체적이고 거래 신호 신뢰성이 높다는 것입니다. 그러나 일부 시장을 놓칠 수있는 단점이 있습니다. 지속적인 최적화 및 매개 변수 조정으로 이 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 것으로 예상됩니다.

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

//@version=6
strategy("Hang Strategy Aggressive", overlay=true, initial_capital=1000, currency=currency.USDT, default_qty_type=strategy.cash, default_qty_value=100)

// === 参数设置 ===
fastLength = input.int(5, "快速EMA长度")
slowLength = input.int(15, "慢速EMA长度")
rsiLength = input.int(7, "RSI长度")
atrPeriod = input.int(10, "ATR周期")
leverageMultiple = input.float(3.0, "杠杆倍数", minval=1.0, step=0.5)

// === 止盈止损参数 ===
stopLossPercent = input.float(5.0, "止损百分比", minval=1.0, step=0.5)
firstTakeProfitPercent = input.float(8.0, "第一止盈点百分比", minval=1.0, step=0.5)
secondTakeProfitPercent = input.float(12.0, "第二止盈点百分比", minval=1.0, step=0.5)
firstTakeProfitQtyPercent = input.float(50.0, "第一止盈仓位百分比", minval=1.0, maxval=100.0, step=5.0)

// === 技术指标 ===
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)
superFastEMA = ta.ema(close, 3)
rsi = ta.rsi(close, rsiLength)
atr = ta.atr(atrPeriod)

// === 趋势判断 ===
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
macdCross = (macdLine > signalLine) and (macdLine[1] < signalLine[1])
macdCrossDown = (macdLine < signalLine) and (macdLine[1] > signalLine[1])

// === 交易信号 ===
longCondition = (fastEMA > slowEMA) and macdCross and (rsi < 70)
shortCondition = (fastEMA < slowEMA) and macdCrossDown and (rsi > 30)

// === 平仓信号 ===
exitLong = shortCondition or (fastEMA < slowEMA)
exitShort = longCondition or (fastEMA > slowEMA)

// === 仓位管理 ===
maxRiskPerTrade = 0.05
basePosition = strategy.equity * maxRiskPerTrade
atrAmount = atr * close
riskPosition = basePosition / atrAmount * leverageMultiple
positionSize = math.min(riskPosition, strategy.equity * 0.4 / close)

// === 交易状态变量 ===
var isLong = false
var isShort = false
var partialTpTriggered = false
var float stopPrice = na
var float firstTpPrice = na
var float secondTpPrice = na
var float firstTpQty = na

// === 交易执行 ===
// 多头入场
if (longCondition and not isLong and not isShort)
    strategy.entry("多", strategy.long, qty=positionSize)
    isLong := true
    partialTpTriggered := false

// 空头入场
if (shortCondition and not isShort and not isLong)
    strategy.entry("空", strategy.short, qty=positionSize)
    isShort := true
    partialTpTriggered := false

// === 止盈止损逻辑 ===
if (strategy.position_size > 0)  // 多仓
    stopPrice := strategy.position_avg_price * (1 - stopLossPercent/100)
    firstTpPrice := strategy.position_avg_price * (1 + firstTakeProfitPercent/100)
    // 只在未触发第一止盈时计算第二止盈价格
    if not partialTpTriggered
        secondTpPrice := strategy.position_avg_price * (1 + secondTakeProfitPercent/100)
    
    if (close[1] <= stopPrice or low <= stopPrice)
        strategy.close_all("多止损")
        isLong := false
        partialTpTriggered := false
    
    if (not partialTpTriggered and (close[1] >= firstTpPrice or high >= firstTpPrice))
        strategy.order("多第一止盈", strategy.short, qty=firstTpQty)
        partialTpTriggered := true
        // 在这里重新计算第二止盈价格
        secondTpPrice := high * (1 + 0.04)  // 基于当前最高价再上涨4%
    
    if (close[1] >= secondTpPrice or high >= secondTpPrice)
        strategy.close_all("多第二止盈")
        isLong := false
        partialTpTriggered := false

if (strategy.position_size < 0)  // 空仓
    stopPrice := strategy.position_avg_price * (1 + stopLossPercent/100)
    firstTpPrice := strategy.position_avg_price * (1 - firstTakeProfitPercent/100)
    // 只在未触发第一止盈时计算第二止盈价格
    if not partialTpTriggered
        secondTpPrice := strategy.position_avg_price * (1 - secondTakeProfitPercent/100)
    
    if (close[1] >= stopPrice or high >= stopPrice)
        strategy.close_all("空止损")
        isShort := false
        partialTpTriggered := false
    
    if (not partialTpTriggered and (close[1] <= firstTpPrice or low <= firstTpPrice))
        strategy.order("空第一止盈", strategy.long, qty=firstTpQty)
        partialTpTriggered := true
        // 在这里重新计算第二止盈价格
        secondTpPrice := low * (1 - 0.04)  // 基于当前最低价再下跌4%
    
    if (close[1] <= secondTpPrice or low <= secondTpPrice)
        strategy.close_all("空第二止盈")
        isShort := false
        partialTpTriggered := false

// === 其他平仓条件 ===
if (exitLong and isLong)
    strategy.close_all("多平仓")
    isLong := false
    partialTpTriggered := false

if (exitShort and isShort)
    strategy.close_all("空平仓")
    isShort := false
    partialTpTriggered := false

// === 绘图 ===
plot(fastEMA, "快速EMA", color=color.blue)
plot(slowEMA, "慢速EMA", color=color.red)
plot(superFastEMA, "超快EMA", color=color.green)

// 绘制止盈止损线
plot(strategy.position_size != 0 ? strategy.position_avg_price : na, "开仓价", color=color.yellow)
plot(strategy.position_size != 0 ? stopPrice : na, "止损线", color=color.red)
plot(strategy.position_size != 0 ? firstTpPrice : na, "第一止盈线", color=color.green)
plot(strategy.position_size != 0 ? secondTpPrice : na, "第二止盈线", color=color.blue)