Ini adalah strategi perdagangan kuantitatif yang memanfaatkan moving average dan indikator MACD untuk operasi terobosan di kedua arah.
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.
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.
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.
Indikator MACD menilai titik pembalikan jangka pendek untuk masuk dapat memperoleh tingkat harga masuk yang lebih baik.
Hubungan urutan rata-rata bergerak yang ketat sebagai kondisi penyaringan dapat mengurangi kemungkinan kesalahan operasi.
Risiko utama dari strategi ini adalah:
Rata-rata bergerak sendiri memiliki sifat keterlambatan yang lebih besar, yang dapat melewatkan peluang pembalikan tren jangka pendek.
Indikator MACD cenderung menghasilkan sinyal palsu dan perlu disaring dalam kombinasi dengan tingkat harga.
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.
Aspek utama yang dapat dioptimalkan strategi ini meliputi:
Mengoptimalkan parameter rata-rata bergerak dan MACD agar sesuai dengan karakteristik siklus dan varietas yang berbeda.
Meningkatkan strategi stop loss menggunakan ATR atau indikator lain untuk menetapkan stop bergerak yang wajar.
Carilah indikator atau metode penyaringan yang lebih baik untuk menggantikan sinyal MACD. Misalnya, perkenalkan indikator volatilitas dan saring sinyal sesuai.
Uji hubungan rasio laba rugi yang berbeda untuk mendapatkan kombinasi parameter dengan rasio risiko-manfaat yang lebih baik.
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)