리소스 로딩... 로딩...

풀백 최적화 시스템과 동적 다 기간 기하급수적 이동 평균 크로스 전략

저자:차오장, 날짜: 2024-12-27 15:29:38
태그:EMAMASMARSI

img

전반적인 설명

이 전략은 다수의 기하급수적인 이동 평균 (EMA) 크로스오버와 풀백 최적화를 기반으로 한 양적 거래 시스템이다. 5개의 EMA (EMA5, EMA8, EMA13, EMA21, EMA50) 를 활용하여 다양한 기간 평균과 가격-EMA 관계를 사이에 두고 단계적 위치 구축 및 동적 위치 폐쇄를 구현하기 위한 크로스오버 관계를 관찰한다. 이 전략은 20%와 40%와 같은 다른 비율로 포지션을 나누는 자본 관리 시스템을 사용하며, 다양한 시장 신호에 따라 점차적으로 포지션을 구축하거나 감소시킨다.

전략 원칙

핵심 논리는 세 가지 주요 입시 조건과 두 가지 출구 조건을 포함합니다.

  1. 진입 신호: EMA5가 EMA8를 넘을 때 20% 포지션을 열고; EMA5가 EMA13를 넘을 때 20% 추가; EMA8가 EMA21을 넘을 때 40% 추가
  2. 풀백 최적화 시스템: 가격이 EMA50에 닿을 때 20% 포지션을 오픈; 가격이 EMA50을 넘으면 20%를 추가
  3. 출구 신호: EMA5가 EMA13보다 낮을 때 50% 포지션을 닫습니다. EMA8가 EMA21보다 낮을 때 모든 포지션을 닫습니다.
  4. 리스크 제어: 가격, EMA5 및 EMA8이 모두 EMA50보다 낮을 때 모든 포지션을 즉시 클리어합니다.

전략적 장점

  1. 다중 확인 메커니즘: 여러 EMA 크로스오버를 통해 더 신뢰할 수 있는 거래 신호를 제공합니다.
  2. 동적 위치 관리: 효과적인 위험 통제를 위해 신호 강도에 따라 다른 위치 크기를 사용합니다.
  3. 풀백 최적화 설계: EMA50를 풀백 엔트리에 대한 지원으로 사용하여 엔트리 정확도를 향상시킵니다.
  4. 유연한 출구 메커니즘: 마감량을 통제하면서 수익을 보존하기 위해 단계적인 포지션 폐쇄 전략을 채택합니다.
  5. 포괄적 인 위험 관리: 상당한 하락 추세로 인한 손실을 방지하기 위해 명확한 스톱 로스 조건을 설정합니다.

전략 위험

  1. EMA 지연: 이동 평균은 지연된 지연을 가지고 있으며 이는 지연 신호를 유발할 수 있습니다.
  2. 부적절한 시장 위험: 다양한 시장에서 빈번한 거짓 파장을 유발할 수 있습니다.
  3. 과잉 거래 위험: 여러 가지 입시 조건이 과도한 거래로 이어질 수 있습니다.
  4. 실행 비용: 빈번한 거래는 높은 수수료 비용을 초래할 수 있습니다.
  5. 체계적 위험: 매우 변동적인 시장에서 충분히 빨리 지점을 종료하지 못할 수 있습니다.

최적화 방향

  1. 트렌드 필터를 도입: ADX와 같은 지표를 추가하여 강한 트렌드에서만 거래를 수행합니다.
  2. 포지션 관리 최적화: 변동성에 따라 포지션 크기를 동적으로 조정
  3. 가격 패턴 인식 포함: 입력 정확도를 향상시키기 위해 촛불 패턴을 결합
  4. 이윤 취득 메커니즘을 강화합니다. 이윤을 더 잘 확보하기 위해 동적인 이윤 취득 수준을 설정합니다.
  5. 시장 감정 지표를 추가하십시오: 시장 조건을 필터링하기 위해 RSI와 같은 지표를 도입하십시오.

요약

이 전략은 여러 EMA 크로스오버와 풀백 최적화를 통해 비교적 완전한 거래 시스템을 구축합니다. 이 전략의 강점은 여러 확인 메커니즘과 유연한 포지션 관리에 있지만 EMA 지연과 같은 고유 한 한계도 있습니다. 트렌드 필터 및 기타 최적화를 도입하여 전략의 안정성과 수익성이 더욱 향상 될 수 있습니다. 트렌딩 시장에 적합하며 거래자는 실제 시장 상황에 따라 매개 변수를 최적화해야합니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Strategy with Price & EMA5 & EMA8 < EMA50 Condition", overlay=true, margin_long=100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// ==============================
// INPUTS
// ==============================
lengthEMA5 = input.int(5, "EMA5 Length")
lengthEMA8 = input.int(8, "EMA8 Length")
lengthEMA13 = input.int(13, "EMA13 Length")
lengthEMA21 = input.int(21, "EMA21 Length")
lengthEMA50 = input.int(50, "EMA50 Length")

