Open Close Cross Moving Average Trend Mengikuti Strategi

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

img

Gambaran umum

Open Close Cross Moving Average Trend Following Strategy adalah strategi trend following yang didasarkan pada moving average dari harga terbuka dan dekat. Strategi ini menentukan tren pasar saat ini dengan menghitung moving average dari harga terbuka dan dekat; ia pergi panjang ketika moving average harga penutupan melintasi di atas moving average harga pembukaan, dan pergi pendek ketika moving average harga penutupan melintasi di bawah moving average harga pembukaan. Strategi ini juga menetapkan trailing stop untuk mengunci keuntungan dan secara efektif mengendalikan risiko.

Prinsip-prinsip

Logika inti dari strategi ini didasarkan pada hubungan antara harga buka dan tutup untuk menentukan tren saat ini. Harga pembukaan mencerminkan hubungan penawaran-permintaan pasar saat ini dan psikologi perdagangan, sementara harga penutupan mencerminkan hasil perdagangan akhir hari itu. Secara umum, jika harga penutupan lebih tinggi dari harga pembukaan, itu menunjukkan bahwa tren pasar untuk hari itu naik dan sentimen lebih bullish. Jika harga penutupan lebih rendah dari harga pembukaan, itu menunjukkan tren pasar untuk hari itu menurun dan sentimen lebih bearish.

Strategi ini memanfaatkan logika ini dengan menghitung moving average dari harga buka dan tutup untuk menilai arah tren saat ini.

  1. Pergi panjang ketika rata-rata pergerakan harga penutupan melintasi di atas rata-rata pergerakan harga pembukaan. Ini menandakan bahwa sentimen bullish menguat dan posisi panjang dapat dimulai.

  2. Pergi short ketika harga penutupan bergerak rata-rata melintasi di bawah harga pembukaan bergerak rata-rata. Ini menunjukkan bahwa sentimen bearish meningkat dan posisi pendek dapat dimulai.

  3. Tutup posisi yang ada dengan stop loss ketika sinyal terbalik terjadi.

Strategi ini juga menetapkan trailing stop untuk mengunci keuntungan. Setelah memasuki posisi, secara dinamis menghitung perbedaan titik antara harga masuk dan harga saat ini. Ketika pergerakan harga melebihi ambang titik stop loss yang ditetapkan, garis stop loss akan bergerak ke atas untuk mengunci keuntungan parsial.

Singkatnya, strategi ini menilai tren selama durasi periode rata-rata bergerak; hanya memegang satu posisi arah pada suatu waktu; keluar dari posisi yang ada langsung dengan sinyal terbalik tanpa ATR berhenti; dan memiliki pengaturan stop trailing untuk mengunci keuntungan.

Analisis Keuntungan

Strategi ini memiliki keuntungan utama sebagai berikut:

  1. Aturan yang Sederhana dan JelasMenghakimi tren berdasarkan hubungan terbuka-dekat mudah dipahami dan mengoptimalkan parameter untuk.

  2. Pilihan MA yang FleksibelAda lusinan jenis MA untuk dipilih dan dioptimalkan.

  3. Resolusi yang dapat disesuaikanResolusi dapat disetel menjadi 3-4x grafik untuk sensitivitas lebih dan ketepatan waktu sinyal.

  4. Mekanisme Stop LossTrailing stop secara efektif mengontrol kerugian dan penarikan per perdagangan.

  5. Periode penahanan yang dapat disesuaikanPeriode kepemilikan dan volatilitas dapat dikendalikan dengan menyesuaikan parameter MA.

  6. Fleksibel Menetapkan Risiko-RewardStop loss point dan offset fine tunes preferensi risiko-imbalan.

Analisis Risiko

Risiko utama dari strategi ini terletak pada bidang berikut:

  1. Perubahan Tren yang HilangSinyal keluar dapat menunda pembalikan harga yang mengakibatkan kerugian. Memperpendek periode MA dapat meringankan hal ini.

  2. Tidak Cocok untuk Kondisi Volatilitas Tinggi. Whipsaws sering di bawah kondisi volatile menciptakan biaya komisi yang tinggi. memperluas titik stop loss atau memperpanjang periode MA dapat membantu di sini.

  3. Mengandalkan Indikator Tunggal. Berdasarkan keputusan hanya pada satu set indikator mengeksposnya terhadap risiko kegagalan. Menambahkan indikator lain seperti MACD bisa melengkapi logika.

  4. Risiko Optimasi Terlalu Banyak. Parameter MA dan pengaturan stop loss dapat dengan mudah overfit. Kinerja di luar sampel dapat memburuk. Perhatian harus diambil dalam pemilihan parameter.

Arahan Optimasi

Strategi dapat dioptimalkan dan ditingkatkan dari bidang seperti:

  1. Indikator tambahanIndikator volatilitas dan momentum dapat meningkatkan ketahanan dan stabilitas.

  2. Parameter Dinamis BersyaratPeriode MA dapat disesuaikan berdasarkan tren atau deteksi rezim pasar sisi untuk kemampuan beradaptasi yang lebih baik.

  3. Pengendalian risiko dinamisStop loss point dan offset dapat dikalibrasi pada tingkat volatilitas yang baru-baru ini terwujud.

  4. Logika Stop Loss yang ditingkatkan. Mekanisme stop loss yang lebih canggih seperti ATR stop dapat menggantikan trailing stop yang sederhana.

Kesimpulan

Open Close Cross Moving Average Trend Following Strategy adalah strategi perdagangan tren khas yang didasarkan pada hubungan open-close dan moving averages. Keuntungannya seperti aturan sederhana, fleksibilitas dan risiko yang dapat dikendalikan juga datang dengan kelemahan pembalikan yang hilang dan whipsaws. bidang peningkatan termasuk lebih banyak indikator, parameter dinamis, dan manajemen risiko lanjutan untuk menangkap tren yang lebih baik dan kemampuan beradaptasi dengan kondisi pasar yang bervariasi.


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