Strategi Perdagangan Rata-rata Bergerak Ganda

Penulis:ChaoZhang, Tanggal: 2024-02-29 14:32:29
Tag:

img

Gambaran umum

Strategi ini disebut Multiple Moving Average Trading Strategy. Strategi ini menggunakan crossover dari indikator MACD dan beberapa moving average sebagai sinyal perdagangan, dengan bantuan indikator ZLSMA untuk menentukan tren, dan menetapkan profit-taking dan stop-loss exit logic untuk mewujudkan trading otomatis.

Prinsip Strategi

  1. Menghitung garis cepat, garis lambat dan histogram MACD dari indikator MACD. Tetapkan panjang ketika melihat salib emas dan pendek ketika melihat salib kematian.

  2. Menghitung rata-rata bergerak 5 hari, 25 hari, 45 hari dan 100 hari.

  3. Hitung jarak antara dua kelompok rata-rata bergerak. Jika jarak melebihi ambang batas tertentu, ini berarti divergensi rata-rata bergerak, yang dapat ditetapkan sebagai sinyal perdagangan.

  4. Menghitung indikator ZLSMA, yang mewakili arah tren harga jangka menengah hingga panjang. Pembalikan tren dapat ditentukan ketika ZLSMA membentuk titik balik.

  5. Gabungkan crossover MACD, sinyal divergensi rata-rata bergerak dan penilaian tren ZLSMA untuk menetapkan strategi perdagangan panjang dan pendek.

  6. Tetapkan titik mengambil keuntungan dan stop loss untuk mewujudkan logika keluar otomatis.

Analisis Keuntungan

  1. Sinyal multi-filter meningkatkan efisiensi strategi. MACD dan sinyal divergensi rata-rata bergerak dapat memverifikasi satu sama lain untuk menghindari breakout palsu.

  2. ZLSMA membantu dalam menentukan arah tren jangka menengah dan panjang untuk menghindari perdagangan melawan tren.

  3. Keluar otomatis dengan menetapkan titik pengambilan keuntungan dan stop loss mengurangi frekuensi intervensi manusia.

Analisis Risiko

  1. Pengaturan parameter yang tidak benar dapat menyebabkan over-trading atau order yang hilang. Parameter perlu dioptimalkan untuk hasil terbaik.

  2. Titik profit-taking dan stop-loss yang tetap membatasi potensi keuntungan atau meningkatkan kerugian.

  3. Strategi rata-rata bergerak tidak bekerja dengan baik di pasar yang terikat rentang.

Arahan Optimasi

  1. Mengoptimalkan kombinasi parameter rata-rata bergerak dengan menguji rata-rata bergerak panjang yang berbeda.

  2. Uji dengan menambahkan indikator lain seperti KDJ dan BOLL untuk menentukan titik masuk dan keluar.

  3. Cobalah strategi stop loss dinamis berdasarkan ukuran volatilitas.

  4. Tambahkan model pembelajaran mesin untuk menemukan parameter optimal secara otomatis.

Kesimpulan

Strategi ini mengintegrasikan MACD, beberapa rata-rata bergerak dan penentuan tren ZLSMA untuk mencapai perdagangan otomatis. Dengan menyaring dengan beberapa sinyal, stabilitas strategi ditingkatkan; dengan mengatur logika keluar, risiko dikurangi. Ada nilai praktis tertentu untuk perdagangan nyata. Optimasi parameter berikutnya, perluasan indikator, berhenti dinamis dll dapat lebih meningkatkan kinerja strategi.


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

//@version=5
strategy("MACD ZLSMA_izumi⑤(4つの条件、MCDがクロスしてたら)", overlay=true)

fast_length = input(title = "Fast Length", defval = 12)
slow_length = input(title = "Slow Length", defval = 26)
src = input(title = "Source", defval = close)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')

hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist, title = "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plot(macd,   title = "MACD",   color = #2962FF)
plot(signal, title = "Signal", color = #FF6D00)

//MACDクロス設定
enterLong = ta.crossover(macd, signal)
enterShort = ta.crossunder(macd, signal)

//移動平均線の期間を設定
ema5 = input(5, title="ma期間5")
ema25 = input(25, title="ma期間25")
ema45 = input(45, title="ma期間45")
ema100 = input(100, title="ma期間100")

//移動平均線を計算
//sma関数で「ema25」バー分のcloseを移動平均線として「Kema」に設定
Kema5 = ta.sma(close,ema5)
Kema25 = ta.sma(close,ema25)
Kema45 = ta.sma(close,ema45)
Kema100 = ta.sma(close,ema100)



//移動平均線をプロット
plot(Kema5, color=color.rgb(82, 249, 255),title="ema5")
plot(Kema25, color=color.red,title="ema25")
plot(Kema45, color=color.blue,title="ema45")
plot(Kema100, color=color.green,title="ema100")

//ema同士の距離が30以上の時に「distancOK」にTureを返す
//distance1 = math.abs(Kema5-Kema25)
distance2 = math.abs(Kema25-Kema45)
distanceValue1 = input(0.030, title ="ema同士の乖離値") 
//distanceOk1 = distance1 > distanceValue1
distanceOk2 = distance2 > distanceValue1

//2区間のema同士の距離が30以上の時に「distanceOKK」にTrueを返す
//distanceOkK1 = distanceOk1 and distanceOk2
distanceOkK1 = distanceOk2

//5EMAとロウソクの乖離判定
//DistanceValue5ema = input(0.03, title ="5emaとロウソクの乖離率")
//emaDistance = math.abs(Kema5 - close)
//emaDistance5ema = emaDistance < DistanceValue5ema

//ZLSMA追加のコード
length = input.int(32, title="Length")
offset = input.int(0, title="offset")
src2 = input(close, title="Source")
lsma = ta.linreg(src2, length, offset)
lsma2 = ta.linreg(lsma, length, offset)
eq= lsma-lsma2
zlsma = lsma+eq
//ZLSMAのプロット
plot(zlsma, color=color.yellow, linewidth=3)

//ZLSMAの前回高値を検索
//var float zlsmaHigh = na
//var float zlsmaHighValue = na
//if ta.highest(zlsma,35) == zlsma[3]
//    zlsmaHighValue := zlsmaHigh
//    zlsmaHigh := zlsma[3]

//if (na(zlsmaHighValue))
 //   zlsmaHighValue := zlsmaHigh

//ZLSMAの前回安値を検索
//var float zlsmaLow = na
//var float zlsmaLowValue = na
//if ta.lowest(zlsma,35) == zlsma[3]
//    zlsmaLowValue := zlsmaLow
//    zlsmaLow := zlsma[3]

///if (na(zlsmaLowValue))
//    zlsmaLowValue := zlsmaLow

//利確・損切りポイントの初期化(変数の初期化)
var longProfit = 0.0
var longStop = 0.0
var shortProfit = 0.0
var shortStop = 0.0

//inputで設定画面の選択項目を設定
longProfitValue = input(0.06, title ="ロング利確pips")
shortProfitValue = input(-0.06, title ="ショート利確pips")
longStopValue = input(-0.06, title ="ロング損切pips")
shortStopValue = input(0.06, title ="ショート損切pips")

// クロスの強さを推定 
//angleThreshold = input(0.001, title = "クロスの強さ調節" )

// クロスの強さの閾値、この値を調整してクロスの強さの基準を変える 
//macdDiff = macdLine - signalLine 
//strongCross = math.abs(macdDiff) > angleThreshold 

// エントリー条件 (MACDラインとシグナルラインがクロス)
//ta.crossover(macdLine, signalLine) and strongCross 


//ロングエントリー条件
if  distanceOkK1 and enterLong
	strategy.entry("long", strategy.long, comment="long")
    longProfit := close + longProfitValue
    longStop := close + longStopValue

//    if na(strategy.position_avg_price) and close>strategy.position_avg_price + 0.05 * syminfo.mintick 
 //       longStop := strategy.position_avg_price + 10 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)

strategy.exit("exit", "long", limit = longProfit,stop = longStop)


if  distanceOkK1 and enterShort
	strategy.entry("short", strategy.short, comment="short")
    shortProfit := close + shortProfitValue
    shortStop := close + shortStopValue

 //   if na(strategy.position_avg_price) and close>strategy.position_avg_price - 0.05 * syminfo.mintick 
  //      shortStop := strategy.position_avg_price - 0.1 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)


strategy.exit("exit", "short", limit = shortProfit,stop = shortStop)
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Lebih banyak