양방향 EMA 크로스오버 양적 거래 전략


생성 날짜: 2024-01-24 17:31:41 마지막으로 수정됨: 2024-01-24 17:31:41
복사: 0 클릭수: 602
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

양방향 EMA 크로스오버 양적 거래 전략

개요

이 전략은 시장의 주요 추세 방향을 판단하기 위해 쌍방향 EMA 지표를 사용하며, RSI 지표와 결합하여 입시 시기를 선택합니다.

전략 원칙

  1. 다양한 시기의 여러 그룹에 대한 EMA 평균을 계산하여 단기, 중기 및 장기 3 차원의 시장의 주요 경향 방향을 식별합니다.
  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])
//////////////////////////////////