Strategi trading open-high cross over

Penulis:ChaoZhang, Tanggal: 2023-10-18 11:22:57
Tag:

img

Gambaran umum

Strategi ini menghasilkan sinyal trading berdasarkan crossover antara harga terbuka dan harga tinggi. Ini pergi panjang ketika harga terbuka melintasi harga tinggi dan pergi pendek ketika harga terbuka melintasi harga tinggi. Moving average dapat digunakan untuk meluruskan data harga dan mengurangi perdagangan berisik. Berbagai jenis dan parameter moving average dapat dikonfigurasi. Trailing stop loss juga dapat diaktifkan untuk mengunci keuntungan.

Logika Strategi

  1. Tentukan apakah akan menggunakan resolusi alternatif berdasarkan parameter input useRes. Jika diaktifkan, atur resolusi dengan stratRes.

  2. Memutuskan apakah akan menggunakan moving average (useMA) berdasarkan parameter input. Jika diaktifkan, pilih jenis MA dengan basisType dan atur panjang periode dengan basisLen.

  3. Dapatkan data seri harga terbuka (buka) dan harga dekat (tutup).

  4. Bandingkan harga terbuka saat ini x dengan openSeries openSeries. Jika x lebih besar dari openSeries, atur trendState ke panjang, jika tidak ke pendek.

  5. Menghasilkan sinyal panjang longCond ketika harga terbuka melintasi di atas seri MA terbuka. Menghasilkan sinyal pendek shortCond ketika harga terbuka melintasi di bawah seri MA terbuka.

  6. Masukkan posisi panjang atau pendek berdasarkan sinyal panjang dan pendek. Tetapkan titik stop loss dan offset jika trailing stop loss diaktifkan.

Keuntungan

  1. Menggunakan dua seri harga yang berbeda, terbuka dan tinggi, menghindari keterbatasan seri tunggal.

  2. Teknik MA menyaring kebisingan jangka pendek dan fokus pada tren utama.

  3. Konfigurasi tipe dan parameter MA yang fleksibel untuk efek optimal.

  4. Opsional trailing stop loss untuk mengendalikan risiko dan mengunci keuntungan.

  5. Ruang optimasi yang tinggi untuk menyesuaikan parameter untuk produk dan lingkungan pasar yang berbeda.

Risiko

  1. Sumber sinyal tunggal mengarah pada sinyal yang langka dan potensi perdagangan yang hilang.

  2. Keterlambatan MA dapat mengakibatkan kehilangan peluang jangka pendek.

  3. Konfigurasi stop loss yang tidak benar dapat menyebabkan keluar prematur atau kerugian berlebih.

  4. Penyesuaian parameter yang buruk dapat menyebabkan perdagangan fiksi yang berlebihan yang mempengaruhi kinerja langsung.

  5. Optimasi parameter menantang untuk produk dan lingkungan yang berbeda.

  6. Tambahkan lebih banyak indikator atau model ML untuk memperkaya sumber sinyal. fine tune jenis MA dan parameter. Set stop loss dengan hati-hati dengan beberapa buffer untuk menangkap lebih banyak keuntungan. thoroughly backtest dan mengoptimalkan parameter.

Arahan Optimasi

  1. Masukkan indikator tambahan seperti Bollinger Bands, KD dll untuk memperluas sumber sinyal.

  2. Menerapkan model pembelajaran mesin untuk generasi sinyal.

  3. Mengoptimalkan parameter MA untuk menemukan konfigurasi terbaik.

  4. Saldo tingkat stop loss antara risiko dan penangkapan keuntungan.

  5. Tambahkan metode optimasi parameter untuk menemukan pengaturan optimal secara otomatis.

  6. Mengembangkan template parameter khusus untuk produk yang berbeda.

  7. Membangun kerangka kerja backtesting kuantitatif untuk iterasi strategi cepat.

Ringkasan

Strategi ini menghasilkan sinyal berdasarkan open-high crossover dan menggunakan MAs untuk menyaring kebisingan. Ini menawarkan fleksibilitas melalui parameter yang dapat dikonfigurasi. Strategi ini memiliki keuntungan tetapi juga beberapa masalah seperti sinyal jarang dan lag. Perbaikan lebih lanjut dapat dilakukan melalui lebih banyak indikator, model pembelajaran mesin dll. Penyesuaian dan pengoptimalan parameter yang luas diperlukan untuk kinerja terbaik di berbagai produk dan lingkungan pasar.


/*backtest
start: 2022-10-17 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//strategy(title = "Open Close Cross Strategy", shorttitle = "OCC Strategy", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes      = input(defval = true, title = "Use Alternate Resolution? ( recommended )")
stratRes    = input(defval = "120", title = "Set Resolution ( should not be lower than chart )")
useMA       = input(defval = true, title = "Use MA? ( otherwise use simple Open/Close data )")
basisType   = input(defval = "DEMA", title = "MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )")
basisLen    = input(defval = 14, title = "MA Period", minval = 1)
offsetSigma = input(defval = 6, title = "Offset for LSMA / Sigma for ALMA", minval = 0)
offsetALMA  = input(defval = 0.85, title = "Offset for ALMA", minval = 0, step = 0.01)
useStop     = input(defval = true, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v5 = wma(src, len)                                                  // Weighted
    v6 = vwma(src, len)                                                 // Volume Weighted
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, offSig)                                       // Least Squares
    v10 = alma(src, len, offALMA, offSig)                               // Arnaud Legoux
    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 : v1
// security wrapper for repeat calls
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp) : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
//closeSeries = useMA ? reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(close, useRes, stratRes)
openSeries  = useMA ? reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(open, useRes, stratRes)
x = openSeries[1]
trendState  = x > openSeries ? true : x < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color = x > openSeries ? #006600 : #990000, title = "Bar Colours")
// channel outline
closePlot   = plot(x, title = "Close Line", color = #009900, linewidth = 2, style = line, transp = 90)
openPlot    = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = line, transp = 90)
// channel fill
closePlotU  = plot(trendState ? x : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? openSeries : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : x, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : openSeries, transp = 100, editable = false)
fill(openPlotU, closePlotU, title = "Up Trend Fill", color = #009900, transp = 40)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = #CC0000, transp = 40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond    = crossover(openSeries, x)
shortCond   = crossunder(openSeries, x)
// entries and base exit
strategy.entry("long", true, when = longCond)
strategy.entry("short", false, when = shortCond)
// if we're using the trailing stop
//if (useStop)
//    strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
//    strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)
// not sure needed, but just incase..
//strategy.exit("XL", from_entry = "long", when = shortCond)
//strategy.exit("XS", from_entry = "short", when = longCond)
// === /STRATEGY ===

Lebih banyak