Strategy Crossover Sebelas Purata Bergerak

Penulis:ChaoZhang, Tarikh: 2024-01-15 13:57:53
Tag:

img

Ringkasan

Strategi ini menggabungkan persilangan 11 jenis purata bergerak yang berbeza untuk entri panjang dan pendek. 11 purata bergerak yang digunakan adalah: Sederhana (SMA), Eksponen (EMA), Bertimbang (WMA), Bertimbang Volume (VWMA), Lencir (SMMA), Eksponen Ganda (DEMA), Eksponen Ganda (TEMA), Hull (HMA), Eksponen Zero Lag (ZEMA), Segitiga (TMA), dan SuperSmoother (SSMA) penapis.

Strategi ini membolehkan anda mengkonfigurasi dua purata bergerak - yang lebih cepat dan yang lebih perlahan, kedua-duanya dipilih dari 11 pilihan. Isyarat panjang dihasilkan apabila MA yang lebih cepat melintasi di atas MA yang lebih perlahan. Isyarat pendek berlaku apabila MA yang lebih cepat melintasi di bawah MA yang lebih perlahan.

Ciri-ciri tambahan termasuk tetapan piramid, mengambil keuntungan dan tahap berhenti kerugian.

Logika Strategi

Logik strategi teras bergantung kepada persilangan antara dua purata bergerak untuk menentukan entri dan keluar.

Syarat kemasukan adalah:

Entri panjang: MA pantas > MA perlahan Catatan ringkas: MA pantas < MA perlahan

Keluar ditentukan oleh salah satu daripada tiga kriteria:

  1. Mengambil tahap keuntungan dicapai
  2. Tahap Stop Loss dicapai
  3. Isyarat bertentangan yang dihasilkan (MA crossover dalam arah bertentangan)

Strategi ini membolehkan mengkonfigurasi parameter utama seperti jenis MA dan panjang, tetapan piramid, mengambil keuntungan dan peratusan stop loss. Ini memberikan fleksibiliti untuk mengoptimumkan strategi untuk keadaan pasaran yang berbeza dan keutamaan risiko.

Kelebihan

  • Menggabungkan 11 jenis MA yang berbeza untuk isyarat yang kukuh
  • Konfigurasi parameter utama yang fleksibel
  • Mengambil keuntungan dan berhenti kehilangan ciri melindungi keuntungan dan had kerugian
  • Pyramiding membolehkan peningkatan saiz kedudukan untuk trend yang kuat

Risiko

  • Seperti mana-mana penunjuk teknikal, persimpangan MA boleh menghasilkan isyarat palsu
  • Pengoptimuman berlebihan untuk keadaan pasaran semasa boleh merosot prestasi masa depan
  • Keluar stop loss yang sukar boleh membawa kepada keluar perdagangan yang baik lebih awal di pasaran yang tidak menentu

Pengurusan risiko boleh dipertingkatkan dengan menggunakan pengesahan tindakan harga untuk isyarat kemasukan, menggunakan hentian belakang dan bukannya hentian keras, dan mengelakkan pengoptimuman berlebihan.

Peluang Peningkatan

Terdapat beberapa cara untuk meningkatkan strategi ini:

  1. Masukkan penapis tambahan sebelum masuk, seperti pemeriksaan tindakan jumlah dan harga
  2. Uji prestasi jenis MA yang berbeza secara sistematik dan pilih 1 atau 2 yang optimum
  3. Mengoptimumkan panjang MA khusus untuk instrumen dagangan dan jangka masa
  4. Gunakan hentian belakang dan bukannya hentian keras
  5. Menambah keuntungan mengambil pada tahap tambahan sebagai trend meluas

Kesimpulan

Strategi crossover 11 purata bergerak menyediakan pendekatan yang sistematik untuk perdagangan crossover. Dengan menggabungkan isyarat merentasi pelbagai penunjuk MA dan membolehkan konfigurasi parameter utama, ia menyediakan kerangka perdagangan yang kukuh namun fleksibel. Penyesuaian halus dan pengurusan risiko akan memainkan peranan penting dalam mengoptimumkan prestasi. Strategi ini mempunyai potensi yang kuat untuk perdagangan berdasarkan momentum tetapi harus disesuaikan untuk persekitaran pasaran yang berbeza.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3

