Strategi Perdagangan Terbuka-tinggi

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

img

Ringkasan

Strategi ini menjana isyarat perdagangan berdasarkan persilangan antara harga terbuka dan tinggi. Ia pergi lama apabila harga terbuka melintasi harga tinggi dan pergi pendek apabila harga terbuka melintasi harga tinggi. Purata bergerak boleh digunakan untuk meluruskan data harga dan mengurangkan perdagangan bising. Pelbagai jenis dan parameter purata bergerak boleh dikonfigurasi. Stop loss juga boleh diaktifkan untuk mengunci keuntungan.

Logika Strategi

  1. Tentukan sama ada untuk menggunakan resolusi alternatif berdasarkan parameter input useRes. Jika diaktifkan, tetapkan resolusi dengan stratRes.

  2. Memutuskan sama ada untuk menggunakan purata bergerak (useMA) berdasarkan parameter input. Jika diaktifkan, pilih jenis MA dengan basisType dan tetapkan panjang tempoh dengan basisLen.

  3. Dapatkan data siri harga terbuka (terbuka) dan harga dekat (tutup).

  4. Bandingkan harga terbuka semasa x dengan openSeries siri terbuka. Jika x lebih besar daripada openSeries, tetapkan trendState untuk panjang, sebaliknya untuk pendek.

  5. Menghasilkan isyarat panjang longCond apabila harga terbuka melintasi di atas siri MA terbuka. Menghasilkan isyarat pendek shortCond apabila harga terbuka melintasi di bawah siri MA terbuka.

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

Kelebihan

  1. Menggunakan dua siri harga yang berbeza, terbuka dan tinggi, mengelakkan batasan siri tunggal.

  2. Teknik MA menapis bunyi bising jangka pendek dan memberi tumpuan kepada trend utama.

  3. Konfigurasi jenis dan parameter MA yang fleksibel untuk kesan yang optimum.

  4. Pilihan penangguhan stop loss untuk mengawal risiko dan mengunci keuntungan.

  5. Ruang pengoptimuman yang tinggi untuk menyesuaikan parameter untuk produk dan persekitaran pasaran yang berbeza.

Risiko

  1. Satu sumber isyarat membawa kepada isyarat yang jarang dan berpotensi terlepas perdagangan.

  2. Kelewatan MA boleh mengakibatkan peluang jangka pendek yang hilang.

  3. Konfigurasi stop loss yang tidak betul boleh menyebabkan keluar awal atau kerugian berlebihan.

  4. Penyesuaian parameter yang buruk boleh menyebabkan perdagangan fiksyen yang berlebihan yang menjejaskan persembahan langsung.

  5. Pengoptimuman parameter adalah mencabar untuk produk dan persekitaran yang berbeza.

  6. Tambah lebih banyak penunjuk atau model ML untuk memperkayakan sumber isyarat. Tunes jenis dan parameter MA halus. Tetapkan stop loss dengan teliti dengan beberapa penyangga untuk menangkap lebih banyak keuntungan. Uji balik dan mengoptimumkan parameter.

Arahan pengoptimuman

  1. Menggabungkan penunjuk tambahan seperti Bollinger Bands, KD dll untuk mengembangkan sumber isyarat.

  2. Menggunakan model pembelajaran mesin untuk penjanaan isyarat.

  3. Mengoptimumkan parameter MA untuk mencari konfigurasi terbaik.

  4. Keseimbangan tahap stop loss antara risiko dan keuntungan.

  5. Tambah kaedah pengoptimuman parameter untuk mencari tetapan optimum secara automatik.

  6. Membangunkan templat parameter khusus untuk produk yang berbeza.

  7. Membina rangka kerja pengujian semula kuantitatif untuk pengulangan strategi yang cepat.

Ringkasan

Strategi ini menjana isyarat berdasarkan persilangan tinggi terbuka dan menggunakan MA untuk menapis bunyi bising. Ia menawarkan fleksibiliti melalui parameter yang boleh dikonfigurasikan. Strategi ini mempunyai kelebihan tetapi juga beberapa masalah seperti isyarat yang jarang dan lag. Penambahbaikan lanjut boleh dibuat melalui lebih banyak penunjuk, model pembelajaran mesin dan lain-lain. Penyesuaian parameter yang luas dan pengoptimuman diperlukan untuk prestasi terbaik di seluruh produk dan persekitaran pasaran yang berbeza.


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