양방향 EMA 크로스 퀀트 거래 전략

저자:차오장, 날짜: 2024-01-24 17:31:41
태그:

img

전반적인 설명

이 전략은 시장의 주요 트렌드 방향을 결정하기 위해 양방향 EMA 지표를 사용하고 RSI 지표를 입력 선택의 시점으로 결합하여 트렌드 다음 알고리즘 거래 전략에 속합니다.

전략 원칙

  1. 다른 주기로 EMA의 여러 그룹을 계산하여 시장의 주요 트렌드 방향을 세 가지 차원에서 식별합니다. 단기, 중장기 및 장기
  2. 단기 EMA가 중장기 EMA를 넘으면 상승 추세가 형성되었다는 것을 결정합니다.
  3. 단기 EMA가 중장기 EMA 아래로 넘으면 하향 추세가 형성되었다는 것을 결정합니다.
  4. 적당한 입시 시기를 찾기 위해 RSI 지표를 결합하십시오. RSI 지표는 과잉 구매 및 과잉 판매 구역을 결정하는 데 사용할 수 있습니다.
  5. 상승 추세에서, RSI 지표가 낮은 수준에있을 때 길게; 하락 추세에서, RSI 지표가 높은 수준에있을 때 짧게

위의 전략은 주로 양방향 EMA 지표를 적용하여 주요 트렌드 방향을 결정하고 RSI 지표를 입력 신호 선택으로 사용합니다. 이는 알고리즘 거래 전략을 따르는 전형적인 트렌드에 속합니다.

이점 분석

이 전략의 가장 큰 장점은 시장의 주요 트렌드 방향을 명확하게 결정하고 RSI 지표에 따라 더 나은 입시 시기를 선택할 수 있다는 것입니다. 구체적인 장점은 다음과 같습니다.

  1. 여러 시간 차원에서 시장의 주요 트렌드 방향을 식별하기 위해 여러 개의 EMA 세트를 사용하십시오.
  2. EMA 지표 계산은 소음과 함께 간단하며 시장의 주요 추세를 정확하고 신뢰할 수 있습니다.
  3. RSI 지표는 수익률을 크게 최적화하기 위해 입력 및 중지 손실 포인트를 효과적으로 결정할 수 있습니다.
  4. 알고리즘 구조는 명확하고 이해하기 쉽고 수정 할 수 있습니다. 전략에 따른 전형적인 추세입니다.
  5. 전략 성과를 더 향상시키기 위해 다른 기술 지표와 유연하게 결합 할 수 있습니다.

위험 분석

이 전략은 또한 다음과 같은 측면에서 주로 몇 가지 위험을 가지고 있습니다.

  1. 트렌드가 역전될 때, 스톱 로스 포인트는 너무 이상화되어 손실을 증가시킬 수 있습니다.
  2. 트렌드 반전점을 효과적으로 결정할 수 없거나, 시간적으로 손실을 멈추는 기회를 놓칠 수도 있습니다.
  3. EMA 매개 변수와 RSI 매개 변수는 반복 테스트와 최적화가 필요합니다. 그렇지 않으면 불안정을 유발할 수 있습니다.
  4. 모든 항목이 완벽한 타이밍을 보장 할 수 없습니다, 불필요한 복수의 반복이있을 수 있습니다
  5. 갑작스러운 사건의 영향으로 큰 격차를 효과적으로 피하는 것은 어렵습니다.

위 위험에 대응하기 위해 다음과 같은 분야에서 최적화를 할 수 있습니다.

  1. 과도한 손실을 방지하기 위해 합리적으로 손실을 중지하는 지점을 설정합니다.
  2. 트렌드 반전을 결정하기 위해 다른 지표를 증가시켜 적시에 손실을 멈추는 것을 보장합니다.
  3. 더 넓은 시장 조건에 적응하기 위해 매개 변수 조합을 최적화
  4. 반복 수를 줄이기 위해 입력 및 중지 손실 논리를 수정
  5. 시장 격차의 부정적인 영향을 피하기 위해 예외 판단을 증가

최적화 방향

