移動平均追跡ストップ損失戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月24日11時21分57秒
タグ:

img

概要

この戦略の主なアイデアは,移動平均値とストップ・ロスのメカニズムを使用して引き下げを制御しながら,トレンド市場で利益を得ることができる自動取引システムを設計することです.

戦略の論理

  1. この戦略は,ユーザがシンプル・ムービング・メアディア,指数的なムービング・メアディア,重度のムービング・メアディアなど,様々な種類の移動平均から選択できるようにします.ユーザは,自分の好みに基づいて移動平均のタイプを選択できます.

  2. 移動平均値の期間を設定する必要があります.通常は,中期取引では20〜60の間です.

  3. 移動平均値が選択されると,戦略はリアルタイムで計算します.価格が移動平均値を超えるとロングになり,移動平均値を下回るとショートになります.

  4. ストップ・ロスは,トレーリング・ストップ・ロスのメカニズムを使用する.ポジションを開いた後,移動平均値と価格の関係を継続的に監視し,ストップ・ロスのレベルを動的に調整する.具体的には,ストップ・ロスは,ユーザーによって設定された移動平均値プラス/マイナスストップ・ロスの割合で設定される.

  5. ストップ損失の割合は,ユーザーによって設定できます.より大きな割合は,より広いストップ損失範囲とより少ない感受性を意味します.より小さな割合は,より狭いストップ損失とより低いリスクを意味します.ストップ損失の割合は,一般的に2%~5%の間で設定されています.

  6. ポジションを開いた後,価格が移動平均値に突入すると,ポジションは閉鎖されます.

利点

  • トレンドに沿ってポジションを開き,トレンド市場でより大きな利益を得ることができます.
  • 価格アクションに基づいてストップレベルを調整するために,ストップがあまりにも緊密なのを避けるために,ストップ損失を引っ張ります.
  • 移動平均値とストップロスの割合をリスクアペテートに応じて調整できます
  • 各種の移動平均型をサポートし,テストによる最適化が可能
  • シンプルで明快な論理,理解し,変更しやすい

リスク

  • 価格がレンジ・バインド市場での移動平均値の周りに変動し,過剰な取引を引き起こす可能性があります.
  • ストップ・ロスの割合が大きすぎると 損失が増える可能性があります
  • 移動平均値とストップ損失の最適なパラメータは,製品と時間枠によって異なる可能性があります.
  • 大事 な ニュース 出来事 の 近く で この 戦略 を 使う こと を 避ける

リスクを最適化し,制御するには,次の方法があります.

  • 明らかに傾向のある製品や時間枠で戦略を使用する
  • 長期移動平均を用いて移動平均期間の調整
  • リスク管理を強化するために,ストップロスの割合を適切に削減する
  • 最適なパラメータを見つけるため,各製品で個別にテストする
  • 重要なニュースイベントの前に取引を止める

増進 の 機会

この戦略は,次の側面においてさらに最適化することができる.

  1. 確認のために他の指標を追加し,レンジバインド市場での過剰な取引を避ける.MACD,KDを追加することができ,シグナルが調整されたときにのみ取り上げられます.

  2. 移動平均値の組み合わせを使用します.例えば,5日間MAと20日間のMAは一緒に使用できますので,両方が同じ方向に並ぶ場合にのみ取引を行います.

  3. 各製品で個別にパラメータをテストし,最適なパラメータを設定します.パラメータは製品と時間枠によって異なりますので,個別のテストが必要です.

  4. ポジションサイズルールを追加します.例えば,初期ポジションの固定量,その後ストップ損失距離に基づいてポジションに追加します.

  5. 取引の最大数または取引間の最小時間を設定します.これは過剰な取引を制限します.

  6. 静的パラメータ設定を避け,過去のデータに基づいてパラメータを動的に最適化するために機械学習アルゴリズムを追加します.

  7. ディープラーニングモデルを組み込み 価格傾向を予測し 傾向の方向性を判断する

結論

一般的に,これは非常に実践的なトレンドフォロー戦略である.リスク制御のためにトレンド方向とトレリングストップを決定するために移動平均を使用する.トレンド市場では良い収益を生み出せる.パラメータ最適化と他の指標またはモデルとの統合を組み合わせることで,安定性と収益性がさらに向上する.ユーザーは製品やタイムフレームのパラメータ設定の違い,主要なイベントの影響も注意する必要があります.全体的に,この戦略は中級ヘッジファンドや一部の経験を持つ小売投資家に適しています.


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

