이동 평균에 기초한 트렌드 추적 전략

저자:차오장, 날짜: 2023-10-07 15:04:00
태그:

전반적인 설명

이 전략은 다양한 기간의 이동 평균을 계산하여 현재 트렌드 방향을 파악하고 RSI 지표와 결합하여 거래 신호를 생성합니다. 짧은 기간 이동 평균이 긴 기간 이동 평균을 넘을 때 트렌드가 고려되고 구매 신호가 생성됩니다. 짧은 기간 이동 평균이 긴 기간 이동 평균을 넘을 때 트렌드가 역전되어 판매 신호가 생성됩니다. RSI 지표는 사소한 가격 변동으로 인한 잘못된 신호를 피하기 위해 사용됩니다.

전략 논리

  1. 10일, 20일, 50일, 100일, 200일 간 간단한 이동평균을 계산합니다.

  2. 14일 RSI 값을 계산해

  3. 10일 SMA가 50일 SMA를 넘어서고, RSI가 30보다 높고, 20일 SMA가 100일 SMA보다 높거나 100일 SMA보다 높거나 50일 SMA가 100일 SMA보다 높거나 100일 SMA보다 높을 때 구매합니다.

  4. 스톱 로스 가격을 엔트리 가격에 곱한 값으로 설정합니다 (1 - 스톱 로스 비율).

  5. 판매 시:

    • 10일 SMA는 50일 SMA 아래로 넘어가고, 닫는 것은 20일 SMA 아래로 넘는다: 트렌드 역전 판매 신호
    • 닫는 값은 입시 가격의 95% 미만입니다: 스톱 로스 판매
    • 닫는 것은 스톱 로스 가격 아래입니다: 후속 스톱 로스 판매

이 전략은 이동 평균을 사용하여 시장 트렌드를 판단하고 위험을 제어하기 위해 스톱 로스를 설정합니다. RSI는 잘못된 브레이크오프를 필터합니다. 단기 SMA가 장기 기간 SMA를 넘어서면 구매하고 상승 추세를 나타냅니다. 보유 기간 동안 위험을 제어하기 위해 스톱 로스 라인을 설정합니다. 트렌드 역전 신호가 발생하거나 스톱 로스 가격이 유발되면 판매합니다.

이점 분석

  • 트렌드 방향을 결정하기 위해 이동 평균을 사용하여 상승 추세 중 구매는 범위 제한 시장에서 거래를 피합니다.
  • 여러 기간 이동 평균을 사용 하 여 단기 가격 변동에 의해 오해 를 피 합니다.
  • RSI와 결합하면 잘못된 신호를 필터링합니다.
  • 각 거래에 대한 스톱 로스 통제
  • 수익을 확보하기 위해 후속 스톱 손실을 사용하는 것

위험 분석

  • 이동 평균은 지연이 있고 가격 반전을위한 가장 좋은 시기를 놓칠 수 있습니다.
  • 너무 느슨한 스톱 로스 설정은 단일 거래에서 큰 손실을 초래할 수 있습니다.
  • 너무 긴 스톱 로스 설정이 너무 빈번한 스톱 로스 트리거를 일으킬 수 있습니다.
  • 후속 스톱 손실은 더 큰 이윤을 놓치고 너무 일찍 종료 될 수 있습니다.

최적화는 이동 평균 기간, 중지 손실 수준 등을 조정함으로써 수행 될 수 있습니다. 또한 정확도를 향상시키기 위해 다른 지표와 결합하는 것을 고려하십시오.

최적화 방향

  • 다른 시장 조건에 맞게 이동 평균 기간을 조정합니다
  • RSI 매개 변수를 최적화하여 과잉 구매/ 과잉 판매 상황을 더 잘 식별
  • 기기 특성에 따라 정적 정지 손실 및 트레일 정지 수준을 합리적으로 설정
  • 거짓 신호를 피하기 위해 다른 표시기를 추가합니다.
  • 변동성 등에 따라 스톱 로스를 동적으로 조정합니다.
  • 기계 학습을 통해 매개 변수를 자동으로 최적화

요약

이 전략은 전반적으로 명확한 논리를 가지고 있으며, 트렌드 결정 및 위험을 제어하기 위해 스톱 로스를 설정하기 위해 이동 평균을 사용합니다. 이것은 전형적인 트렌드 추적 전략입니다. 매개 변수 조정 및 다른 지표를 추가함으로써 추가 개선이 가능합니다. 그러나 전략은 완벽하지 않으며 적절한 위험 관리와 함께 시장 불확실성을 대처하기 위해 지속적인 조정 및 최적화가 필요합니다.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)
    
    


더 많은