Strategi perdagangan silang harga tinggi kurungan terbuka


Tarikh penciptaan: 2023-10-18 11:22:57 Akhirnya diubah suai: 2023-10-18 11:22:57
Salin: 1 Bilangan klik: 633
1
fokus pada
1617
Pengikut

Strategi perdagangan silang harga tinggi kurungan terbuka

Gambaran keseluruhan

Strategi ini berdasarkan kepada persilangan harga bukaan dan harga tinggi untuk membuat keputusan isyarat perdagangan. Buat lebih banyak apabila harga bukaan naik tinggi, dan kosong apabila harga bukaan naik tinggi. Menggunakan purata bergerak untuk meluruskan data harga, mengurangkan bising perdagangan.

Prinsip Strategi

  1. Mengambil keputusan sama ada menggunakan resolusi kitaran alternatif berdasarkan parameter input ((useRes) ≠ jika digunakan, setkan kitaran mengikut stratRes ≠

  2. Jika digunakan, pilih jenis purata bergerak mengikut basisType, dan basisLen menetapkan panjang kitaran.

  3. Dapatkan siri data harga buka (open) dan harga tutup (close). Jika menggunakan purata bergerak, gunakan jenis purata bergerak yang dipilih dan parameter yang diproses dengan lancar.

  4. Bandingkan harga pembukaan semasa x dengan harga pembukaan siri openSeries. Jika x lebih besar daripada openSeries, keadaan trend trendState adalah multihead, jika tidak, kosong.

  5. LongCond dihasilkan apabila harga terbuka melintasi harga bergerak rata-rata dan shortCond apabila harga terbuka melintasi harga bergerak rata-rata.

  6. Masukkan ke dalam kedudukan multihead atau kosong mengikut isyarat melakukan lebih banyak pengurangan. Jika anda mengaktifkan tracking stop loss, setkan titik stop loss dan jarak perpindahan.

Kelebihan Strategik

  1. Ubah isyarat perdagangan menggunakan dua siri yang berlainan harga terbuka dan harga tinggi, mengelakkan keterbatasan satu siri data.

  2. Penggunaan teknologi purata bergerak dapat menyaring bunyi pasaran jangka pendek dan mengunci trend utama.

  3. Jenis purata bergerak boleh dikonfigurasikan secara fleksibel, menyesuaikan parameter untuk kesan terbaik.

  4. Anda boleh memilih untuk menggunakan Tracking Stop untuk mengawal risiko dan mengunci keuntungan.

  5. Terdapat ruang untuk mengoptimumkan strategi dan menyesuaikan parameter untuk pelbagai jenis dan keadaan pasaran.

Risiko Strategik

  1. Sumber isyarat transaksi tunggal, isyarat jarang, mudah kehilangan bil.

  2. Dalam kes ini, terdapat masalah dengan purata bergerak dan kemungkinan kehilangan peluang jangka pendek.

  3. Pengaturan tracking stop loss yang tidak betul mungkin menyebabkan stop loss terlalu awal atau terlalu besar.

  4. Tetapan parameter yang tidak betul boleh menyebabkan transaksi maya terlalu kerap dan menjejaskan kesan cakera keras.

  5. Pelbagai jenis dan keadaan pasaran memerlukan penyesuaian parameter, dan pengoptimuman lebih sukar.

  6. Anda boleh memperkaya sumber isyarat dengan menambah penghakiman indikator lain atau memperkenalkan model pembelajaran mesin. Anda boleh menyesuaikan jenis dan parameter purata bergerak untuk mencapai kesan perapisan yang optimum. Anda boleh menetapkan titik berhenti dengan berhati-hati dan melepaskannya dengan betul untuk mendapatkan lebih banyak keuntungan.

Arah pengoptimuman strategi

  1. Menambah penilaian indikator teknikal lain, seperti Brinband, KD dan lain-lain, untuk memperkayakan isyarat perdagangan.

  2. Menggunakan model pembelajaran mesin untuk memproses keputusan isyarat.

  3. Mengoptimumkan parameter purata bergerak untuk mencari kombinasi parameter terbaik.

  4. Mengoptimumkan parameter pengesanan berhenti, mengimbangi stop loss dan keuntungan.

  5. Tambah fungsi pengoptimuman parameter untuk mencari parameter optimum secara automatik.

  6. Templat parameter eksklusif untuk pelbagai jenis.

  7. Membangunkan rangka kerja pengukuran kuantitatif dan strategi iterasi pantas.

ringkaskan

Strategi ini membuat keputusan isyarat perdagangan berdasarkan persilangan harga dan harga tinggi, menggunakan teknologi purata bergerak untuk menyaring kebisingan. Ia boleh menyesuaikan parameter secara fleksibel, mencapai pelbagai kesan. Ia mempunyai kelebihan tertentu, tetapi juga mempunyai beberapa masalah, seperti isyarat yang sedikit, ketinggalan, dan lain-lain.

Kod sumber strategi
/*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 ===