//@version=3
//attoCryp, @HikmetSezen58
strategy("MOST Multi MAs", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
sx=input(defval = "close" ,title="Fiyat sec", options=[ "close", "high", "low", "open", "hl2", "hlc3", "hlco4", "hlcc4", "hlccc5"])
smox=input(defval = "HulleMA", title = "Hareketli Ortalama: ", options=["T3", "SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "EVWMA", "HullMA", "HulleMA", "LSMA", "ALMA", "TMA", "SSMA"])
timeFramemost = input(title="++++++++++++++++++++++++++++++++++++", defval="MOST Ayarlari:")
yuzde=input(defval=3.8, minval=0, step=0.1, title="Yuzde Oran")/100
ortalamauzunluk=input(defval=28, title="Periyot Uzunlugu", minval=1)
f=input(defval=0.4, step=0.1, title="T3 icin Factor", minval=0.01)
timeFrameadd=input(title="++++++++++++++++++++++++++++++++++++", defval="Diger Orta.Ayar:")
offsig=input(defval=4, title="LSMA icin Offset veya ALMA icin Sigma", minval=0)
offalma=input(defval=0.6, title="ALMA icin Offset", minval=0, step=0.01)
timeFramess=input(title="++++++++++++++++++++++++++++++++++++", defval="Baslangic-Bitis:")
gun_baslangic=input(defval=1, title="Baslangic Gunu", minval=1, maxval=31)
ay_baslangic=input(defval=1, title="Baslangic Ayi", minval=1, maxval=12)
yil_baslangic=input(defval=2017, title="Baslangic Yili", minval=2010)
gun_bitis=input(defval=1, title="Bitis Gunu", minval=1, maxval=31)
ay_bitis=input(defval=1, title="Bitis Ayi", minval=1, maxval=12)
yil_bitis = input(defval=2019, title="Bitis Yili", minval=2010)

// backtest icin baslangic ve bitis zamanlarini belirleme
baslangic=timestamp(yil_baslangic, ay_baslangic, gun_baslangic, 00, 00)
bitis=timestamp(yil_bitis, ay_bitis, gun_bitis, 23, 59) 
zamanaraligi() => true

//guncel fiyatti belirleme
guncelfiyat=sx=="high"?high : sx=="close"?close : sx=="low"?low : sx=="open"?open : sx=="hl2"?(high+low)/2 : sx=="hlc3"?(high+low+close)/3 : sx=="hlco4"?(high+low+close+open)/4 : sx=="hlcc4"?(high+low+close+close)/4 : sx=="hlccc5"?(high+low+close+close+close)/5 : close 

/////Ortalama Hesaplamalari/////
// Tillson T3
sm0(guncelfiyat,ortalamauzunluk,f) =>
    t3e1=ema(guncelfiyat, ortalamauzunluk)
    t3e2=ema(t3e1, ortalamauzunluk)
    t3e3=ema(t3e2, ortalamauzunluk)
    t3e4=ema(t3e3, ortalamauzunluk)
    t3e5=ema(t3e4, ortalamauzunluk)
    t3e6=ema(t3e5, ortalamauzunluk)
    c1=-f*f*f
    c2=3*f*f+3*f*f*f
    c3=-6*f*f-3*f-3*f*f*f
    c4=1+3*f+f*f*f+3*f*f
    s0=c1 * t3e6 + c2 * t3e5 + c3 * t3e4 + c4 * t3e3

// Basit ortalama
sm1(guncelfiyat,ortalamauzunluk) =>
    s1=sma(guncelfiyat, ortalamauzunluk)

// Ustel ortalama
sm2(guncelfiyat,ortalamauzunluk) =>
    s2=ema(guncelfiyat, ortalamauzunluk)

// Cift Ustel ortalama
sm3(guncelfiyat,ortalamauzunluk) =>
    s3=2*ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)

// Uclu Ustel ortalama
sm4(guncelfiyat,ortalamauzunluk) =>
    s4=3*(ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)) + ema(ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk), ortalamauzunluk)

// Agirlikli Ortalama  
sm5(guncelfiyat,ortalamauzunluk) =>
    s5=wma(guncelfiyat, ortalamauzunluk)

// Hacim Agirlikli Ortalama
sm6(guncelfiyat,ortalamauzunluk) =>
    s6=vwma(guncelfiyat, ortalamauzunluk)

