Strategi crossover rata-rata bergerak ganda dengan rata-rata bergerak multi-tipe

Penulis:ChaoZhang, Tanggal: 2023-09-19
Tag:

Gambaran umum

Strategi ini menghasilkan sinyal perdagangan dengan menghitung crossover dari berbagai jenis moving average, menerapkan crossover MA ganda panjang dan pendek.

Logika Strategi

  1. Hitung dua MA: MA1 dan MA2, yang dapat memilih dari SMA, EMA, VWMA dll. Panjangnya dapat disesuaikan.

  2. Tentukan persilangan MA: pergi panjang ketika MA1 melintasi atas MA2, posisi dekat ketika MA1 melintasi di bawah MA2.

  3. (Opssional) Hitung MA ketiga - MA3, biasanya dengan periode yang lebih lama seperti 50. Di atas MA3 adalah uptrend, di bawahnya adalah downtrend. Hanya berdagang ketika harga melanggar MA3.

  4. Gabungkan aturan dengan waktu backtest untuk menghasilkan sinyal perdagangan.

  5. Isi warna pada area silang untuk bantuan visual.

Strategi ini menggabungkan trend mengikuti MA dan crossover panjang/pendek, dengan MA ketiga untuk pengendalian risiko.

Analisis Keuntungan

  1. Dual MA crossover secara efektif mengikuti tren.

  2. Mendukung beberapa kombinasi jenis MA, dapat dioptimalkan untuk periode yang berbeda.

  3. MA ketiga mengendalikan risiko dan mengurangi kerugian yang tidak perlu.

  4. Bantuan visual meningkatkan pengalaman perdagangan grafik.

  5. Parameter yang dapat disesuaikan dapat dioptimalkan untuk siklus yang berbeda.

  6. Logika sederhana dan jelas, mudah dimengerti dan diikuti.

Analisis Risiko

  1. Dual MA berjuang dengan rentang terikat dan skenario pembalikan tren. dapat ditingkatkan melalui optimasi parameter.

  2. Dual MA dapat menghasilkan sinyal palsu atau reaksi berlebihan kadang-kadang.

  3. MA ketiga mungkin melewatkan peluang tren yang kuat. dapat menguji memperpendek periode untuk menangkap lebih banyak keuntungan.

  4. Tidak bisa menjamin kemenangan untuk setiap perdagangan, perlu manajemen stop loss yang tepat.

Arahan Optimasi

  1. Uji jenis dan periode MA yang berbeda untuk pasangan parameter terbaik.

  2. Mengoptimalkan periode MA ketiga untuk menyeimbangkan pengendalian risiko dan penangkapan keuntungan.

  3. Tambahkan strategi stop loss untuk mengontrol jumlah kerugian perdagangan tunggal.

  4. Pertimbangkan algoritma pembelajaran mesin untuk menemukan parameter optimal berdasarkan data besar.

  5. Gabungkan dengan indikator lain seperti KD, MACD untuk penyaringan sinyal dan konfirmasi.

Ringkasan

Strategi crossover rata-rata bergerak ganda ini dengan multi-tipe MAs menggabungkan trend berikut, pengendalian risiko, optimasi parameter, bantuan visual dan banyak lagi. Dengan pengujian dan optimasi berkelanjutan, memperkenalkan indikator lain atau pembelajaran mesin dll, ini dapat beradaptasi dengan lebih baik dengan pasar dan memiliki nilai praktis yang besar. Singkatnya, ini adalah strategi yang sederhana, praktis dan mudah dioptimalkan, menjadikannya titik awal yang bagus untuk perdagangan algoritmik.


/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 22:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HAMIDBOX

//@version=4
strategy("Multi-X by HAMID-BOX", overlay=true)

maType(source , length, type)   =>
    type    == "SMA"            ? sma(source , length)  :
     type   == "EMA"            ? ema(source , length)  :
     type   == "RMA"            ? rma(source, length)   : 
     type   == "WMA"            ? wma(source, length)   :
     type   == "VWMA"           ? vwma(source, length)  :
     na
     
////////////////////////////////////////////////////////////////////////////////
colorup             = #11ff00
colordn             = #e91e63

/////////////////////////// MOVING AVERAGE №1 INPUTS ///////////////////////////
ma1_show            = input(title="MA №1", defval=true, type=input.bool, inline="ma1")
ma1type             = input(title="", defval="EMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma1")
ma1src              = input(title="", defval=close, type=input.source, inline="ma1")
ma1Len              = input(title="", defval=9, type=input.integer, inline="ma1")
ma1col              = input(colorup, "", type=input.color, inline="ma1")

