Sistem Penembusan Tempoh Salib

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

img

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggunakan purata bergerak dan penunjuk MACD untuk operasi terobosan dalam kedua-dua arah. Ia mempunyai ciri operasi lintas tempoh, iaitu, menilai arah trend pada bingkai masa yang lebih lama dan mencari peluang pada bingkai masa yang lebih pendek.

Prinsip Strategi

Strategi ini menggunakan 3 purata bergerak SMMA dengan panjang yang berbeza dan 1 purata bergerak EMA untuk menentukan arah trend. Pada masa yang sama, ia menggabungkan penunjuk MACD untuk menilai trend jangka pendek dan peluang kemasukan. Khususnya, keadaan pencetus beli adalah: harga menembusi semua purata bergerak ke atas, dan purata yang lebih pendek berada di atas yang lebih lama; sementara keadaan pencetus jual adalah sebaliknya, harga menembusi semua purata bergerak ke bawah, dan purata yang lebih pendek berada di bawah yang lebih lama.

Ia dapat dilihat bahawa strategi ini menggunakan purata bergerak untuk menilai arah trend jangka menengah dan panjang, dan MACD untuk menangkap peluang kemasukan yang lebih baik dengan menilai pembalikan jangka pendek.

Analisis Kelebihan

Kelebihan operasi lintas tempoh ini adalah bahawa ia boleh memilih titik pembalikan jangka pendek yang sesuai untuk memasuki arah trend kebarangkalian tinggi, dengan itu mendapatkan nisbah risiko-balasan yang lebih baik.

  1. 3 purata SMMA ditambah penapisan pelbagai peringkat garis EMA dapat menentukan arah trend jangka sederhana dan panjang dengan berkesan untuk mengelakkan perdagangan terhadap trend.

  2. Penunjuk MACD menilai titik pembalikan jangka pendek untuk memasuki boleh mendapatkan tahap harga kemasukan yang lebih baik.

  3. Hubungan urutan purata bergerak yang ketat sebagai keadaan penapisan dapat mengurangkan kebarangkalian kesalahan operasi.

Analisis Risiko

Risiko utama strategi ini ialah:

  1. Purata bergerak sendiri mempunyai sifat ketinggalan yang lebih besar, yang mungkin terlepas peluang pembalikan trend jangka pendek.

  2. Indikator MACD cenderung menghasilkan isyarat palsu dan perlu disaring dalam kombinasi dengan tahap harga.

  3. Penghakiman pelbagai jangka masa meningkatkan kerumitan strategi dan cenderung gagal.

Untuk menangani risiko 1 dan risiko 2, kita boleh mengoptimumkan dengan memendekkan purata bergerak dan kitaran isyarat dengan tepat untuk bertindak balas dengan cepat terhadap pembalikan trend jangka pendek. Untuk risiko 3, kita perlu mengoptimumkan dan menguji untuk pelbagai jenis dan kitaran untuk menyesuaikan parameter strategi dengan ciri-ciri jenis itu.

Arahan pengoptimuman

Aspek utama yang boleh dioptimumkan strategi ini termasuk:

  1. Mengoptimumkan parameter purata bergerak dan MACD untuk paling sesuai dengan ciri-ciri kitaran dan jenis yang berbeza.

  2. Meningkatkan strategi stop loss menggunakan ATR atau penunjuk lain untuk menetapkan berhenti bergerak yang munasabah. Ini dapat meningkatkan kawalan risiko strategi dengan ketara.

  3. Cari penunjuk atau kaedah penapisan yang lebih baik untuk menggantikan isyarat MACD. Sebagai contoh, memperkenalkan penunjuk turun naik dan penapisan isyarat dengan sewajarnya.

  4. Uji hubungan nisbah keuntungan dan kerugian yang berbeza untuk mendapatkan kombinasi parameter dengan nisbah risiko-balasan yang lebih baik.

Ringkasan

Secara umum, ini adalah sistem terobosan yang unik dengan pemikiran jangka masa silang. Ia menggunakan kelebihan kedua-dua purata bergerak dan MACD untuk mencapai strategi operasi penghakiman bersama di pelbagai jangka masa. Dengan mengoptimumkan dan menyesuaikan parameter dan kriteria penapisan, strategi ini boleh menjadi penyelesaian perdagangan kuantitatif yang sangat praktikal.


/*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 lanjut