다중 이동 평균 거래 전략


생성 날짜: 2024-02-29 14:32:29 마지막으로 수정됨: 2024-02-29 14:32:29
복사: 3 클릭수: 881
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 이동 평균 거래 전략

개요

이 전략은 ?? 다중평균선 거래 전략 ?? 이라고 불린다. 이 전략은 MACD 지표와 다중평균선의 교차를 거래 신호로 사용하고, ZLSMA 지표 보조 판단 경향과 결합하여, 스톱 스톱 손실 Exiting 논리를 설정하여 자동화 거래를 구현한다.

전략 원칙

  1. MACD 지표의 빠른 선, 느린 선 및 MACD 기둥을 계산하십시오. 금 포크를 더하고, 죽은 포크를 공백으로 설정하십시오.

  2. 5일선, 25일선, 45일선, 100일선 4개의 평균선을 계산한다. 평균선이 길어질수록 트렌드가 지속될 수 있다.

  3. 두 집합의 평균선 사이의 거리를 계산하고, 만약 거리가 어떤 값을 초과하면, 평균선이 분산되는 것을 나타내고, 거래 신호로 설정할 수 있다.

  4. ZLSMA 지표는 가격의 중장선 트렌드 방향을 나타냅니다. ZLSMA가 턴 포인트를 형성할 때 트렌드 회전을 판단할 수 있습니다.

  5. MACD 지표의 교차, 평균선 분산 신호 및 ZLSMA 추세 판단을 결합하여 다공간 거래 전략을 설정한다.

  6. 정지정지점을 설정하여 Exiting 논리를 자동화한다.

우위 분석

  1. 다중 필터링 신호는 전략의 효율성을 높인다. MACD 지표와 평균선 분산 신호는 서로 검증할 수 있으며, 가짜 돌파구를 방지한다.

  2. ZLSMA 지표는 중·장기 트렌드 방향을 판단하는데 도움을 주고, 역동적인 거래를 피한다.

  3. 자동화된 Exiting은 휴전 중지 지점을 설정하여 인간의 개입 빈도를 낮춘다.

위험 분석

  1. 잘못된 매개 변수 설정으로 인해 과도한 거래 또는 유출이 발생할 수 있습니다. 최적의 효과를 얻기 위해 매개 변수를 최적화해야합니다.

  2. 고정 스톱 스톱 손실 지점은 수익 공간을 제한하거나 손실을 확대한다. ATR 지표와 함께 동적 스톱 손실을 설정할 수 있다.

  3. 평평선 전략은 진동상태에 효과가 좋지 않으며, 다른 지표 또는 인적 개입을 고려할 수 있다.

최적화 방향

  1. 평균선 변수 조합을 최적화하고, 다양한 길이의 평균선의 효과를 테스트한다.

  2. 테스트는 KDJ, BOLL 등과 같은 다른 지표들을 추가하여 구매/판매 지점을 판단한다.

  3. 동적 중지 전략을 시도하고, 변동률에 따라 중지 위치를 설정하십시오.

  4. 기계학습 모델에 참여하여 최적의 변수를 자동으로 찾습니다.

요약하다

이 전략은 MACD 지표, 다중 평균선 및 ZLSMA 트렌드 판단을 통합하여 자동화 거래를 구현한다. 다중 신호 필터링을 통해 전략 안정성을 높이고, Exiting 논리를 설정하여 위험을 줄여, 실제 전투 가치가 있다.

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

//@version=5
strategy("MACD ZLSMA_izumi⑤(4つの条件、MCDがクロスしてたら)", overlay=true)

fast_length = input(title = "Fast Length", defval = 12)
slow_length = input(title = "Slow Length", defval = 26)
src = input(title = "Source", defval = close)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')

hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist, title = "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plot(macd,   title = "MACD",   color = #2962FF)
plot(signal, title = "Signal", color = #FF6D00)

//MACDクロス設定
enterLong = ta.crossover(macd, signal)
enterShort = ta.crossunder(macd, signal)

//移動平均線の期間を設定
ema5 = input(5, title="ma期間5")
ema25 = input(25, title="ma期間25")
ema45 = input(45, title="ma期間45")
ema100 = input(100, title="ma期間100")

//移動平均線を計算
//sma関数で「ema25」バー分のcloseを移動平均線として「Kema」に設定
Kema5 = ta.sma(close,ema5)
Kema25 = ta.sma(close,ema25)
Kema45 = ta.sma(close,ema45)
Kema100 = ta.sma(close,ema100)



//移動平均線をプロット
plot(Kema5, color=color.rgb(82, 249, 255),title="ema5")
plot(Kema25, color=color.red,title="ema25")
plot(Kema45, color=color.blue,title="ema45")
plot(Kema100, color=color.green,title="ema100")

//ema同士の距離が30以上の時に「distancOK」にTureを返す
//distance1 = math.abs(Kema5-Kema25)
distance2 = math.abs(Kema25-Kema45)
distanceValue1 = input(0.030, title ="ema同士の乖離値") 
//distanceOk1 = distance1 > distanceValue1
distanceOk2 = distance2 > distanceValue1

//2区間のema同士の距離が30以上の時に「distanceOKK」にTrueを返す
//distanceOkK1 = distanceOk1 and distanceOk2
distanceOkK1 = distanceOk2

//5EMAとロウソクの乖離判定
//DistanceValue5ema = input(0.03, title ="5emaとロウソクの乖離率")
//emaDistance = math.abs(Kema5 - close)
//emaDistance5ema = emaDistance < DistanceValue5ema

//ZLSMA追加のコード
length = input.int(32, title="Length")
offset = input.int(0, title="offset")
src2 = input(close, title="Source")
lsma = ta.linreg(src2, length, offset)
lsma2 = ta.linreg(lsma, length, offset)
eq= lsma-lsma2
zlsma = lsma+eq
//ZLSMAのプロット
plot(zlsma, color=color.yellow, linewidth=3)

//ZLSMAの前回高値を検索
//var float zlsmaHigh = na
//var float zlsmaHighValue = na
//if ta.highest(zlsma,35) == zlsma[3]
//    zlsmaHighValue := zlsmaHigh
//    zlsmaHigh := zlsma[3]

//if (na(zlsmaHighValue))
 //   zlsmaHighValue := zlsmaHigh

//ZLSMAの前回安値を検索
//var float zlsmaLow = na
//var float zlsmaLowValue = na
//if ta.lowest(zlsma,35) == zlsma[3]
//    zlsmaLowValue := zlsmaLow
//    zlsmaLow := zlsma[3]

///if (na(zlsmaLowValue))
//    zlsmaLowValue := zlsmaLow

//利確・損切りポイントの初期化(変数の初期化)
var longProfit = 0.0
var longStop = 0.0
var shortProfit = 0.0
var shortStop = 0.0

//inputで設定画面の選択項目を設定
longProfitValue = input(0.06, title ="ロング利確pips")
shortProfitValue = input(-0.06, title ="ショート利確pips")
longStopValue = input(-0.06, title ="ロング損切pips")
shortStopValue = input(0.06, title ="ショート損切pips")

// クロスの強さを推定 
//angleThreshold = input(0.001, title = "クロスの強さ調節" )

// クロスの強さの閾値、この値を調整してクロスの強さの基準を変える 
//macdDiff = macdLine - signalLine 
//strongCross = math.abs(macdDiff) > angleThreshold 

// エントリー条件 (MACDラインとシグナルラインがクロス)
//ta.crossover(macdLine, signalLine) and strongCross 


//ロングエントリー条件
if  distanceOkK1 and enterLong
	strategy.entry("long", strategy.long, comment="long")
    longProfit := close + longProfitValue
    longStop := close + longStopValue

//    if na(strategy.position_avg_price) and close>strategy.position_avg_price + 0.05 * syminfo.mintick 
 //       longStop := strategy.position_avg_price + 10 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)

strategy.exit("exit", "long", limit = longProfit,stop = longStop)


if  distanceOkK1 and enterShort
	strategy.entry("short", strategy.short, comment="short")
    shortProfit := close + shortProfitValue
    shortStop := close + shortStopValue

 //   if na(strategy.position_avg_price) and close>strategy.position_avg_price - 0.05 * syminfo.mintick 
  //      shortStop := strategy.position_avg_price - 0.1 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)


strategy.exit("exit", "short", limit = shortProfit,stop = shortStop)
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)