Strategi Crossover Rata-rata Pergerakan Ganda


Tanggal Pembuatan: 2023-11-16 17:50:52 Akhirnya memodifikasi: 2023-11-16 17:50:52
menyalin: 0 Jumlah klik: 688
1
fokus pada
1617
Pengikut

Strategi Crossover Rata-rata Pergerakan Ganda

Ringkasan

Strategi lintas garis rata-rata bergerak ganda dengan menghitung rata-rata bergerak dari periode yang berbeda, menilai arah tren harga, untuk mencapai trend tracking. Ketika rata-rata periode pendek di atas rata-rata periode panjang, dan ketika rata-rata periode pendek di bawah rata-rata periode panjang, adalah strategi pelacakan tren yang khas.

Prinsip Strategi

Strategi ini didasarkan pada rata-rata pergerakan indeks 9 periode, 21 periode, dan 50 periode (EMA). Di mana 9 periode EMA mewakili tren jangka pendek, 21 periode EMA mewakili tren jangka menengah, dan 50 periode EMA mewakili tren jangka panjang.

Ketika 9 siklus EMA di atas melewati 21 siklus EMA, menunjukkan tren jangka pendek bergeser ke atas, melakukan lebih banyak; ketika 9 siklus EMA di bawah melewati 21 siklus EMA, menunjukkan tren jangka pendek bergeser ke bawah, melakukan kosong. Di sini, fungsi silang digunakan crossover () untuk menilai persimpangan garis rata-rata.

Kode ini mengatur logika open, stop, dan stop loss untuk posisi panjang dan kosong. Kondisi open position adalah rata-rata naik atau turun. Stop stop multihead adalah harga masuk × ((1 + rasio stop untuk input), stop stop head kosong adalah harga masuk × ((1- rasio stop untuk input).

Selain itu, kode ini juga menambahkan beberapa kondisi penyaringan, seperti penyaringan tren, yang mengharuskan K-line tidak dapat bergoyang sebelum rata-rata naik ke bawah, dan penyaringan tingkat pemanfaatan dana, yang mengharuskan hak dan kepentingan strategi tidak dapat di bawah N-line, untuk menghindari kerugian terlalu banyak saat masih diperdagangkan.

Secara keseluruhan, strategi ini menggunakan dua EMA silang untuk menilai arah tren harga, dan logika stop-loss yang masuk akal untuk menangkap tren garis tengah dan panjang. Namun, sebagai strategi faktor tunggal, sinyalnya mungkin tidak cukup stabil dan dapat dioptimalkan lebih lanjut.

Analisis Keunggulan

  • Menggunakan dua mobile crossover untuk menentukan arah tren, prinsipnya sederhana, mudah dipahami dan diterapkan.
  • Menggunakan EMA periode yang berbeda untuk menilai tren jangka pendek dan panjang.
  • Pengaturan Stop Loss Logic, yang dapat mengunci keuntungan dan mengontrol risiko.
  • Dengan menambahkan kondisi filter, sinyal palsu dapat disaring hingga batas tertentu.
  • Anda dapat mengatur parameter secara bebas, mengoptimalkan kombinasi siklus, dan menyesuaikan dengan lingkungan pasar yang berbeda.

Analisis risiko

  • Sebagai strategi faktor tunggal, sinyal perdagangan mungkin tidak cukup stabil.
  • Pada saat EMA melintasi, harga mungkin telah berjalan beberapa jarak, dan ada risiko mengejar naik dan turun.
  • Tidak mempertimbangkan biaya transaksi, keuntungan di real-time dapat berkurang.
  • Tidak ada stop loss, tidak ada kendali atas kerugian dalam situasi ekstrem.

Cara Mengatasinya:

  1. Optimalkan parameter siklus MA untuk membuat sinyal lebih stabil.
  2. Dalam kombinasi dengan indikator lain, filter sinyal.
  3. Meningkatkan volume transaksi dan mengurangi dampak biaya.
  4. Tetapkan Stop Loss dan Batasi Kerugian Maksimal.

Arah optimasi

Strategi ini dapat dioptimalkan dengan:

  1. Mengoptimalkan parameter siklus rata-rata bergerak untuk menemukan kombinasi siklus optimal. Dapat memperkenalkan teknik optimasi adaptif, siklus pilihan dinamis.

  2. Menambahkan indikator teknis lainnya untuk memfilter sinyal, seperti MACD, KD, dan lain-lain, meningkatkan kualitas sinyal. Atau memperkenalkan pembelajaran mesin untuk menilai sinyal, memfilter sinyal palsu secara otomatis.

  3. Analisis volume transaksi. Tidak menerima sinyal jika ada transaksi yang melanggar garis rata-rata tetapi tidak cukup.

  4. Pada saat terjadinya terobosan, periksa kondisi fluktuasi pada tahap awal, seperti terobosan di zona gempa, yang mungkin merupakan terobosan palsu.

  5. Membangun mekanisme stop loss yang dinamis, seperti stop loss jenis tracking, Chandelier Exit, dan lain-lain, untuk mengurangi jarak stop loss, tetapi memastikan stop loss efektif.

  6. Mengoptimalkan manajemen posisi, seperti posisi tetap, posisi dinamis, posisi leverage, dan lain-lain, membuat rasio untung rugi lebih masuk akal.

  7. Mempertimbangkan biaya transaksi secara menyeluruh, dampak slippage. Mengoptimalkan stop loss dan stop loss rasio, memastikan strategi tetap menguntungkan di real time.

Meringkaskan

Strategi ini memiliki struktur keseluruhan yang masuk akal, prinsipnya sederhana, dengan arah tren yang dinilai oleh dua EMA silang, dan mengatur logika stop-loss stop-loss, dapat menangkap tren. Tetapi sebagai strategi faktor tunggal, dapat lebih mengoptimalkan pengaturan parameter, penyaringan sinyal, dan lain-lain, membuat strategi lebih stabil.

Kode Sumber Strategi
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")