Strategi Dagangan Purata Bergerak Berganda

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

img

Ringkasan

Strategi ini dinamakan Strategi Dagangan Purata Bergerak Berbilang. Ia menggunakan persilangan penunjuk MACD dan purata bergerak berbilang sebagai isyarat perdagangan, dengan bantuan penunjuk ZLSMA untuk menentukan trend, dan menetapkan logik mengambil keuntungan dan berhenti kerugian untuk merealisasikan perdagangan automatik.

Prinsip Strategi

  1. Mengira garis pantas, garis perlahan dan histogram MACD penunjuk MACD. Tetapkan panjang apabila melihat salib emas dan pendek apabila melihat salib kematian.

  2. Hitung purata bergerak 5 hari, 25 hari, 45 hari dan 100 hari.

  3. Hitung jarak antara dua kumpulan purata bergerak. Jika jarak melebihi ambang tertentu, ini bermakna perbezaan purata bergerak, yang boleh ditetapkan sebagai isyarat perdagangan.

  4. Mengira penunjuk ZLSMA, yang mewakili arah trend harga jangka menengah hingga panjang. Pembalikan trend boleh ditentukan apabila ZLSMA membentuk titik perubahan.

  5. Gabungkan silang MACD, isyarat perbezaan purata bergerak dan penilaian trend ZLSMA untuk menetapkan strategi perdagangan panjang dan pendek.

  6. Tetapkan mengambil keuntungan dan berhenti kehilangan titik untuk merealisasikan logik keluar automatik.

Analisis Kelebihan

  1. Isyarat pelbagai penapis meningkatkan kecekapan strategi. Isyarat divergensi purata bergerak dan MACD boleh mengesahkan antara satu sama lain untuk mengelakkan pecah palsu.

  2. ZLSMA membantu menentukan arah trend jangka sederhana dan panjang untuk mengelakkan perdagangan menentang trend.

  3. Keluar automatik dengan menetapkan titik mengambil keuntungan dan berhenti kehilangan mengurangkan kekerapan campur tangan manusia.

Analisis Risiko

  1. Tetapan parameter yang tidak betul boleh menyebabkan perdagangan berlebihan atau pesanan yang hilang. Parameter perlu dioptimumkan untuk hasil yang terbaik.

  2. Titik mengambil keuntungan dan stop-loss tetap mengehadkan potensi keuntungan atau meningkatkan kerugian.

  3. Strategi purata bergerak tidak berfungsi dengan baik di pasaran yang terikat julat.

Arahan pengoptimuman

  1. Mengoptimumkan kombinasi parameter purata bergerak dengan menguji purata bergerak panjang yang berbeza.

  2. Ujian dengan menambah penunjuk lain seperti KDJ dan BOLL untuk menentukan titik masuk dan keluar.

  3. Cuba strategi stop loss dinamik berdasarkan ukuran turun naik.

  4. Tambah model pembelajaran mesin untuk mencari parameter optimum secara automatik.

Kesimpulan

Strategi ini mengintegrasikan MACD, purata bergerak berbilang dan penentuan trend ZLSMA untuk mencapai perdagangan automatik. Dengan menapis dengan pelbagai isyarat, kestabilan strategi ditingkatkan; dengan menetapkan logik keluar, risiko dikurangkan. Terdapat nilai praktikal tertentu untuk perdagangan sebenar. Pengoptimuman parameter berikutnya, pengembangan penunjuk, berhenti dinamik dan lain-lain dapat meningkatkan prestasi 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 lanjut