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.
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.
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.
3 purata SMMA ditambah penapisan pelbagai peringkat garis EMA dapat menentukan arah trend jangka sederhana dan panjang dengan berkesan untuk mengelakkan perdagangan terhadap trend.
Penunjuk MACD menilai titik pembalikan jangka pendek untuk memasuki boleh mendapatkan tahap harga kemasukan yang lebih baik.
Hubungan urutan purata bergerak yang ketat sebagai keadaan penapisan dapat mengurangkan kebarangkalian kesalahan operasi.
Risiko utama strategi ini ialah:
Purata bergerak sendiri mempunyai sifat ketinggalan yang lebih besar, yang mungkin terlepas peluang pembalikan trend jangka pendek.
Indikator MACD cenderung menghasilkan isyarat palsu dan perlu disaring dalam kombinasi dengan tahap harga.
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.
Aspek utama yang boleh dioptimumkan strategi ini termasuk:
Mengoptimumkan parameter purata bergerak dan MACD untuk paling sesuai dengan ciri-ciri kitaran dan jenis yang berbeza.
Meningkatkan strategi stop loss menggunakan ATR atau penunjuk lain untuk menetapkan berhenti bergerak yang munasabah. Ini dapat meningkatkan kawalan risiko strategi dengan ketara.
Cari penunjuk atau kaedah penapisan yang lebih baik untuk menggantikan isyarat MACD. Sebagai contoh, memperkenalkan penunjuk turun naik dan penapisan isyarat dengan sewajarnya.
Uji hubungan nisbah keuntungan dan kerugian yang berbeza untuk mendapatkan kombinasi parameter dengan nisbah risiko-balasan yang lebih baik.
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)