// Tam pozisyon boyutu (örnek: 100 birim)
full_position = 100.0 
qty20 = full_position * 0.2
qty40 = full_position * 0.4

// ==============================
// EMA HESAPLAMALARI
// ==============================
ema5 = ta.ema(close, lengthEMA5)
ema8 = ta.ema(close, lengthEMA8)
ema13 = ta.ema(close, lengthEMA13)
ema21 = ta.ema(close, lengthEMA21)
ema50 = ta.ema(close, lengthEMA50)

// ==============================
// KESİŞİMLERİ TESPİT FONKSİYONLARI
// ==============================
crossUp(src1, src2) => ta.crossover(src1, src2)
crossDown(src1, src2) => ta.crossunder(src1, src2)

// ==============================
// STRATEJİ KOŞULLARI
// ==============================

// Adım 1: EMA5, EMA8’i yukarı keserse %20’lik alım
step1_condition = crossUp(ema5, ema8)

// Adım 2: EMA5, EMA8’i yukarı kestikten sonra EMA5, EMA13’ü de yukarı keserse %20 daha alım
step2_condition = crossUp(ema5, ema13)

// Adım 3: EMA8, EMA21’i yukarı keserse %40 alım
step3_condition = crossUp(ema8, ema21)

// Çıkış koşulları:
// EMA5, EMA13’ü aşağı keserse pozisyonun %50’sini kapat.
// EMA8, EMA21’i aşağı keserse tüm pozisyonu kapat.
half_close_condition = crossDown(ema5, ema13)
full_close_condition = crossDown(ema8, ema21)

// Düşüşlerde EMA50'ye dokunma -> %20 alım
pullback_condition = low <= ema50 or close <= ema50

// Fiyat tekrar EMA50'nin üzerine çıkarsa -> %20 alım
above_ema50_condition = crossUp(close, ema50)

// Yeni ek koşul:  
// Fiyat, EMA5 ve EMA8’in herbiri EMA50’nin altındaysa tüm pozisyon kapat.
// Bu durum tam bir düşüş senaryosunu işaret eder.
all_below_condition = (close < ema50) and (ema5 < ema50) and (ema8 < ema50)

// Mevcut pozisyon büyüklüğü
pos_size = strategy.position_size

// ==============================
// POZİSYON GİRİŞLERİ
// ==============================
if (step1_condition and pos_size == 0)
    strategy.entry("Step1", strategy.long, qty=qty20)

if (step2_condition and strategy.opentrades < 2)
    strategy.entry("Step2", strategy.long, qty=qty20)

if (step3_condition and strategy.opentrades < 3)
    strategy.entry("Step3", strategy.long, qty=qty40)

// Pullback: Fiyat EMA50'ye temas ederse ve pozisyon yoksa %20 alım
if (pullback_condition and strategy.opentrades == 0)
    strategy.entry("Pullback", strategy.long, qty=qty20)

// Fiyat EMA50’nin üzerine çıkarsa ve pozisyon %100'e ulaşmamışsa %20 alım
if (above_ema50_condition and strategy.opentrades < 4)
    strategy.entry("Above50", strategy.long, qty=qty20)

// ==============================
// POZİSYON YÖNETİMİ (ÇIKIŞLAR)
// ==============================
if (all_below_condition and strategy.opentrades > 0)
    // Tüm pozisyonu kapat çünkü sert düşüş senaryosuna girildi
    strategy.close("Step3")
    strategy.close("Step2")
    strategy.close("Step1")
    strategy.close("Pullback")
    strategy.close("Above50")
else
    // Yarı kapatma (EMA5, EMA13 aşağı kesişimi)
    if (half_close_condition)
        totalTrades = strategy.opentrades
        // Öncelikle en son açılan en büyük pozisyonu kapatarak kademeli küçültme
        if (totalTrades >= 3)
            strategy.close("Step3")     // Bu 40% kapatır
        else if (totalTrades == 2)
            strategy.close("Step2")     // Bu 20% kapatır
        else if (totalTrades == 1)
            strategy.close("Step1")     // Bu da 20% kapatır (tamamen çıkar, ama basitlik için böyle)

    // Tam kapatma (EMA8, EMA21 aşağı kesişimi)
    if (full_close_condition)
        // Açık olan tüm pozisyonları kapat
        strategy.close("Step3")
        strategy.close("Step2")
        strategy.close("Step1")
        strategy.close("Pullback")
        strategy.close("Above50")

// ==============================
// GÖRSELLEŞTİRME
// ==============================
plot(ema5, "EMA5", color=color.new(color.yellow, 0))
plot(ema8, "EMA8", color=color.new(color.blue, 0))
plot(ema13, "EMA13", color=color.new(color.green, 0))
plot(ema21, "EMA21", color=color.new(color.red, 0))
plot(ema50, "EMA50", color=color.new(color.purple, 0))


관련

더 많은