Strategi Hibrida Moving Average Crossover dan Average True Range


Tanggal Pembuatan: 2023-09-26 17:22:21 Akhirnya memodifikasi: 2023-09-26 17:22:21
menyalin: 7 Jumlah klik: 976
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini menggabungkan dua indikator teknis, yaitu Linear Crossover dan Average Real Wavelength, untuk mengidentifikasi sinyal Linear Crossover dalam tren dan mendapatkan tingkat kemenangan yang lebih tinggi.

Prinsip

  • Menggunakan indikator ATR untuk menilai volatilitas harga siklus besar dan mengkonfirmasi tren naik
  • Dalam periode kecil, perhitungkan rata-rata cepat dan rata-rata lambat, lakukan lebih banyak saat melewati garis cepat, kosong saat melewati garis lambat di bawah garis cepat
  • Indikator ATR menghitung rata-rata gelombang nyata untuk periode besar, menentukan tren keseluruhan; persilangan rata-rata menentukan titik masuk pasar spesifik dalam periode kecil
  • Indikator ATR dihitung oleh rata-rata bergerak lurus RMA, panjang dan kelancaran dapat disesuaikan
  • Persebarannya terdiri dari dua SMA persebarannya, panjangnya dapat disesuaikan

Keunggulan

  • Indeks ATR dapat memfilter tren yang bergejolak dan menghindari transaksi yang sia-sia
  • Persilangan garis rata-rata dapat menentukan tren siklus kecil dengan tepat
  • RMA menghitung ATR untuk mengurangi kurva dan lebih stabil dalam menentukan pergerakan siklus besar
  • Kombinasi keduanya, menghindari gempa dan memanfaatkan peluang
  • Parameter dapat disesuaikan dan dioptimalkan untuk berbagai varietas dan siklus waktu
  • Secara keseluruhan, strategi ini memiliki tingkat keberhasilan yang tinggi dan kemungkinan untuk mendapatkan keuntungan yang stabil.

Risiko

  • Indeks ATR menilai tren utama terlambat, mungkin melewatkan awal tren
  • Persentase ada beberapa kali penyesuaian pada persimpangan rata-rata, lebih banyak sinyal Sell
  • Parameter Tuning sangat penting, pengaturan yang tidak tepat dapat menyebabkan terlalu sering atau konservatif perdagangan
  • Analisis data historis untuk varietas tertentu untuk menemukan kombinasi parameter yang optimal
  • Rekomendasi untuk membuka posisi secara bertahap, memastikan ada dana yang cukup, dan mengendalikan kerugian tunggal

Arah optimasi

  • Cobalah untuk melengkapi atau menggantikan ATR dengan indikator lain, seperti Brinks untuk menilai kekuatan tren
  • Jenis rata-rata crossover dapat diperluas ke kombinasi lain, seperti EMA, indikator momentum, dll.
  • Mekanisme Pencoblosan yang Dapat Dilakukan untuk Menghindari Penembusan Palsu
  • Urutan pengaturan parameter optimasi: Panjang dan kelancaran ATR > Panjang garis rata-rata > Pengaturan stop loss
  • Pertimbangkan strategi pengelolaan dana yang digabungkan, seperti saham tetap, posisi dinamis, dan lain-lain.
  • Pengembalian jangka panjang dalam real-time, evaluasi stabilitas strategi dan pengembalian maksimum

Meringkaskan

Strategi ini memanfaatkan sepenuhnya keuntungan masing-masing ATR dan garis rata untuk menentukan arah tren dan titik masuk tertentu. Dengan penyesuaian parameter, dapat disesuaikan dengan lingkungan pasar yang berbeda. Verifikasi di lapangan menunjukkan bahwa strategi ini dapat menghasilkan kemenangan yang lebih tinggi dan keuntungan yang stabil.

Kode Sumber Strategi
/*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")