
Strategi persilangan garis rata-rata bergerak dua kali dengan mengira rata-rata bergerak dari pelbagai kitaran, menentukan arah trend harga, dan mencapai trend. Apabila rata-rata kitaran pendek melintasi rata-rata kitaran panjang lebih banyak, dan apabila rata-rata kitaran pendek melintasi rata-rata kitaran panjang, ia adalah strategi trend yang biasa.
Strategi ini berdasarkan purata bergerak indeks 9 kitaran, 21 kitaran dan 50 kitaran (EMA). Di mana 9 kitaran EMA mewakili trend jangka pendek, 21 kitaran EMA mewakili trend jangka menengah, dan 50 kitaran EMA mewakili trend jangka panjang.
Apabila 9 kitaran EMA di atas menembusi 21 kitaran EMA, menunjukkan trend jangka pendek beralih ke atas, melakukan lebih banyak; apabila 9 kitaran EMA di bawah menembusi 21 kitaran EMA, menunjukkan trend jangka pendek beralih ke bawah, kosong. Di sini, fungsi silang silang digunakan untuk menilai persilangan garis purata.
Kod ini menetapkan logik bukaan, hentian, dan hentian untuk kedudukan panjang dan kosong. Syarat bukaan kedudukan adalah memakai atau memakai rata-rata. Hentian bermulut adalah harga masuk × ((1 + nisbah hentian input), hentian kepala kosong adalah harga masuk × ((1- nisbah hentian input) │ Hentian bermulut adalah harga masuk × 1- (( nisbah hentian input), hentian kepala kosong adalah harga masuk × ((1 + nisbah hentian input) │
Di samping itu, kod ini menambah beberapa syarat penapisan, seperti penapisan trend, yang memerlukan garis K tidak boleh bergoyang sebelum garis rata naik ke bawah, dan penapisan penggunaan dana, yang memerlukan hak dan kepentingan strategi tidak boleh lebih rendah daripada N garis rata-rata harian, untuk mengelakkan kerugian terlalu banyak ketika masih berdagang.
Secara keseluruhan, strategi ini menggunakan dua EMA bersilang untuk menentukan arah trend harga, dan logik stop-loss yang munasabah untuk menangkap trend garis tengah dan panjang. Tetapi sebagai strategi faktor tunggal, isyaratnya mungkin tidak cukup stabil dan dapat dioptimumkan lebih lanjut.
Cara untuk menangani masalah ini:
Strategi ini boleh dioptimumkan dengan:
Mengoptimumkan parameter kitaran rata-rata bergerak untuk mencari kombinasi kitaran yang optimum.
Menambah isyarat penapis petunjuk teknikal lain, seperti MACD, KD, dan lain-lain, meningkatkan kualiti isyarat. Atau memperkenalkan pembelajaran mesin untuk menilai isyarat, menapis isyarat palsu secara automatik.
Digabungkan dengan analisis jumlah urus niaga. Apabila garis purata telah dilanggar tetapi jumlah urus niaga tidak mencukupi, isyarat tidak diterima.
Apabila pecah berlaku, periksa keadaan turun naik pada peringkat awal, seperti pecah di zon gegaran, yang mungkin menjadi pecah palsu.
Menubuhkan mekanisme hentian dinamik, seperti hentian jenis pengesanan, Chandelier Exit, dan lain-lain, untuk mengurangkan jarak hentian tetapi memastikan hentian berkesan.
Pengurusan kedudukan yang dioptimumkan, seperti kedudukan tetap, kedudukan dinamik, kedudukan leverage, dan lain-lain, menjadikan kadar keuntungan dan kerugian lebih munasabah.
Mengambil kira secara menyeluruh kos dagangan, kesan slippage. Mengoptimumkan nisbah stop loss dan memastikan strategi tetap menguntungkan dalam pasaran sebenar.
Strategi ini mempunyai struktur keseluruhan yang munasabah, asasnya mudah, dengan arah trend yang ditentukan oleh dua EMA silang, dan menetapkan logik stop-stop untuk menangkap trend. Tetapi sebagai strategi faktor tunggal, anda boleh mengoptimumkan lagi parameter, penapisan isyarat, dan lain-lain untuk menjadikan 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 = " ")