// Smoothed
sm7(guncelfiyat,ortalamauzunluk) =>
    s7=0.0
    s7:=na(s7[1]) ? sma(guncelfiyat, ortalamauzunluk) : (s7[1] * (ortalamauzunluk - 1) + guncelfiyat) / ortalamauzunluk

// Hull Ortalama
sm8(guncelfiyat,ortalamauzunluk) =>
    s8=wma(2 * wma(guncelfiyat, ortalamauzunluk / 2) - wma(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))
    
// Hull Ustel Ortalama
sm81(guncelfiyat,ortalamauzunluk) =>
    s8=ema(2 * ema(guncelfiyat, ortalamauzunluk / 2) - ema(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))

// Least Square
sm9(guncelfiyat,ortalamauzunluk,offsig) =>
    s9=linreg(guncelfiyat, ortalamauzunluk, offsig)

// Arnaud Legoux
sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) =>
    s10=alma(guncelfiyat, ortalamauzunluk, offalma, offsig)

// Triangular
sm11(guncelfiyat, ortalamauzunluk) =>
    s11=sma(sma(guncelfiyat, ortalamauzunluk),ortalamauzunluk)

// SuperSmoother filter
sm12(guncelfiyat,ortalamauzunluk) =>
    a1=exp(-1.414*3.14159 / ortalamauzunluk)
    b1=2*a1*cos(1.414*3.14159 / ortalamauzunluk)
    c2=b1
    c3=(-a1)*a1
    c1=1 - c2 - c3
    s12=0.0
    s12:=c1*(guncelfiyat + nz(guncelfiyat[1])) / 2 + c2*nz(s12[1]) + c3*nz(s12[2])
    
//Elastic Volume Weighted Moving Average
sm13(guncelfiyat,ortalamauzunluk) =>
    hacimtoplam=sum(volume, ortalamauzunluk)
    s13=0.0
    s13:=(nz(s13[1]) * (hacimtoplam - volume)/hacimtoplam) + (volume*guncelfiyat/hacimtoplam)

ortalamafiyat=smox=="T3"?sm0(guncelfiyat,ortalamauzunluk,f) : smox=="SMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="EMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="DEMA"?sm3(guncelfiyat,ortalamauzunluk) : smox=="TEMA"?sm4(guncelfiyat,ortalamauzunluk) : smox=="WMA"?sm5(guncelfiyat,ortalamauzunluk) : smox=="VWMA"?sm6(guncelfiyat,ortalamauzunluk) : smox=="SMMA"?sm7(guncelfiyat,ortalamauzunluk) : smox=="HullMA"?sm8(guncelfiyat,ortalamauzunluk) : smox=="HulleMA"?sm81(guncelfiyat,ortalamauzunluk) : smox=="LSMA"?sm9(guncelfiyat,ortalamauzunluk,offsig) : smox=="ALMA"?sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) : smox=="TMA"?sm11(guncelfiyat,ortalamauzunluk) : smox=="SSMA"?sm12(guncelfiyat,ortalamauzunluk) : smox=="EVWMA"?sm13(guncelfiyat,ortalamauzunluk) : guncelfiyat

/////MOST'u hesaplama/////
stopfiyat=ortalamafiyat*yuzde
mostfiyat=0.0
mostfiyat:=iff(ortalamafiyat>nz(mostfiyat[1],0) and ortalamafiyat[1]>nz(mostfiyat[1],0),max(nz(mostfiyat[1],0),ortalamafiyat-stopfiyat),iff(ortalamafiyat<nz(mostfiyat[1],0) and ortalamafiyat[1]<nz(mostfiyat[1],0),min(nz(mostfiyat[1],0),ortalamafiyat+stopfiyat),iff(ortalamafiyat>nz(mostfiyat[1],0),ortalamafiyat-stopfiyat,ortalamafiyat+stopfiyat)))

mostcolor=ortalamafiyat>mostfiyat?lime:fuchsia
plot(mostfiyat, color=mostcolor, linewidth=4, title="Most-fiyat")

/////AL-SAT LONG-SHORT girislerini belirleme/////
long=ortalamafiyat>mostfiyat and ortalamafiyat[1]<mostfiyat[1]
short=ortalamafiyat<mostfiyat and ortalamafiyat[1]>mostfiyat[1]
if (long) 
    strategy.entry("AL-Long", strategy.long, when = zamanaraligi())
if (short) 
    strategy.entry("SAT-Short", strategy.short, when = zamanaraligi())

もっと