
Strategi penembusan dua garis sejajar adalah strategi pemantauan trend berdasarkan penyambungan purata bergerak pada dua kitaran yang berbeza sebagai isyarat membeli dan menjual. Strategi ini menggunakan purata cepat dan titik persilangan purata perlahan sebagai titik masuk perdagangan, setelah persilangan menentukan arah trend dan membina kedudukan overhead atau kosong yang sesuai. Ia dapat menangkap trend di peringkat tengah dan dapat mengurangkan masalah frekuensi perdagangan yang terlalu tinggi yang disebabkan oleh pergerakan yang tidak perlu.
Strategi ini menggunakan dua rata-rata bergerak: satu MA pantas dan satu MA perlahan. Kitaran MA pantas biasanya ditetapkan sebagai kitaran yang lebih pendek (seperti tempoh 15) untuk menangkap perubahan harga jangka pendek; kitaran MA perlahan biasanya ditetapkan sebagai kitaran yang lebih lama (seperti tempoh 21) untuk menentukan arah trend utama. Isyarat perdagangan strategi ini berasal dari persilangan dua MA: apabila MA pantas melintasi MA perlahan sebagai isyarat membeli; apabila MA pantas melintasi MA perlahan sebagai isyarat menjual.
Anda boleh menyesuaikan jangka masa strategi menangkap trend dengan menetapkan pelbagai kombinasi kitaran MA. Kitaran MA yang lebih pendek dapat menangkap peluang perubahan harga dalam kitaran pendek; Kitaran MA yang lebih panjang dapat menyaring getaran dan hanya menangkap trend pada tahap garis panjang.
Strategi ini juga merangkumi modul pengurusan risiko: Stop Loss, Stop Loss, dan Stop Loss Mobile. Ini dapat mengehadkan kerugian maksimum dalam satu perdagangan dan membantu melindungi keuntungan keseluruhan.
Strategi dua hala mempunyai kelebihan berikut:
Terdapat juga risiko yang berkaitan dengan strategi dua hala, yang tertumpu kepada beberapa aspek berikut:
Risiko ini boleh diperbaiki dan dioptimumkan dengan menyesuaikan parameter MA, menambah syarat penapisan, dan mengoptimumkan logik stop-loss.
Strategi dua hala boleh dioptimumkan dalam beberapa aspek:
Dengan pengoptimuman dan penambahbaikan ini, anda dapat meningkatkan peluang kemenangan, keuntungan, dan pulangan risiko anda.
Strategi penembusan dua garis sejajar secara keseluruhan adalah strategi pemantauan trend yang mudah dilaksanakan dan dioptimumkan. Ia mempunyai kelebihan seperti operasi yang mudah, fleksibiliti yang boleh disesuaikan, dan risiko yang boleh dikawal, sangat sesuai sebagai strategi permulaan untuk perdagangan kuantitatif. Dengan ujian dan pengoptimuman yang berterusan, strategi ini dapat terus diperbaiki dan berpotensi menjadi strategi kualitatif.
/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)
maFastSource = input(defval = ohlc4, title = "Fast MA Source")
maFastLength = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength = input(defval = 21, title = "Slow MA Period", minval = 1)
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na
useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na
useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na
useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na
useTimeLimit = input(defval = true, title = "Use Start Time Limiter?")
startYear = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth = input(defval = 05, title = "Start From Month", minval = 0,step = 1)
startDay = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
startTimeOk() =>
inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
timeOk = time > inputTime ? true : false
r = (useTimeLimit and timeOk) or not useTimeLimit
maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)
fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)
aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false
if( startTimeOk() )
enterLong = not tradeDirection[1] and tradeDirection
exitLong = tradeDirection[1] and not tradeDirection
strategy.entry( id = "Long", long = true, when = enterLong )
//strategy.close( id = "Long", when = exitLong )
enterShort = tradeDirection[1] and not tradeDirection
exitShort = not tradeDirection[1] and tradeDirection
strategy.entry( id = "Short", long = false, when = enterShort )
//strategy.close( id = "Short", when = exitShort )
strategy.exit("Exit Long", from_entry = "Long", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)