동력 지표 집계 거래 전략

저자:차오장, 날짜: 2024-02-21 11:59:22
태그:

img

전반적인 설명

이 전략은 이동 평균, MACD, RSI 및 볼린거 대역을 포함한 여러 가지 기술적 지표를 통합하여 다양한 구매 및 판매 신호를 생성하여 상대적으로 완전한 추진력 지표 집계 거래 전략을 형성합니다.

전략 논리

이 전략의 핵심 논리는 여러 가지 기술 지표의 구매 및 판매 신호를 집계하는 것입니다. 주로 다음과 같은 측면을 포함합니다.

  1. 이동 평균 지표: 빠르고 느린 이동 평균 라인을 계산하고 빠른 라인이 느린 라인을 넘을 때 구매 신호를 생성하고, 아래에 넘을 때 판매 신호를 생성합니다.

  2. MACD 지표: MACD 라인과 신호 라인을 계산하여 MACD 라인이 신호 라인의 위를 넘을 때 구매 신호를 생성하고 신호 라인의 아래를 넘을 때 판매 신호를 생성합니다.

  3. RSI 지표: RSI 값을 계산하여 과잉 구매 또는 과잉 판매 구역에 진입하는지 결정하고, RSI 라인과 중간 라인 50의 황금 십자 및 죽음의 십자와 결합하여 거래 신호를 생성합니다.

  4. 볼링거 밴드 지표: 가격이 상부와 하부 밴드를 뚫고 나가는지 결정하고, 중부 밴드로 돌아가는 신호와 결합하여 거래 신호를 생성합니다.

  5. 출구 기준: 수익 중지 및 손실 중지 기준을 설정하고 특정 비율에 도달하면 출구 포지션을 설정합니다.

각 지표 모듈의 신호는 독립적으로 작동합니다. 전략은 이 신호를 실시간으로 모니터링하고, 구매 신호가 발생했을 때 길게 가고, 판매 신호가 발생했을 때 짧게 이동하여 수익성 있는 포지션을 동적으로 집계합니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 다양한 신호를 가진 풍부한 신호 소스, 기회를 놓치는 것이 쉽지 않습니다.

  2. 잘못된 신호를 다른 지표로 확인하여 감소시킵니다.

  3. 트렌드 및 평균 역행 지표와 함께 트렌드 및 역행에 대한 좋은 적응력

  4. 자동 스톱프로프트 및 스톱러스 메커니즘은 위험을 통제하는 데 도움이 됩니다.

위험 분석

또한 이 전략에는 몇 가지 위험이 존재합니다.

  1. 특정 시장 조건에서 지표의 무효 위험.

  2. 지나치게 많은 신호를 집계할 때 지나치게 단순화되는 문제로 인해 충분한 해상도가 나오지 않습니다.

  3. 많은 지표와 함께 매개 변수 최적화에 어려움을 겪습니다.

  4. 높은 매출율과 높은 거래 비용

최적화 방향

추가적인 최적화를 위한 몇 가지 방안이 있습니다.

  1. 지표와 매개 변수의 조합을 테스트하고 최적화합니다.

  2. 기계 학습 방법을 사용하여 최적의 매개 변수를 자동으로 찾습니다.

  3. 신호 집적에 대한 다른 가중 방법들을 테스트합니다.

  4. 시장 변동성에 기반한 적응적 스톱 로스 메커니즘을 추가합니다.

  5. 개척 알고리즘을 추가하여 단일 개척 비율을 제어하여 더 나은 위험 통제를 위해

결론

결론적으로, 이것은 전형적이고 보편적인 모멘텀 지표 집계 거래 전략으로, 다양한 일반적인 기술 지표로부터의 거래 신호를 통합하고 신호 집계로 성능을 향상시킵니다. 단일 지표 전략에 비해, 더 풍부한 신호 소스와 트렌드 및 역전의 더 나은 식별의 장점이 있습니다. 한편, 매개 변수 최적화와 유효성 위험이 증가하는 어려움도 주목해야합니다. 추가 테스트 및 최적화로,이 전략은 매우 실용적인 양적 거래 도구가 될 수 있습니다.


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