이 전략의 장점과 위험에서 우리는 다음과 같은 최적화 가능한 방향을 얻을 수 있습니다.

  1. 기존 양방향 EMA 프레임워크에서 트렌드 반전 지점을 판단하기 위해 MACD 및 BOLL와 같은 지표를 도입하여 수익을 취하고 손실을 멈추는 전략을 최적화합니다.
  2. 트렌드 역전 가능성을 예측하고 전략 성과를 더 향상시키기 위해 기계 학습 모델을 도입
  3. 고급 필터를 적용하여 비정상적인 시장 조건을 자동으로 식별하고 손실을 효과적으로 방지합니다.
  4. 유전 알고리즘, 심층 강화 학습 및 다른 방법을 사용하여 자동으로 매개 변수를 최적화하여 전략이 더 많은 시장 유형에 적응 할 수 있습니다.
  5. 자동 중지 손실 모듈을 추가, 동적으로 실제 상황에 따라 중지 손실 포인트를 조정할 수 있습니다

더 많은 지표, 예측 모델, 매개 변수 최적화, 위험 관리 모듈 및 기타 방법을 도입함으로써이 전략은 더 복잡하고 변동적인 시장 조건에 적응하도록 더 개선 될 수 있습니다.

결론

이 기사에서는 양방향 EMA 크로스 양적 거래 전략의 주요 내용을 상세히 소개했습니다. 먼저 전략의 주요 아이디어와 운영 원리를 설명했습니다. 그 다음 전략의 장점이 완전히 분석되었습니다. 동시에 전략의 주요 잠재적 위험을 분석했습니다. 이 근거로 몇 가지 주요 최적화 가능한 방향이 제안되었습니다. 요약하면이 전략은 시장의 주요 추세를 결정하는 장점이 있으며 전형적인 양적 거래 전략인 최적화에도 약간의 여지가 있습니다. 지속적인 개선 및 최적화로이 전략은 투자자 알고리즘 거래의 중요한 선택이 될 수 있습니다.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Investoz
// Indikatorn är byggd som ett utbildningsyfte och är därför ingen rekommendation för köp/sälj av aktier. Tanken är att skapa en visuell form i en graf
// som visar om det finns någon trend såväl positiv som negativ. En dialogruta med en varning talar om vilken trend som råder. I koden finns en möjlighet
// att ta position eller gå ur position om man vill skapa en startegi kring denna trendindikator. Rekommenderar dock starkt att inte enbart förlita sig på denna
// indikator som beslut för köp/sälj då resultaten blir negativa om man köper på psoitiv trend och säljer på negativ trend. Det måste kombineras med andra idéer
// och därför fungerar denna skript mer som ett komplement till sin egen strategi.
// Det är fritt fram för vem som helst att använda sig av denna indikator.  
//@version=4
//Skapar en strategiskript med 5 % av eget kapital som ett exempel. Detta går att ändra i skriptets inställningar, välj egenskaper och sedan ändra orderstorlek
//till ett annat värde av % på eget kapital.
strategy("© Investoz trendvarningar", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
//Lägger till inmatningar till skriptindikatorn. Användaren kan se och redigera inmatningar i objektdialogen efter eget val.
ema1 = input(21, minval=1, maxval=500, title="Lila linje")
valema1=input(true, title="Visa lila linje")
ema2 = input(34, minval=1, maxval=500, title="Blå linje")
valema2=input(true, title="Visa blå linje")
ema3 = input(55, minval=1, maxval=500, title="Grön linje")
valema3=input(true, title="Visa grön linje")
ema4 = input(89, minval=1, maxval=500, title="Gul linje")
valema4=input(true, title="Visa gul linje")
ema5 = input(141, minval=1, maxval=500, title="Orange linje")
valema5=input(true, title="Visa orange linje")
ema6 = input(230, minval=1, maxval=500, title="Röd linje")
valema6=input(true, title="Visa röd linje")
ema7 = input(371, minval=1, maxval=500, title="Röd linje")
valema7=input(true, title="Visa röd linje")
//Inmatningar för antal staplar
startbar = input(1, minval=1, maxval=1, title="Första stapeln")
Endbar = bar_index
//Källa input, stängning. Användaren kan själv byta till vilken källa som önskas.
src = input(close, title="Source")
//Antal staplar sedan den längsta ema började och framåt. 
tid=Endbar + startbar - 371
//EMA loop
aema1 = ema(src, ema1)
bema2 = ema(src, ema2)
cema3 = ema(src, ema3)
dema4 = ema(src, ema4)
eema5 = ema(src, ema5)
fema6 = ema(src, ema6)
gema7 = ema(src, ema7)
//Skriver ut linjer i diagrammet om förhållandet är sant, annars falskt.
h=plot(valema1 ? aema1 : na, title="Lila linje", style=plot.style_line, linewidth=1, color=color.purple)
i=plot(valema2 ? bema2 : na, title="Blå linje", style=plot.style_line, linewidth=1, color=color.blue)
j=plot(valema3 ? cema3 : na, title="Grön linje", style=plot.style_line, linewidth=1, color=color.green)
k=plot(valema4 ? dema4 : na, title="Gul linje", style=plot.style_line, linewidth=1, color=color.yellow)
l=plot(valema5 ? eema5 : na, title="Orange linje", style=plot.style_line, linewidth=1, color=color.orange)
m=plot(valema6 ? fema6 : na, title="Röd linje", style=plot.style_line, linewidth=1, color=color.red)
n=plot(valema7 ? gema7 : na, title="Brun linje", style=plot.style_line, linewidth=1, color=color.maroon)
//Fyller bakgrunden mellan två linjer med en viss färg.
fill(h, i, color = color.purple,transp=34)
fill(i, j, color = color.blue,transp=34)
fill(j, k, color = color.green,transp=34)
fill(k, l, color = color.yellow,transp=34)
fill(l, m, color = color.orange,transp=34)
fill(m, n, color = color.red,transp=34)
//Skapa en algoritm för positiv trend
PositivTrend = crossover(aema1,gema7)?1:0
TrendPositiv = ema(close,1) > aema1 and aema1 > bema2?1:0
//Skapa en algoritm för negativ trend
NegativTrend = crossunder(aema1,gema7)?1:0
TrendNegativ = ema(close,1) < aema1 and aema1 < bema2?1:0
//Skapar en textruta med varningstext för positiv trend
varningtextpositiv = "Varning för positiv trend."+"\n" + "Leta efter att ta position!"
// if PositivTrend
//     varningpositiv=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.green,
//      text=varningtextpositiv,
//      style=label.style_label_down,
//      textalign=text.align_left)
//Skapar en textruta med varningstext för negativ trend
varningtextnegativ = "Varning för negativ trend."+"\n" + "Leta efter utgången!"
// if NegativTrend
//     varningnegativ=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.red,
//      text=varningtextnegativ,
//      style=label.style_label_up,
//      textalign=text.align_left)
//Köp om positiv trend
if (PositivTrend) 
    strategy.entry("Ta position", strategy.long, when = PositivTrend)
//Sälj om negativ trend
if (NegativTrend)
    strategy.close("Ta position", when = NegativTrend, comment="Gå ur position")
//Beräkning av positiv trend
vspositiv(positiv)=>valuewhen(Endbar==startbar,positiv,0)
vepositiv(positiv)=>valuewhen(Endbar==Endbar,positiv,0)
positivmean(TrendPositiv)=>
    csumpositiv = cum(TrendPositiv)
//Slut//   
    a = vepositiv(csumpositiv)
//Start//
    b = vspositiv(csumpositiv)
//Slut - Start// 
    (a - b)/(tid)
positivmeanpositiv = positivmean(TrendPositiv) 
//Beräkning av negativ trend
vsnegativ(negativ)=>valuewhen(Endbar==startbar,negativ,0)
venegativ(negativ)=>valuewhen(Endbar==Endbar,negativ,0)
negativmean(TrendNegativ)=>
    csumnegativ = cum(TrendNegativ)
//Slut//   
    a = venegativ(csumnegativ)
//Start//
    b = vsnegativ(csumnegativ)
//Slut - Start// 
    (a - b)/(tid)
negativmeannegativ = negativmean(TrendNegativ) 
//Inmatning av text som ska in i texruta som visar antal staplar i trend
logga = "© Investoz: Trend i tid"+ "\n"
streck = "--------------------------------------------------------"
totalastaplar = "\n" + "Dagar totalt: " + tostring(tid)+ " dagar "+"\n"+ streck + "\n"
totalpositiv = "Dagar totalt i positiv trend "+" 📈 : "  +tostring(positivmeanpositiv*tid, "##.##") +" dagar " + "\n"
totalnegativ = "\n" + "Dagar totalt i negativ trend" + " 📉 : "  +tostring(negativmeannegativ*tid, "##.##") +" dagar " 
//Textruta för antal staplar i trend
// if barstate.ishistory
//     barcountlbl=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.yellow,
//      text=logga+streck+totalastaplar+totalpositiv+streck+totalnegativ,
//      style=label.style_label_lower_left,
//      textalign=text.align_left)
//     label.delete(barcountlbl[1])
////////////////////////////////// 

더 많은