Open Close Cross Point Strategy (Strategi titik silang terbuka dan dekat)

Penulis:ChaoZhangTanggal: 2023-12-13 15:51:13
Tag:

img

Gambaran umum

Open close cross point strategy adalah strategi perdagangan kuantitatif yang didasarkan pada crossover rata-rata bergerak. Strategi ini menentukan tren harga dengan menghitung persilangan antara garis rata-rata bergerak cepat dan lambat dan menghasilkan sinyal beli dan jual di titik persilangan. Strategi ini menggunakan Hull Moving Average sebagai garis cepat dan Super Smoother filter sebagai garis lambat. Kombinasi ini menggabungkan baik kelancaran dan kemampuan penentuan tren rata-rata bergerak dan dapat secara efektif mengidentifikasi pergerakan harga untuk menghasilkan sinyal perdagangan yang relatif dapat diandalkan.

Prinsip Strategi

Rumus untuk menghitung strategi titik silang dekat terbuka adalah: Jalur cepat (Hull MA): WMA(2 * WMA(harga, n/2) - WMA(harga, n), SQRT(n)) Garis lambat (Super Smoother Filter): Filter tiga harga

Di mana WMA adalah Rata-rata Bergerak Bertimbang, SQRT adalah akar kuadrat, dan filter berisi satu istilah lag urutan pertama dan dua istilah lag urutan kedua.

Strategi ini menilai hubungan antara jalur cepat dan lambat dengan menghitung nilainya. Crossover ke atas dari jalur cepat adalah sinyal beli
Crossover ke bawah dari jalur cepat adalah sinyal jual

Analisis Keuntungan

Strategi cross point close open menggabungkan keuntungan dari penilaian rata-rata bergerak ganda dan perdagangan titik. Ini dapat dengan akurat menangkap titik balik tren untuk entri dan keluar yang tepat waktu. Dibandingkan dengan strategi rata-rata bergerak tunggal, strategi ini memiliki keuntungan berikut:

  1. Kombinasi rata-rata bergerak ganda menghilangkan sinyal palsu. garis cepat menentukan arah tren / kekuatan, garis lambat menyaring keluar osilasi sehingga sinyal menjadi lebih dapat diandalkan.
  2. Filter Super Smoother memiliki kemampuan pencocokan data yang luar biasa untuk secara efektif mengekstrak tren harga.
  3. Hull MA memiliki sensitivitas tinggi terhadap perubahan harga dan dapat melihat pembalikan tepat waktu.

Analisis Risiko

Strategi open close cross point juga membawa risiko tertentu:

  1. Lebih banyak sinyal whipsaw dapat terjadi selama pasar berkisar. Dapat memperluas interval antara MA untuk mengurangi sinyal palsu.
  2. Interval yang terlalu luas antara MAs dapat kehilangan beberapa kesempatan.
  3. Strategi ini lebih cocok untuk produk dengan tren yang lebih jelas, tidak disarankan untuk produk yang sangat fluktuatif.

Arahan Optimasi

Strategi titik silang dekat terbuka dapat dioptimalkan dalam dimensi berikut:

  1. Sesuaikan parameter MA agar sesuai dengan produk dari periode dan rentang volatilitas yang berbeda.
  2. Tambahkan indikator tambahan atau filter untuk menentukan kualitas tren untuk mengurangi whipsaws.
  3. Mengoptimalkan ukuran posisi dengan memasukkan indikator kekuatan tren.

Kesimpulan

Strategi cross point close open mewarisi keuntungan dari strategi moving average sementara memperluas penggunaan penilaian moving average dual dan model perdagangan titik untuk membentuk skema perdagangan kuantitatif yang lebih canggih dan andal. Strategi ini memiliki keuntungan unik dalam perdagangan waktu yang layak untuk pengujian langsung dan eksplorasi aplikasi. Artikel ini secara menyeluruh menganalisis prinsip, kekuatan dan kelemahan strategi ini, dan memberikan ide-ide pengoptimalan untuk referensi.


/*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



Lebih banyak