Strategi Crossover Rata-rata Pergerakan Ganda


Tanggal Pembuatan: 2023-12-13 15:51:13 Akhirnya memodifikasi: 2023-12-13 15:51:13
menyalin: 0 Jumlah klik: 1316
1
fokus pada
1621
Pengikut

Strategi Crossover Rata-rata Pergerakan Ganda

Ringkasan

Strategi biner crossover adalah strategi perdagangan kuantitatif yang didasarkan pada rata-rata bergerak. Strategi ini menilai tren harga dengan menghitung persimpangan garis cepat dan lambat, dan mengirimkan sinyal beli dan jual di titik persimpangan. Strategi ini menggunakan garis Hull sebagai garis cepat, dan filter Super Smoother sebagai garis lambat. Kombinasi ini menggabungkan kehalusan garis rata dan kemampuan menilai tren, yang dapat secara efektif mengidentifikasi pergerakan harga, menghasilkan sinyal perdagangan yang lebih andal.

Prinsip Strategi

Rumus perhitungan untuk strategi titik-titik titik-titik yang saling melintang adalah sebagai berikut: Garis cepat ((Hull mean line): WMA ((2 * WMA ((value,n/2) - WMA ((value,n),SQRT ((n))
Super Smoother: Nilai tiga kali filter

Di antaranya, WMA adalah rata-rata bergerak berbobot, SQRT adalah akar kuadrat terbuka, dan filter terdiri dari satu satuan dan dua duaan.

Strategi untuk menentukan hubungan silang antara dua garis dengan menghitung nilai garis cepat dan lambat, di mana:
Pembagian jalur cepat menjadi jalur lambat adalah sinyal pembelian. Di bawah garis cepat, melewati garis lambat adalah sinyal jual.

Analisis Keunggulan

Strategi titik titik silang dua garis rata menggabungkan keuntungan dari penilaian dua garis rata dan perdagangan titik, dapat dengan akurat menangkap titik perubahan tren, masuk dan keluar tepat waktu. Dibandingkan dengan strategi garis rata tunggal, memiliki keuntungan berikut:

  1. Kombinasi dua garis rata menghilangkan sinyal palsu. Garis cepat menentukan arah tren dan kekuatan, dan garis lambat memfilter getaran, membuat sinyal lebih dapat diandalkan.
  2. Filter Super Smoother memiliki kemampuan data fittings yang kuat, yang dapat secara efektif mengekstrak tren harga.
  3. Hull Average Line sangat sensitif terhadap perubahan harga dan dapat menangkap pergeseran tepat waktu.

Analisis risiko

Strategi dua titik persimpangan linear juga memiliki beberapa risiko:

  1. Dalam situasi getaran, sinyal whipsaw lebih mungkin muncul. Interval rata-rata dapat diperluas secara tepat untuk mengurangi sinyal palsu.
  2. Jika jarak dua baris terlalu lebar, maka akan terlewatkan beberapa kesempatan. Perlu diperhitungkan jumlah dan kualitas sinyal yang ditangkap.
  3. Strategi ini lebih cocok untuk varietas dengan tren yang lebih jelas, dan tidak cocok untuk produk dengan fluktuasi tinggi.

Arah optimasi

Strategi bidirectional intersection point dapat dioptimalkan dari dimensi berikut:

  1. Menyesuaikan parameter garis rata-rata dengan varietas yang memiliki periode dan amplitudo yang berbeda.
  2. Tambahkan indikator tambahan atau filter untuk menilai kualitas tren, untuk mengurangi whipsaw.
  3. Rasio optimasi posisi yang digabungkan dengan indikator tren

Meringkaskan

Strategi titik titik silang dua garis rata mewarisi kelebihan strategi garis rata, memperluas penggunaan penilaian dua garis rata dan metode perdagangan titik, membentuk program perdagangan kuantitatif yang lebih canggih dan andal. Ini memiliki keunggulan unik dalam memilih perdagangan tepat waktu, layak untuk diuji coba dan dieksplorasi. Artikel ini menganalisis prinsip, kelebihan dan kekurangan strategi ini secara mendalam, dan memberikan ide-ide optimasi yang dapat digunakan sebagai referensi.

Kode Sumber Strategi
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//

strategy(title='Open Close Cross Strategy ', shorttitle='sacinvesting', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes = input(defval=true, title='Use Alternate Resolution?')
intRes = input(defval=3, title='Multiplier for Alernate Resolution')
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') : timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') : timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') : timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') : '60'
basisType = input.string(defval='SMMA', title='MA Type: ', options=['SMA', 'EMA', 'DEMA', 'TEMA', 'WMA', 'VWMA', 'SMMA', 'HullMA', 'LSMA', 'ALMA', 'SSMA', 'TMA'])
basisLen = input.int(defval=8, title='MA Period', minval=1)
offsetSigma = input.int(defval=6, title='Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(defval=0.85, title='Offset for ALMA', minval=0, step=0.01)
scolor = input(false, title='Show coloured Bars to indicate Trend?')
delayOffset = input.int(defval=0, title='Delay Open/Close MA (Forces Non-Repainting)', minval=0, step=1)
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #00FF00FF
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = ta.sma(src, len)  // Simple
    v2 = ta.ema(src, len)  // Exponential
    v3 = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5 = ta.wma(src, len)  // Weighted
    v6 = ta.vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9 = ta.linreg(src, len, offSig)  // Least Squares
    v10 = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = ta.sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // ©️ 2013 John F. Ehlers
    a1 = math.exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    type == 'EMA' ? v2 : type == 'DEMA' ? v3 : type == 'TEMA' ? v4 : type == 'WMA' ? v5 : type == 'VWMA' ? v6 : type == 'SMMA' ? v7 : type == 'HullMA' ? v8 : type == 'LSMA' ? v9 : type == 'ALMA' ? v10 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp

// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title='Bar Colours')
closeP = plot(closeSeriesAlt, title='Close Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
openP = plot(openSeriesAlt, title='Open Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions.

// === STRATEGY ===
// stop loss
slPoints = input.int(defval=0, title='Initial Stop Loss Points (zero to disable)', minval=0)
tpPoints = input.int(defval=0, title='Initial Target Profit Points (zero for disable)', minval=0)
// Include bar limiting algorithm
ebar = input.int(defval=10000, title='Number of Bars for Back Testing', minval=0)
dummy = input(false, title='- SET to ZERO for Daily or Longer Timeframes')
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != 'NONE'
    strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT')
    strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG')
    strategy.close('long', when=shortCond == true and tradeType == 'LONG')
    strategy.close('short', when=longCond == true and tradeType == 'SHORT')
    strategy.exit('XL', from_entry='long', profit=TP, loss=SL)
    strategy.exit('XS', from_entry='short', profit=TP, loss=SL)

// === /STRATEGY ===
// eof