Strategi perdagangan rata-rata bergerak spektrum luas yang bergolak

Penulis:ChaoZhang, Tanggal: 2024-01-25 14:19:27
Tag:

震荡型广谱移动平均线交易策略

Pengamatan

Strategi ini didasarkan pada rata-rata bergerak spektrum luas, yang membentuk sinyal perdagangan dengan menggunakan garpu emas dari rata-rata bergerak lambat. Rata-rata bergerak spektrum luas mencakup berbagai jenis dari rata-rata bergerak sederhana hingga rata-rata bergerak bergoyang, yang dapat disesuaikan dengan kombinasi bebas dengan parameter, dan memiliki daya adaptasi yang kuat.

Prinsip Strategi

Strategi ini menggunakan fungsi rata-rata bergerak variabel untuk menghasilkan 12 jenis rata-rata bergerak yang berbeda. Prinsip dasarnya adalah menghitung dua rata-rata bergerak (Close MA) dan Slow MA (Open MA), yang menghasilkan sinyal beli ketika garis cepat melintasi garis lambat, dan sinyal jual ketika garis cepat melintasi garis lambat.

Logika kunci adalah menghasilkan dua rata-rata bergerak dengan fungsi varian:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)danopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)Fungsi varian mengemas 12 jenis metode perhitungan rata-rata yang dapat dipilih secara bebas melalui parameter basisType.

Logika pembuatan sinyal perdagangan dasar adalah:longCond = xlongdanshortCond = xshortJika Anda menggunakan jalur cepat, Anda akan melakukan lebih banyak, dan jika Anda menggunakan jalur lambat, Anda akan melakukan lebih banyak.

Aturan masuk strategi adalah melakukan over-doing ketika kondisi longcond atau shortcond terpenuhi. Aturan stop-loss atau stop-gap adalah ketika pergerakan harga mencapai titik stop-loss atau stop-gap yang ditetapkan.

Analisis Keunggulan

Keuntungan terbesar dari strategi ini adalah bahwa Anda dapat secara bebas menggabungkan berbagai jenis rata-rata bergerak. Dengan siklus pasar yang berbeda, tidak diketahui mana yang paling cocok, strategi ini memberikan kemampuan kustomisasi yang kuat. Pengguna dapat mengidentifikasi kombinasi parameter terbaik melalui pengujian berulang, sehingga membuat strategi yang paling optimal untuk pasar tertentu.

Keuntungan lain adalah logika kebijakan sederhana dan jelas, namun memberikan fungsi yang kuat. Pengguna mudah memahami dan menggunakan kebijakan. Pada saat yang sama, parameter input yang kaya juga memberikan ruang optimasi yang cukup bagi pengguna tingkat lanjut.

Analisis Risiko

Risiko terbesar dari strategi ini adalah bahwa ada beberapa keterlambatan pada rata-rata bergerak spektrum luas itu sendiri. Ini dapat menyebabkan kerugian yang lebih besar ketika terjadi penembusan harga yang tidak biasa. Selain itu, jika parameter dipilih dengan tidak benar, itu juga dapat menyebabkan frekuensi perdagangan yang terlalu tinggi atau menghasilkan sinyal yang berlebihan.

Untuk mengurangi risiko, dianjurkan untuk menggabungkan indikator lain untuk menilai efektivitas sinyal dan menghindari terjadinya terobosan palsu. Selain itu, optimasi parameter dan retesting juga sangat penting, dan perlu pengujian berulang untuk menemukan kombinasi parameter terbaik.

Optimasi arah

Strategi ini memiliki beberapa arah utama untuk mengoptimalkan:

  1. Uji lebih banyak jenis kombinasi rata-rata bergerak untuk menemukan kombinasi terbaik
  2. Menambahkan filter untuk menghindari sinyal palsu, misalnya dengan indikator volume transaksi
  3. Mengoptimalkan parameter panjang rata-rata bergerak untuk menemukan parameter yang optimal
  4. Optimalkan ukuran posisi dan parameter stop loss stop loss
  5. Cobalah varietas dan siklus yang berbeda

Dengan mengoptimalkan beberapa arah di atas, kinerja real-time dari strategi dapat terus meningkat.

Pengamatan

Strategi trading ini sangat fleksibel berdasarkan rata-rata bergerak spektrum luas. Strategi ini menawarkan kemampuan kustomisasi yang kuat, pengguna bebas memilih dan menggabungkan berbagai jenis rata-rata. Strategi logika sederhana, jelas, dan mudah digunakan, tetapi juga memberikan ruang optimasi yang luas. Strategi ini dapat beradaptasi dengan lingkungan pasar yang berbeda dan mendapatkan keuntungan yang stabil melalui optimasi parameter dan pengendalian risiko.


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

//@version=4
//

strategy(title="Long/Short", shorttitle="Banana Maker", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_every_tick=false)



// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution?")
intRes = input(defval=7, title="Multiplier for Alernate Resolution")
stratRes = timeframe.ismonthly ? tostring(timeframe.multiplier * intRes, "###M") : 
   timeframe.isweekly ? tostring(timeframe.multiplier * intRes, "###W") : 
   timeframe.isdaily ? tostring(timeframe.multiplier * intRes, "###D") : 
   timeframe.isintraday ? tostring(timeframe.multiplier * intRes, "####") : '60'
basisType = input(defval="DEMA", title="MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen = input(defval=8, 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)
scolor = input(false, title="Show coloured Bars to indicate Trend?")
delayOffset = input(defval=0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType = input("BOTH", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #6ad279
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
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 = 0.0
    sma_1 = sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[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
    v11 = sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    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 : type == "TMA" ? v11 : type == "SSMA" ? v12 : v1

// security wrapper for repeat calls* NEEDS REFINEMENT- backtesting this shows repaint. need new wrapper
reso(exp, use, res) =>
    security_1 = security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp



// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// alt resulution 
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title="Bar Colours")
closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
openP = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//

//
// === ALERT conditions

xlong = crossover(closeSeriesAlt, openSeriesAlt)
xshort = crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open


// === /ALERT conditions. needs work in study mode. the banana maker is the study script. 
// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
//shunt = 0
//c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
//plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)

//Repaint city, study mode will help but wont trigger the alerts


// === STRATEGY ===
// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)
// Include bar limiting algorithm
ebar = input(defval=1000, title="Number of Bars for Back Testing", minval=0)
dummy = input(false, title="- SET to ZERO for Daily or Longer Timeframes")
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : 
   timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : 
   timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : 
   tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != "NONE"
    strategy.entry("long", strategy.long, when=longCond == true and tradeType != "SHORT")
    strategy.entry("short", strategy.short, when=shortCond == true and tradeType != "LONG")
    strategy.close("long", when=shortCond == true and tradeType == "LONG")
    strategy.close("short", when=longCond == true and tradeType == "SHORT")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)



// === /STRATEGY ===
// eof


Informasi lebih lanjut