
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.
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.
Cara Mengatasinya:
Strategi ini dapat dioptimalkan dengan:
Mengoptimalkan parameter siklus rata-rata bergerak untuk menemukan kombinasi siklus optimal. Dapat memperkenalkan teknik optimasi adaptif, siklus pilihan dinamis.
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.
Analisis volume transaksi. Tidak menerima sinyal jika ada transaksi yang melanggar garis rata-rata tetapi tidak cukup.
Pada saat terjadinya terobosan, periksa kondisi fluktuasi pada tahap awal, seperti terobosan di zona gempa, yang mungkin merupakan terobosan palsu.
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.
Mengoptimalkan manajemen posisi, seperti posisi tetap, posisi dinamis, posisi leverage, dan lain-lain, membuat rasio untung rugi lebih masuk akal.
Mempertimbangkan biaya transaksi secara menyeluruh, dampak slippage. Mengoptimalkan stop loss dan stop loss rasio, memastikan strategi tetap menguntungkan di real time.
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.
/*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 = " ")