
Ini adalah strategi perdagangan kuantitatif yang menggunakan Moving Average dan MACD untuk melakukan operasi terobosan dua arah. Ini memiliki karakteristik operasi lintas-aksara, yaitu menilai arah tren dalam periode waktu yang lebih lama dan mencari keuntungan dari peluang masuk dalam periode waktu yang lebih pendek.
Strategi ini menggunakan tiga rata-rata SMMA dengan durasi yang berbeda dan satu rata-rata EMA untuk menentukan arah tren. Pada saat yang sama, ia menggabungkan indikator MACD untuk menentukan tren jangka pendek dan waktu masuk. Secara khusus, kondisi pembelian adalah: harga melewati semua rata-rata di atas dan rata-rata pendek dipicu di atas garis rata-rata panjang; dan kondisi jual adalah sebaliknya, harga melewati semua rata-rata di bawah dan rata-rata pendek dipicu di bawah garis rata-rata panjang.
Dapat dilihat bahwa strategi ini menggunakan rata-rata bergerak untuk menentukan arah tren jangka menengah dan jangka panjang, dan MACD untuk menentukan pembalikan jangka pendek untuk menangkap waktu masuk yang lebih baik. Operasi gabungan multi-aksara ini adalah fitur penting dari strategi ini.
Keuntungan dari operasi lintas-jalur waktu ini adalah bahwa Anda dapat memilih titik balik jangka pendek yang tepat untuk masuk ke dalam arah tren dengan probabilitas tinggi, sehingga Anda mendapatkan pengembalian risiko yang lebih baik. Secara khusus, ada 3 keuntungan utama:
3 garis SMMA rata-rata ditambah 1 garis EMA rata-rata multi-level filter, dapat secara efektif menilai arah tren jangka menengah dan panjang, menghindari operasi berlawanan arah.
Indikator MACD menilai titik balik jangka pendek untuk masuk ke pasar, yang memungkinkan untuk mendapatkan harga masuk yang lebih baik.
Relasi urutan rata-rata bergerak yang ketat dapat digunakan sebagai kondisi penyaringan untuk mengurangi kemungkinan kesalahan operasi.
Risiko utama dari strategi ini adalah:
Rata-rata bergerak sendiri sangat lambat dan mungkin kehilangan kesempatan untuk membalikkan tren dalam jangka pendek.
Indikator MACD mudah menghasilkan sinyal palsu, yang membutuhkan kombinasi filter harga.
Pertimbangan multi-aksara waktu meningkatkan kompleksitas strategi, yang dapat menyebabkan kegagalan.
Untuk risiko 1 dan risiko 2, dapat dioptimalkan dengan mengurangi siklus rata-rata dan siklus sinyal dengan tepat, dan bereaksi cepat terhadap pembalikan tren jangka pendek. Untuk risiko 3, diperlukan pengujian optimasi untuk varietas dan siklus yang berbeda, sehingga parameter strategi disesuaikan dengan karakteristik varietas tersebut.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Mengoptimalkan parameter moving average dan MACD agar sesuai dengan karakteristik periode dan varietas yang berbeda. Misalnya, mempersingkat panjang garis rata-rata, memperbesar parameter Signal, dll.
Menambahkan strategi stop loss, menggunakan ATR atau indikator lainnya untuk mengatur stop loss bergerak yang masuk akal. Hal ini dapat secara signifikan meningkatkan pengendalian risiko strategi.
Mencari indikator atau cara yang lebih baik untuk menyaring sinyal MACD alternatif. Misalnya, memperkenalkan indikator tingkat fluktuasi, memfilter sinyal, dll.
Ujilah berbagai rasio stop loss untuk mendapatkan kombinasi parameter yang lebih baik dari risiko-reward.
Secara keseluruhan, ini adalah sistem terobosan dengan pemikiran lintas-aksara yang unik. Ini memanfaatkan keuntungan dari rata-rata bergerak dan MACD sekaligus, untuk menerapkan strategi operasi penilaian gabungan dalam beberapa periode waktu. Dengan penyesuaian optimal terhadap parameter dan kondisi penyaringan, strategi ini dapat menjadi skema 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)