Sistem Penembusan Periode silang

Penulis:ChaoZhang, Tanggal: 2023-11-22 15:22:49
Tag:

img

Gambaran umum

Ini adalah strategi perdagangan kuantitatif yang memanfaatkan moving average dan indikator MACD untuk operasi terobosan di kedua arah.

Prinsip Strategi

Strategi ini menggunakan 3 SMMA moving average dengan panjang yang berbeda dan 1 EMA moving average untuk menentukan arah tren. Pada saat yang sama, ini menggabungkan indikator MACD untuk menilai tren jangka pendek dan peluang masuk. Secara khusus, kondisi pemicu beli adalah: harga menembus semua moving average ke atas, dan rata-rata yang lebih pendek berada di atas yang lebih panjang; sementara kondisi pemicu jual adalah sebaliknya, harga menembus semua moving average ke bawah, dan rata-rata yang lebih pendek berada di bawah yang lebih panjang.

Hal ini dapat dilihat bahwa strategi ini memanfaatkan moving average untuk menilai arah tren jangka menengah dan panjang, dan MACD untuk menangkap peluang masuk yang lebih baik dengan menilai pembalikan jangka pendek.

Analisis Keuntungan

Keuntungan dari operasi lintas periode ini adalah bahwa ia dapat memilih titik pembalikan jangka pendek yang cocok untuk memasuki arah tren kemungkinan tinggi, sehingga memperoleh rasio risiko-manfaat yang lebih baik.

  1. Rata-rata 3 SMMA ditambah 1 EMA line multi-level filtering dapat secara efektif menentukan arah tren jangka menengah dan panjang untuk menghindari perdagangan melawan tren.

  2. Indikator MACD menilai titik pembalikan jangka pendek untuk masuk dapat memperoleh tingkat harga masuk yang lebih baik.

  3. Hubungan urutan rata-rata bergerak yang ketat sebagai kondisi penyaringan dapat mengurangi kemungkinan kesalahan operasi.

Analisis Risiko

Risiko utama dari strategi ini adalah:

  1. Rata-rata bergerak sendiri memiliki sifat keterlambatan yang lebih besar, yang dapat melewatkan peluang pembalikan tren jangka pendek.

  2. Indikator MACD cenderung menghasilkan sinyal palsu dan perlu disaring dalam kombinasi dengan tingkat harga.

  3. Penghakiman beberapa kerangka waktu meningkatkan kompleksitas strategi dan rentan terhadap kegagalan.

Untuk mengatasi risiko 1 dan risiko 2, kita dapat mengoptimalkan dengan memperpendek rata-rata bergerak dan siklus sinyal dengan tepat untuk merespons dengan cepat pembalikan tren jangka pendek. Untuk risiko 3, kita perlu mengoptimalkan dan menguji untuk berbagai varietas dan siklus untuk menyesuaikan secara ketat parameter strategi dengan karakteristik varietas tersebut.

Arahan Optimasi

Aspek utama yang dapat dioptimalkan strategi ini meliputi:

  1. Mengoptimalkan parameter rata-rata bergerak dan MACD agar sesuai dengan karakteristik siklus dan varietas yang berbeda.

  2. Meningkatkan strategi stop loss menggunakan ATR atau indikator lain untuk menetapkan stop bergerak yang wajar.

  3. Carilah indikator atau metode penyaringan yang lebih baik untuk menggantikan sinyal MACD. Misalnya, perkenalkan indikator volatilitas dan saring sinyal sesuai.

  4. Uji hubungan rasio laba rugi yang berbeda untuk mendapatkan kombinasi parameter dengan rasio risiko-manfaat yang lebih baik.

Ringkasan

Secara umum, ini adalah sistem terobosan yang unik dengan pemikiran cross-timeframe. Ini memanfaatkan keuntungan dari kedua rata-rata bergerak dan MACD untuk mencapai strategi operasi penilaian bersama di beberapa kerangka waktu. Dengan mengoptimalkan dan menyesuaikan parameter dan kriteria penyaringan, strategi ini dapat menjadi solusi perdagangan kuantitatif yang sangat praktis.


/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © SoftKill21

//@version=4
strategy("Koala Script",initial_capital=1000, 
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.000065,
     slippage=3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
 


startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)




len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len

len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2

len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3

len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4  : (smma4[1] * (len4 - 1) + src4) / len4

len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)

timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")

time_cond = time >= startDate and time <= finishDate and londonEntry

fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)


// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond

length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)

oa=input(false, title="Show actual ATR")

ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))

tp=input(300,title="tp")
sl=input(300,title="sl")


//tp = s*10000
//sl= s*10000



//if(tp>300)
//    tp:=300
//if(sl>300)
//    sl:=300
//if(sl<150)
//    sl:=150
//if(tp<150)
//    tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100           //risk % per trade


    //Calculate the size of the next trade
temp01 = balance * risk     //Risk in USD
temp02 = temp01/sl        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 10000)
    size := 10000           //Set min. lot size



strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)

strategy.close_all(when = not london)

maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)

Lebih banyak