11개의 이동평균의 크로스오버 전략

저자:차오장, 날짜: 2024-01-15 13:57:53
태그:

img

전반적인 설명

이 전략은 긴 및 짧은 엔트리에 대한 11 가지 다른 유형의 이동 평균의 크로스오버를 결합합니다. 사용되는 11 개의 이동 평균은: 단순 (SMA), 기하급수 (EMA), 가중 (WMA), 부피 가중 (VWMA), 매끄럽다 (SMMA), 이중 기하급수 (DEMA), 삼중 기하급수 (TEMA), 홀 (HMA), 제로 래그 기하급수 (ZEMA), 삼각형 (TMA), 슈퍼 매끄럽다 (SSMA) 필터입니다.

이 전략은 두 개의 이동 평균을 구성 할 수 있습니다. 두 가지 옵션 모두 11 개 중에서 선택 된 더 빠르고 더 느린 평균입니다. 더 빠른 MA가 느린 MA를 넘을 때 긴 신호가 생성됩니다. 더 빠른 MA가 느린 MA를 넘을 때 짧은 신호가 발생합니다.

추가 기능에는 피라미드 설정, 수익 및 스톱 로스 레벨이 포함됩니다.

전략 논리

핵심 전략 논리는 두 개의 이동 평균 사이의 교차에 의존하여 입상과 출구를 결정합니다.

입국 조건은 다음과 같습니다.

긴 항목: 빠른 MA > 느린 MA 짧은 항목: 빠른 MA < 느린 MA

출구는 세 가지 기준 중 하나에 의해 결정됩니다.

  1. 이윤 취득 수준
  2. 스톱 로스 레벨
  3. 생성된 반대 신호 (반대의 방향으로 MA 교차)

이 전략은 MA의 종류와 길이, 피라미드 설정, 수익 및 스톱 손실 비율과 같은 주요 매개 변수를 구성 할 수 있습니다. 이것은 다른 시장 조건과 위험 선호도에 대한 전략을 최적화하는 유연성을 제공합니다.

장점

  • 강력한 신호를 위한 11가지 다른 MA 타입을 결합합니다.
  • 주요 매개 변수의 유연한 구성
  • 이윤을 취하고 손해를 멈추는 기능이 이익을 보호하고 손실을 제한합니다.
  • 피라미딩은 강력한 트렌드에 대한 위치 크기를 증가시킵니다.

위험성

  • 모든 기술 지표와 마찬가지로 MA 크로스오버는 잘못된 신호를 생성 할 수 있습니다.
  • 현재 시장 조건에 대한 과도한 최적화는 미래의 성과를 저하시킬 수 있습니다.
  • 하드 스톱 손실 출구는 변동성 시장에서 좋은 거래를 일찍 종료 할 수 있습니다.

엔트리 신호에 대한 가격 액션 확인을 사용하여 하드 스톱 대신 트레일링 스톱을 사용하여 과잉 최적화를 피함으로써 리스크 관리가 향상 될 수 있습니다.

더 나은 기회

이 전략을 개선할 수 있는 몇 가지 방법이 있습니다.

  1. 출입 전에 부피 및 가격 행동 검사와 같은 추가 필터를 포함하십시오.
  2. 다양한 MA 유형의 성능을 체계적으로 테스트하고 최적 1 또는 2를 선택합니다.
  3. 거래 도구 및 시간 프레임에 따라 MA 길이를 최적화합니다.
  4. 하드 스톱 대신 후속 스톱을 사용
  5. 트렌드가 확장됨에 따라 점진적인 수준에서 수익을 추가합니다.

결론

열한 이동 평균 크로스오버 전략은 트레이딩 크로스오버에 대한 체계적인 접근 방식을 제공합니다. 여러 MA 지표에 대한 신호를 결합하고 주요 매개 변수를 구성하여 견고한 유연한 거래 프레임워크를 제공합니다. 미세 조정 및 리스크 관리는 성능을 최적화하는 데 핵심 역할을합니다. 전략은 추진력에 기반한 거래에 강력한 잠재력을 가지고 있지만 다른 시장 환경에 맞게 조정되어야합니다.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3

strategy(title = "[STRATEGY] MA Cross Eleven", overlay = true)