//@version=5
strategy("Kesin Etkili Analiz V1 - Artun Sinan", overlay=true)
//indicator("Kesin Etkili Analiz V1 - Artun Sinan", overlay=true)

//BackTest
yearin = input (2019, title="BackTestBaşlangıç Tarihi")

// Göstergelerin parametrelerini tanımlayın
emaShrtPeriod = input.int(title="EMA Kısa Periyodu", defval=50, minval=1)
emaLngPeriod = input.int(title="EMA Uzun Periyodu", defval=100, minval=1)

maPeriod = input.int(50, "Hareketli Ortalama Periyodu", minval=1)
fast = input.int(12, "MACD Hızlı Periyodu", minval=1)
slow = input.int(26, "MACD Yavaş Periyodu", minval=1)
signal = input.int(9, "MACD Sinyal Periyodu", minval=1)
rsiPeriod = input.int(14, "RSI Periyodu", minval=1)
rsiOverbought = input.int(70, "RSI Aşırı Alım Eşiği", minval=50, maxval=100)
rsiOversold = input.int(30, "RSI Aşırı Satım Eşiği", minval=0, maxval=50)
bbPeriod = input.int(20, "Bollinger Bantları Periyodu", minval=1)
bbStd = input.float(2, "Bollinger Bantları Standart Sapması", minval=0.1)

//EMA göstergesi ayarları
ema1 = ta.ema (close,emaShrtPeriod)
ema2 = ta.ema (close, emaLngPeriod)

emaCrossUp = ema1 >= ema2
emaCrossDown = ema2 < ema1

plot(ema1, title="EMAKısa", color=color.rgb(0, 255, 13))
plot(ema2, title="EMAUzun", color=color.rgb(255, 251, 1))



// Göstergeleri hesaplayın
ma = ta.sma(close, maPeriod) // Hareketli ortalama
[macd, macdsignal, macdhist] = ta.macd(close, fast, slow, signal) // MACD
rsi = ta.rsi(close, rsiPeriod) // RSI
[upper, middle, lower] = ta.bb(close, bbPeriod, bbStd) // Bollinger Bantları

// Alım veya satım sinyalleri üretin
buySignal = false
sellSignal = false

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fibonacci seviyelerini tanımlayın
fibLevels = array.new_float(7) // Fibonacci seviyelerini tutacak bir dizi oluşturun
array.set(fibLevels, 0, 0.0) // %0 seviyesini ayarlayın
array.set(fibLevels, 1, 0.236) // %23.6 seviyesini ayarlayın
array.set(fibLevels, 2, 0.382) // %38.2 seviyesini ayarlayın
array.set(fibLevels, 3, 0.5) // %50 seviyesini ayarlayın
array.set(fibLevels, 4, 0.618) // %61.8 seviyesini ayarlayın
array.set(fibLevels, 5, 0.786) // %78.6 seviyesini ayarlayın
array.set(fibLevels, 6, 1.0) // %100 seviyesini ayarlayın

// Tepe ve dip noktasını belirleyin
highpoint = ta.highest (high, 20) // Son 30 mum çubuğunun en yüksek değerini alın
lowpoint = ta.lowest (low, 20) // Son 30 mum çubuğunun en düşük değerini alın
diff = highpoint - lowpoint // Tepe ve dip noktası arasındaki farkı hesaplayın

// Fibonacci seviyelerini hesaplayın
fib0 = lowpoint + diff * array.get(fibLevels, 0) // %0 seviyesini hesaplayın
fib1 = lowpoint + diff * array.get(fibLevels, 1) // %23.6 seviyesini hesaplayın
fib2 = lowpoint + diff * array.get(fibLevels, 2) // %38.2 seviyesini hesaplayın
fib3 = lowpoint + diff * array.get(fibLevels, 3) // %50 seviyesini hesaplayın
fib4 = lowpoint + diff * array.get(fibLevels, 4) // %61.8 seviyesini hesaplayın
fib5 = lowpoint + diff * array.get(fibLevels, 5) // %78.6 seviyesini hesaplayın
fib6 = lowpoint + diff * array.get(fibLevels, 6) // %100 seviyesini hesaplayın

