双方向EMAクロスオーバー定量取引戦略


作成日: 2024-01-24 17:31:41 最終変更日: 2024-01-24 17:31:41
コピー: 0 クリック数: 602
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])
//////////////////////////////////