strategy(title = "[STRATEGY] MA Cross Eleven", overlay = true)

// MA - type, source, length

//  MA - type, source, length
//  SMA --> Simple
//  EMA --> Exponential
//  WMA --> Weighted
//  VWMA --> Volume Weighted
//  SMMA --> Smoothed
//  DEMA --> Double Exponential
//  TEMA --> Triple Exponential
//  HMA --> Hull
//  TMA --> Triangular
//  SSMA --> SuperSmoother filter
//  ZEMA --> Zero Lag Exponential

type = input(defval="ZEMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"])
len1 = input(defval=8, title="Fast MA Length", minval=1)
srcclose1 = input(close, "Fast MA Source")
len2 = input(defval=21, title="Slow MA Length", minval=1)
srcclose2 = input(close, "Slow MA Source")

// Returns MA input selection variant, default to SMA if blank or typo.

variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = 0.0
    v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v11 = sma(sma(src,len),len)                                         // Triangular
    // 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
    v9 = 0.0
    v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
    // Zero Lag Exponential
    e = ema(v2, len)
    v10 = v2+(v2-e)
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="SSMA"?v9 : type=="ZEMA"?v10 : type=="TMA"? v11: v1

ma_1 = variant(type, srcclose1, len1)
ma_2 = variant(type, srcclose2, len2)

plot(ma_1, title="Fast MA", color = green, linewidth=2, transp=0)
plot(ma_2, title="Slow MA", color = red, linewidth=2, transp=0)

longCond = na
shortCond = na
longCond := crossover(ma_1, ma_2)
shortCond := crossunder(ma_1, ma_2)

// Count your long short conditions for more control with Pyramiding

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if longCond
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if shortCond
    sectionLongs := 0
    sectionShorts := sectionShorts + 1
    
// Pyramiding Inputs

pyrl = input(1, "Pyramiding")

// These check to see your signal and cross references it against the pyramiding settings above

longCondition = longCond and sectionLongs <= pyrl 
shortCondition = shortCond and sectionShorts <= pyrl 

// Get the price of the last opened long or short

last_open_longCondition = na
last_open_shortCondition = na
last_open_longCondition := longCondition ? high[1] : nz(last_open_longCondition[1])
last_open_shortCondition := shortCondition ? low[1] : nz(last_open_shortCondition[1])

// Check if your last postion was a long or a short

last_longCondition = na
last_shortCondition = na
last_longCondition := longCondition ? time : nz(last_longCondition[1])
last_shortCondition := shortCondition ? time : nz(last_shortCondition[1])

in_longCondition = last_longCondition > last_shortCondition
in_shortCondition = last_shortCondition > last_longCondition

// Take profit

isTPl = input(false, "Take Profit Long")
isTPs = input(false, "Take Profit Short")
tpl = input(3, "Take Profit Long %", type=float)
tps = input(30, "Take Profit Short %", type=float)
long_tp = isTPl and crossover(high, (1+(tpl/100))*last_open_longCondition) and in_longCondition  == 1
short_tp = isTPs and crossunder(low, (1-(tps/100))*last_open_shortCondition) and in_shortCondition == 1 

// Stop Loss

isSLl = input(false, "Stop Loss Long")
isSLs = input(false, "Stop Loss Short")
sl= 0.0
sl := input(3, "Stop Loss %", type=float)
long_sl = isSLl and crossunder(low, (1-(sl/100))*last_open_longCondition) and longCondition == 0 and in_longCondition == 1
short_sl = isSLs and crossover(high, (1+(sl/100))*last_open_shortCondition) and shortCondition == 0 and in_shortCondition == 1

// Create a single close for all the different closing conditions.

long_close = long_tp or long_sl ? 1 : 0
short_close = short_tp or short_sl ? 1 : 0

// Get the time of the last close

last_long_close = na
last_short_close = na
last_long_close := long_close ? time : nz(last_long_close[1])
last_short_close := short_close ? time : nz(last_short_close[1])

// Strategy entries

strategy.entry("long", strategy.long, when=longCondition == true, stop = open[1])
strategy.entry("short", strategy.short, when=shortCondition == true)
strategy.close("long", when = long_sl or long_tp)
strategy.close("short", when = short_sl or short_tp)

Lebih lanjut