// Alım sinyali: Fiyat %61,8 seviyesinden yukarı yönlü kırılırsa ve MACD çizgisi sinyal çizgisinin üzerine çıkarsa, alım pozisyonu açın
alSignal = close > fib4 and ta.crossover(macd, macdsignal)

// Satım sinyali: Fiyat %61,8 seviyesinden aşağı yönlü kırılırsa ve MACD çizgisi sinyal çizgisinin altına inerse, satım pozisyonu açın
satSignal = close < fib4 and ta.crossunder(macd, macdsignal)

// Çıkış sinyali: Fiyat %38,2 Fibonacci seviyesine ulaşırsa veya belirli bir yüzde oranında kar veya zarar elde ederseniz, pozisyonu kapatın
exitSignal = close >= fib2 or close <= strategy.position_avg_price * 0.95 // Kar oranı olarak %5, zarar oranı olarak %5 belirledik

plot(fib0, title="%0", color=color.rgb(25, 0, 255))
plot(fib1, title="%23.6", color=color.rgb(25, 0, 255))
plot(fib2, title="%38.2", color=color.rgb(25, 0, 255))
plot(fib3, title="%50", color=color.rgb(25, 0, 255))
plot(fib4, title="%61.8", color=color.rgb(25, 0, 255))
plot(fib5, title="%78.6", color=color.rgb(25, 0, 255))
plot(fib6, title="%100", color=color.rgb(25, 0, 255))
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Hareketli ortalama kesişimi sinyali
maCrossUp = ta.crossover(ma, close) // Fiyat hareketli ortalamanın üzerine çıkarsa
maCrossDown = ta.crossunder(ma, close) // Fiyat hareketli ortalamanın altına inerse

// MACD çizgisi ve sinyal çizgisi kesişimi sinyali // Histogram yerine çizgiler
macdCrossUp = ta.crossover(macd, macdsignal) // MACD çizgisi sinyal çizgisinin üzerine çıkarsa
macdCrossDown = ta.crossunder(macd, macdsignal) // MACD çizgisi sinyal çizgisinin altına inerse

// RSI aşırı alım veya aşırı satım sinyali ve 50 seviyesi kesişimi sinyali // Sinyalleri birleştir
// Eşik değerleri doğrudan kullanın
rsiOverboughtSignal = rsi > rsiOverbought and ta.crossover(rsi, 50) // RSI değeri aşırı alım eşiğinin üzerindeyse ve 50 seviyesini yukarı keserse
rsiOversoldSignal = rsi < rsiOversold and ta.crossunder(rsi, 50) // RSI değeri aşırı satım eşiğinin altındaysa ve 50 seviyesini aşağı keserse

// Bollinger Bantları kırılımı sinyali ve orta bant geri dönüşü sinyali // Sinyalleri birleştir
bbBreakUp = close > upper and ta.crossover(close, middle) // Fiyat üst banttan çıkarsa ve orta banta geri dönerse
bbBreakDown = close < lower and ta.crossunder(close, middle) // Fiyat alt banttan inerse ve orta banta geri dönerse

// Sinyalleri birleştirin
buySignal := maCrossUp or macdCrossUp or rsiOversoldSignal or bbBreakUp or emaCrossUp and yearin >= year
sellSignal := maCrossDown or macdCrossDown or rsiOverboughtSignal or bbBreakDown or emaCrossDown and yearin >= year

// Sinyalleri grafikte oklar ile gösterin
plotshape(buySignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(sellSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

plot(macd, title="MACD", color=color.blue) // MACD çizgisini mavi renkte çizin
plot(macdsignal, title="Sinyal", color=color.orange) // Sinyal çizgisini turuncu renkte çizin


if buySignal
    strategy.entry("Enter Long", strategy.long)
else if sellSignal
    strategy.entry("Enter Short", strategy.short)

더 많은