Strategi hibrida ATR dan Moving Average Crossover

Penulis:ChaoZhang, Tanggal: 2023-09-26 17:22:21
Tag:

Gambaran umum

Strategi ini menggabungkan indikator Average True Range (ATR) dan Moving Average crossover untuk mengidentifikasi sinyal tren untuk tingkat kemenangan yang lebih tinggi.

Logika

  • Menggunakan ATR untuk menentukan volatilitas harga pada jangka waktu yang lebih tinggi untuk mengkonfirmasi uptrend
  • Menghitung rata-rata bergerak cepat dan lambat pada kerangka waktu yang lebih rendah, pergi panjang ketika MA cepat melintasi di atas MA lambat, pergi pendek ketika MA cepat melintasi di bawah MA lambat
  • ATR menunjukkan tren keseluruhan pada jangka waktu yang lebih panjang; MA crossover mengidentifikasi titik masuk tertentu pada jangka waktu yang lebih pendek
  • ATR dihitung dengan perataan RMA, panjang dan perataan diatur
  • MA crossover terdiri dari dua SMA, panjang diatur

Keuntungan

  • ATR dapat secara efektif menyaring gerakan bergelombang, menghindari perdagangan yang tidak perlu
  • MA crossover secara akurat menentukan titik konversi tren jangka pendek
  • RMA smoothing pada ATR mengurangi jaggedness, penilaian yang lebih stabil pada tren jangka waktu yang lebih tinggi
  • Penggunaan gabungan menghindari masalah dan menangkap peluang
  • Parameter yang dapat disesuaikan untuk mengoptimalkan pada produk dan kerangka waktu yang berbeda
  • Tingkat kemenangan yang lebih tinggi secara keseluruhan diantisipasi untuk keuntungan yang stabil

Risiko

  • Penghakiman tren ATR rentan terhadap keterlambatan, mungkin gagal memulai tren awal
  • MA crossover rentan terhadap beberapa penyesuaian, lebih banyak sinyal jual
  • Pengaturan parameter sangat kritis, pengaturan yang tidak tepat menyebabkan perdagangan lebih / di bawah
  • Memerlukan analisis data historis untuk set parameter optimal per produk
  • Mempertimbangkan ukuran posisi secara bertahap, memastikan dana yang cukup untuk membatasi kerugian

Peluang Peningkatan

  • Eksplorasi indikator tambahan/alternatif untuk ATR, misalnya Bollinger Band untuk kekuatan tren
  • Memperluas penyeberangan MA dengan kombinasi lain, misalnya EMA, indikator momentum
  • Menggabungkan mekanisme konfirmasi breakout untuk menghindari breakout palsu
  • Perintah optimasi parameter: panjang ATR/lurus > panjang MA > Stop loss/take profit
  • Pertimbangkan untuk mengintegrasikan strategi pengelolaan modal, misalnya posisi pecahan tetap, ukuran dinamis
  • Pengujian backtesting yang ekstensif untuk mengevaluasi stabilitas strategi dan penarikan maksimum

Kesimpulan

Strategi ini sepenuhnya memanfaatkan kekuatan ATR dan MA crossover dalam mengidentifikasi arah tren dan titik masuk. Melalui penyesuaian parameter, dapat beradaptasi dengan lingkungan pasar yang bervariasi. pengujian langsung membuktikan profitabilitas yang konsisten dan tingkat kemenangan yang tinggi. Namun, pengendalian risiko sangat penting untuk operasi yang bijaksana. Validasi data lebih lanjut akan menjamin perluasan dan penyempurnaan menjadi sistem kuantum yang kuat.


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
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/
// © Phoenix085

//@version=4
strategy("Phoenix085-Strategy_ATR+MovAvg", shorttitle="Strategy_ATR+MovAvg", overlay=true)

// // ######################>>>>>>>>>>>>Inputs<<<<<<<<<<<#########################
// // ######################>>>>>>>>>>>>Strategy Inputs<<<<<<<<<<<#########################

TakeProfitPercent = input(50, title="Take Profit %", type=input.float, step=.25)
StopLossPercent = input(5, title="Stop Loss %", type=input.float, step=.25)

ProfitTarget = (close * (TakeProfitPercent / 100)) / syminfo.mintick
LossTarget = (close * (StopLossPercent / 100)) / syminfo.mintick

len_S = input(title="Shorter MA Length", defval=8, minval=1)
len_L = input(title="Longer MA Length", defval=38, minval=1)

TF = input(defval="", title="Session TF for calc only", type=input.session,options=[""])
TF_ = "1"

if TF == "3"
    TF_ == "1"
else 
    if TF == "5" 
        TF_ == "3"
    else 
        if TF == "15"
            TF_ == "5"
        else 
            if TF == "30"
                TF_ == "15"
            else 
                if TF == "1H"
                    TF_ == "30"
                else 
                    if TF == "2H"
                        TF_ == "1H"
                    else 
                        if TF == "4H"
                            TF_ == "3H"
                        else 
                            if TF == "1D"
                                TF_ == "4H"
                            else
                                if TF == "1W"
                                    TF_ == "1H"
                                else 
                                    if TF == "1M"
                                        TF_ == "1W"
                                    else
                                        if TF =="3H"
                                            TF_ == "2H"

Src = security(syminfo.tickerid, TF, close[1], barmerge.lookahead_on)

Src_ = security(syminfo.tickerid, TF_, close, barmerge.lookahead_off)

// ######################>>>>>>>>>>>>ATR Inputs<<<<<<<<<<<#########################
length = input(title="ATR Length", defval=4, minval=1)
smoothing = input(title="ATR Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])


// //######################>>>>>>>>>>>>Custom Functions Declarations<<<<<<<<<<<#########################



// ######################>>>>>>>>>>>>ATR<<<<<<<<<<<#########################

ma_function(source, length) =>
	if smoothing == "RMA"
		rma(Src, length)
	else
		if smoothing == "SMA"
			sma(Src, length)
		else
			if smoothing == "EMA"
				ema(Src, length)
			else
				wma(Src, length)

ATR=ma_function(tr(true), length)


// //######################>>>>>>>>>>>>Conditions<<<<<<<<<<<#########################
ATR_Rise = ATR>ATR[1] and ATR[1]<ATR[2] and ATR[2]<ATR[3]

longCondition = crossover(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) < sma(Src_, len_S) and (sma(Src_, len_S) < Src_[1])
shortCondition = crossunder(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) > sma(Src_, len_S) 

plot(sma(Src_, len_S), color=color.lime, transp=90)
col = longCondition ? color.lime : shortCondition ? color.red : color.gray
plot(sma(Src_, len_L),color=col,linewidth=2)


bool IsABuy = longCondition 
bool IsASell = shortCondition

// // ######################>>>>>>>>>>>>Strategy<<<<<<<<<<<#########################

testStartYear = input(2015, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
inDateRange = true

bgcolor(inDateRange ? color.green : na, 90)
// //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

// // ######################>>>>>>LongEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsABuy 
    strategy.entry("longCondition",true,when = longCondition)
    strategy.close("shortCondition")
    strategy.exit("Take Profit or Stop Loss", "longCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
// strategy.risk.max_drawdown(10, strategy.percent_of_equity)
    
// // ######################>>>>>>ShortEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsASell  
    strategy.entry("shortCondition",false,when = shortCondition)
    strategy.exit("Take Profit or Stop Loss", "shortCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
    strategy.close("longCondition")

Lebih banyak