// MA - type, source, length

//  MA - type, source, length
//  SMA --> Simple
//  EMA --> Exponential
//  WMA --> Weighted
//  VWMA --> Volume Weighted
//  SMMA --> Smoothed
//  DEMA --> Double Exponential
//  TEMA --> Triple Exponential
//  HMA --> Hull
//  TMA --> Triangular
//  SSMA --> SuperSmoother filter
//  ZEMA --> Zero Lag Exponential

type = input(defval="ZEMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"])
len1 = input(defval=8, title="Fast MA Length", minval=1)
srcclose1 = input(close, "Fast MA Source")
len2 = input(defval=21, title="Slow MA Length", minval=1)
srcclose2 = input(close, "Slow MA Source")

// Returns MA input selection variant, default to SMA if blank or typo.

variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = 0.0
    v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v11 = sma(sma(src,len),len)                                         // Triangular
    // SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v9 = 0.0
    v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
    // Zero Lag Exponential
    e = ema(v2, len)
    v10 = v2+(v2-e)
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="SSMA"?v9 : type=="ZEMA"?v10 : type=="TMA"? v11: v1

ma_1 = variant(type, srcclose1, len1)
ma_2 = variant(type, srcclose2, len2)

plot(ma_1, title="Fast MA", color = green, linewidth=2, transp=0)
plot(ma_2, title="Slow MA", color = red, linewidth=2, transp=0)

longCond = na
shortCond = na
longCond := crossover(ma_1, ma_2)
shortCond := crossunder(ma_1, ma_2)

// Count your long short conditions for more control with Pyramiding

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if longCond
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if shortCond
    sectionLongs := 0
    sectionShorts := sectionShorts + 1
    
// Pyramiding Inputs

pyrl = input(1, "Pyramiding")

// These check to see your signal and cross references it against the pyramiding settings above

longCondition = longCond and sectionLongs <= pyrl 
shortCondition = shortCond and sectionShorts <= pyrl 

// Get the price of the last opened long or short

last_open_longCondition = na
last_open_shortCondition = na
last_open_longCondition := longCondition ? high[1] : nz(last_open_longCondition[1])
last_open_shortCondition := shortCondition ? low[1] : nz(last_open_shortCondition[1])

// Check if your last postion was a long or a short

last_longCondition = na
last_shortCondition = na
last_longCondition := longCondition ? time : nz(last_longCondition[1])
last_shortCondition := shortCondition ? time : nz(last_shortCondition[1])

in_longCondition = last_longCondition > last_shortCondition
in_shortCondition = last_shortCondition > last_longCondition

// Take profit

isTPl = input(false, "Take Profit Long")
isTPs = input(false, "Take Profit Short")
tpl = input(3, "Take Profit Long %", type=float)
tps = input(30, "Take Profit Short %", type=float)
long_tp = isTPl and crossover(high, (1+(tpl/100))*last_open_longCondition) and in_longCondition  == 1
short_tp = isTPs and crossunder(low, (1-(tps/100))*last_open_shortCondition) and in_shortCondition == 1 

// Stop Loss

isSLl = input(false, "Stop Loss Long")
isSLs = input(false, "Stop Loss Short")
sl= 0.0
sl := input(3, "Stop Loss %", type=float)
long_sl = isSLl and crossunder(low, (1-(sl/100))*last_open_longCondition) and longCondition == 0 and in_longCondition == 1
short_sl = isSLs and crossover(high, (1+(sl/100))*last_open_shortCondition) and shortCondition == 0 and in_shortCondition == 1

// Create a single close for all the different closing conditions.

long_close = long_tp or long_sl ? 1 : 0
short_close = short_tp or short_sl ? 1 : 0

// Get the time of the last close

last_long_close = na
last_short_close = na
last_long_close := long_close ? time : nz(last_long_close[1])
last_short_close := short_close ? time : nz(last_short_close[1])

// Strategy entries

strategy.entry("long", strategy.long, when=longCondition == true, stop = open[1])
strategy.entry("short", strategy.short, when=shortCondition == true)
strategy.close("long", when = long_sl or long_tp)
strategy.close("short", when = short_sl or short_tp)

더 많은