Strategi perdagangan silang dua rata-rata dengan menghitung rata-rata dari dua pengaturan parameter yang berbeda, dan melakukan operasi beli dan jual melalui persilangan rata-rata. Strategi ini sederhana dan langsung, cocok untuk perdagangan jangka pendek menengah.
Strategi ini terutama dengan memasukkan parameter seperti siklus rata-rata cepat, siklus rata-rata lambat, dan jenis rata-rata, untuk menghitung rata-rata cepat dan rata-rata lambat. Operasi pembelian dilakukan ketika rata-rata cepat melewati rata-rata lambat di atas rata-rata cepat dan operasi penjualan dilakukan ketika rata-rata lambat melewati rata-rata cepat di bawah rata-rata cepat.
Logika inti dari strategi ini adalah:
Masukkan parameter: siklus rata-rata cepat maLen1, siklus rata-rata lambat maLen2, tipe rata-rata maTypeChoice
Rata-rata kecepatan cepat maValue1 dan rata-rata kecepatan lambat maValue2 berdasarkan parameter input
Bandingkan dua hubungan ukuran garis rata untuk menentukan kondisi pembelian dan penjualan:
Kondisi pembelian: maValue1 memakai maValue2
Kondisi penjualan: maValue1 di bawah maValue2
Melakukan transaksi yang sesuai saat kondisi pembelian dan penjualan terwujud
Garis rata ditampilkan secara visual, dan hubungan ukuran garis rata dibedakan dengan warna yang berbeda
Menerbitkan sinyal untuk membeli dan menjual
Menggunakan prinsip dua garis sejajar silang, untuk menghindari salah kaprah oleh getaran satu garis sejajar
Parameter rata-rata linear dapat disesuaikan untuk operasi siklus yang berbeda
Logika transaksi sederhana dan mudah dipahami
Tanda-tanda pembelian dan penjualan yang dapat disesuaikan, untuk mengetahui waktu transaksi secara real-time
Visualisasi menunjukkan pergerakan rata-rata, membentuk indikator perdagangan intuitif
Optimalisasi parameter untuk menemukan kombinasi parameter yang optimal
Dapat digunakan untuk retrospeksi mencari parameter optimal, juga dapat digunakan untuk perdagangan hard disk
Persilangan rata-rata mudah menghasilkan sinyal yang salah, dan harus dinilai dalam kombinasi tren dan bentuk
Pada saat bergejolak, sering membuka posisi dapat menyebabkan kerugian biaya transaksi.
Parameter yang salah dapat menyebabkan terlalu sering atau tidak sering bertransaksi
Kejadian yang tak terduga dapat menyebabkan situasi yang tidak dapat dihindari.
Indikator siklus pendek mungkin tidak berfungsi saat siklus besar pecah
Perangkat lunak ini membutuhkan pemantauan yang sering dan tidak sepenuhnya otomatis.
Solusi untuk Mengatasi Risiko:
Menggunakan Indeks Tren untuk Menghindari Perdagangan Besi Bergoyang
Kombinasi indikator morfologi untuk mengkonfirmasi efektivitas sinyal
Optimalkan parameter agar frekuensi transaksi mencapai tingkat yang wajar
Tetapkan Stop Loss Stop Point untuk mengendalikan kerugian tunggal
Stabilitas parameter yang diverifikasi dalam beberapa periode waktu
Filter waktu atau sinyal untuk menghindari penembusan palsu
Uji parameter rata-rata yang berbeda untuk mencari parameter optimal
Uji jenis rata-rata yang berbeda, pilih rata-rata yang paling akurat untuk menghasilkan sinyal
Menggunakan indikator tren untuk menghindari perdagangan yang tidak sesuai tren
Menggabungkan indikator fluktuasi untuk menentukan waktu bermain yang tepat
Tambahkan waktu atau sinyal filter, mengurangi sinyal yang salah
Mengatur kontrol slider untuk mengoptimalkan efek perdagangan
Stabilitas multi-varietas multi-siklus
Tergabung dalam strategi stop loss otomatis
Menjelajahi teknologi seperti pembelajaran mesin untuk meningkatkan hasil pengukuran
Strategi crossover linier ganda adalah strategi indikator teknis yang sangat khas. Ini menggunakan prinsip crossover linier yang cepat dan lambat untuk menghasilkan sinyal perdagangan, dan dapat memperoleh hasil yang baik dengan pengoptimalan parameter. Namun, strategi ini juga memiliki risiko tertentu, perlu bekerja sama dengan tren, bentuk, dan indikator teknis lainnya untuk melakukan verifikasi, mengurangi tingkat sinyal yang salah. Selain itu, dalam perdagangan langsung, detail perdagangan seperti kontrol slippage juga perlu dipertimbangkan.
/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)
maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )
maValue1 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen1 )
else
0
maValue2 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen2 )
else
0
buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )
mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red
plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )
var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100
barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")
alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")
// Strategy Tester
stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )
tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )
fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )
isTime(_position) =>
range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )
if ( stratTesterOn and window() )
if ( buySignal and isTime( entryTime ) )
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Buy", strategy.long, contractSize )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
if ( sellSignal and isTime( entryTime ))
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Sell", strategy.short, contractSize )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
if ( maValue1 > maValue2 )
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
else
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
strategy.close_all( when=not isTime( entryTime ) )
plot( strategy.equity )