ma1                 = maType(ma1src, ma1Len, ma1type)

ma1p = plot(ma1_show ? ma1 : na, linewidth=1, color=color.new(ma1col , 50))

/////////////////////////// MOVING AVERAGE №2 INPUTS ///////////////////////////
ma2_show            = input(title="MA №2", defval=true, type=input.bool, inline="ma2")
ma2type             = input(title="", defval="SMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma2")
ma2src              = input(title="", defval=close, type=input.source, inline="ma2")
ma2Len              = input(title="", defval=21, type=input.integer, inline="ma2")
ma2col              = input(colordn, "", type=input.color, inline="ma2")

ma2                 = maType(ma2src, ma2Len, ma2type)

ma2p = plot(ma2_show ? ma2 : na, linewidth=1, color=color.new(ma2col , 50))

/////////////////////////// MOVING AVERAGE №3 INPUTS ///////////////////////////

read                = input(title="For Safe Side = Read This >>>", defval=true, tooltip="If you want to play on the safe side, Check ON Moving Average № 3, MA №3 shows the major trend, its work as a Trend-Zone,\nRule: Do not open trades if the market is below MA № 3, WHY? because Trend is Bearish and it will make more Down, NOTE:: It is possible after adding MA № 3, it will give you a small profit. But the great advantage of that, it will reduce your loss and it will also increase your Profit Factor.\nAnd if you not have any issue with Risk then you can Leave Moving Average No 3")
ma3_show            = input(title="MA №3", defval=false, type=input.bool, inline="ma3")
ma3type             = input(title="", defval="SMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma3")
// ma3srcH          = input(title="", defval=high, type=input.source, inline="ma3")
// ma3srcL          = input(title="", defval=low, type=input.source, inline="ma3")
ma3Len              = input(title="", defval=50, type=input.integer, inline="ma3")
ma3col              = input(colordn, "", type=input.color, inline="ma3")

ma3H                = maType(high, ma3Len, ma3type)
ma3L                = maType(low, ma3Len, ma3type)

ma3p                = plot(ma3_show ? ma3H : na, linewidth=1, color=color.new(ma3col , 50))
ma3p2               = plot(ma3_show ? ma3L : na, linewidth=1, color=color.new(ma3col , 50))

Bigcross_zone_color = if ma3_show and close > ma3H
    color.new(colorup , 90)
else
    if ma3_show and close < ma3L
        color.new(colordn , 90)
fill(ma3p , ma3p2, color=Bigcross_zone_color, title="Cross Background Color")

BigCrossSignal      = close > ma3H
ZoneCrossover       = crossover(close , ma3H)
///////////////////////////// BACK TESTING INPUTS //////////////////////////////
startTime           = input(title="Start Time", type=input.time, defval= timestamp("01 Jan 2021"))
endTime             = input(title="End Time", type=input.time, defval= timestamp("01 Jan 2100"))
inDateRange         = true

//////////////////////////// PLOTING AND COOLORING /////////////////////////////
Cross               = input(true, "Cross Sign ON/OFF") 
maCrossOver         = crossover(ma1 , ma2)
maCrossUnder        = crossunder(ma1 , ma2)
cross_zone_color    = ma1 > ma2 ? color.new(colorup , 85) : color.new(colordn , 85)

plotshape(Cross ? maCrossOver : na, title="CrossUP Sign", style=shape.triangleup, location=location.belowbar, color=color.white, size=size.tiny)
plotshape(Cross ? maCrossUnder : na, title="CrossDN Sign", style=shape.xcross, location=location.abovebar, color=#e91e63, size=size.tiny)

fill(ma1p , ma2p, color=cross_zone_color, title="Cross Background Color")

///////////////////////////////// (CONDITIONS) /////////////////////////////////

if maCrossOver and inDateRange
    if ma3_show
        strategy.entry("BUY", strategy.long, when=BigCrossSignal)
    else    
        strategy.entry("BUY", strategy.long)

if  ma3_show
    strategy.entry("BUY", strategy.long, when=ZoneCrossover)

if maCrossUnder and inDateRange
    strategy.close("BUY", comment="Exit")
if (not inDateRange)
    strategy.close_all()





Lebih banyak