Terbuka Tutup Rintisan Moving Average Trend Mengikut Strategi

Penulis:ChaoZhang, Tarikh: 2024-01-15 14:24:27
Tag:

img

Ringkasan

Open Close Cross Moving Average Trend Following Strategy adalah strategi trend berikut berdasarkan purata bergerak harga terbuka dan dekat. Ia menentukan trend pasaran semasa dengan mengira purata bergerak harga terbuka dan dekat; ia pergi panjang apabila purata bergerak harga penutupan melintasi di atas purata bergerak harga pembukaan, dan pergi pendek apabila purata bergerak harga penutupan melintasi di bawah purata bergerak harga pembukaan. Strategi ini juga menetapkan trailing berhenti untuk mengunci keuntungan dan mengawal risiko dengan berkesan.

Prinsip-prinsip

Logik teras strategi ini adalah berdasarkan hubungan antara harga terbuka dan ditutup untuk menentukan trend semasa. Harga pembukaan mencerminkan hubungan bekalan permintaan pasaran semasa dan psikologi perdagangan, sementara harga penutupan mencerminkan hasil dagangan akhir hari itu. Secara umum, jika harga penutupan lebih tinggi daripada harga pembukaan, ia menunjukkan bahawa trend pasaran untuk hari itu adalah menaik dan sentimen lebih bullish. Jika harga penutupan lebih rendah daripada harga pembukaan, ia menunjukkan trend pasaran untuk hari itu menurun dan sentimen lebih menurun.

Strategi ini menggunakan logik ini dengan mengira purata bergerak harga terbuka dan tutup untuk menilai arah trend semasa.

  1. Pergi panjang apabila purata pergerakan harga penutupan melintasi di atas purata pergerakan harga pembukaan. Ini menandakan bahawa sentimen bullish semakin kuat dan kedudukan panjang boleh dimulakan.

  2. Pergi pendek apabila purata pergerakan harga penutupan melintasi di bawah purata pergerakan harga pembukaan. Ini menunjukkan bahawa sentimen menurun meningkat dan kedudukan pendek boleh dimulakan.

  3. Tutup kedudukan sedia ada dengan stop loss apabila isyarat terbalik berlaku.

Strategi ini juga menetapkan penangguhan untuk mengunci keuntungan. Selepas memasuki kedudukan, ia secara dinamik mengira perbezaan titik antara harga kemasukan dan harga semasa. Apabila pergerakan harga melebihi ambang titik stop loss yang ditetapkan, garis stop loss akan bergerak ke atas untuk mengunci keuntungan separa.

Ringkasnya, strategi ini menilai trend sepanjang tempoh purata bergerak; memegang hanya satu kedudukan arah pada satu masa; keluar dari kedudukan sedia ada secara langsung dengan isyarat terbalik tanpa henti ATR; dan mempunyai tetapan henti yang menghalang untuk mengunci keuntungan.

Analisis Kelebihan

Strategi ini mempunyai kelebihan utama berikut:

  1. Peraturan Sederhana dan Jelas. Penghakiman trend berdasarkan hubungan terbuka-dekat adalah mudah untuk memahami dan mengoptimumkan parameter untuk.

  2. Pilihan MA yang fleksibelTerdapat berpuluh-puluh jenis MA untuk dipilih dan dioptimumkan.

  3. Resolusi yang boleh diselaraskanResolusi boleh ditetapkan kepada 3-4x carta untuk sensitiviti dan ketepatan masa isyarat yang lebih.

  4. Mekanisme Hentikan Kerugian. Hentian pengangkutan secara berkesan mengawal kerugian dan pengeluaran setiap perdagangan.

  5. Tempoh Simpan yang Boleh DisesuaikanTempoh penahan dan turun naik boleh dikawal dengan menyesuaikan parameter MA.

  6. Pendapatan Risiko-Ganjaran yang boleh disesuaikan dengan fleksibel. Hentikan titik kerugian dan mengimbangi preferensi risiko-balasan.

Analisis Risiko

Risiko utama strategi ini terletak di bidang berikut:

  1. Peralihan Trend yang HilangIsyarat keluar boleh menjangkiti pembalikan harga yang mengakibatkan kerugian. Memendekkan tempoh MA boleh meringankan ini.

  2. Tidak Sesuai untuk Keadaan Volatiliti Tinggi. Whipsaws kerap di bawah keadaan yang tidak menentu mewujudkan kos komisen yang tinggi. memperluaskan titik stop loss atau memanjangkan tempoh MA boleh membantu di sini.

  3. Bergantung pada Penunjuk TunggalMengandung keputusan hanya pada satu set penunjuk mendedahkan ia kepada risiko kegagalan. Menambah penunjuk lain seperti MACD boleh melengkapkan logik.

  4. Risiko Pengoptimuman Terlalu. Parameter MA dan tetapan stop loss boleh dengan mudah overfit. Performance out-of-sample mungkin merosot. Hati-hati harus diambil dalam pemilihan parameter.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dan ditingkatkan dari bidang seperti:

  1. Penunjuk tambahanVolatiliti dan petunjuk momentum boleh meningkatkan ketahanan dan kestabilan.

  2. Parameter Dinamik BersyaratTempoh MA boleh diselaraskan berdasarkan trend atau pengesanan rejim pasaran sampingan untuk penyesuaian yang lebih baik.

  3. Kawalan risiko dinamikTitik-titik stop loss dan offset boleh dikalibrasi pada tahap turun naik yang baru-baru ini diwujudkan.

  4. Logik Stop Loss yang Ditingkatkan. Mekanisme stop loss yang lebih maju seperti berhenti ATR boleh menggantikan berhenti yang sederhana.

Kesimpulan

Open Close Cross Moving Average Trend Following Strategy adalah strategi perdagangan trend biasa berdasarkan hubungan terbuka-dekat dan purata bergerak. Kelebihannya seperti peraturan mudah, fleksibiliti dan risiko yang boleh dikawal juga datang dengan kelemahan pembalikan yang hilang dan whipsaws.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true )

// 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 )", type=input.resolution)
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 )", type=input.string)
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
    sma_1 = sma(src, len)  // Smoothed
    v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len
    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) =>
    security_1 = security(syminfo.tickerid, res, exp)
    use ? security_1 : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
reso__1 = reso(variant__1, useRes, stratRes)
reso__2 = reso(close, useRes, stratRes)
closeSeries = useMA ? reso__1 : reso__2
variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
reso__3 = reso(variant__2, useRes, stratRes)
reso__4 = reso(open, useRes, stratRes)
openSeries = useMA ? reso__3 : reso__4
trendState = bool(na)
trendState := closeSeries > openSeries ? true : 
   closeSeries < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours")
// channel outline
closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90)
openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90)
// channel fill
closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false)
openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false)
closePlotD = plot(trendState ? na : closeSeries, 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(closeSeries, openSeries)
shortCond = crossunder(closeSeries, openSeries)
// entries and base exit
strategy.entry("long", strategy.long, when=longCond)
strategy.entry("short", strategy.short, 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