Strategi ini menghasilkan sinyal beli dan jual dengan menghitung dua jenis rata-rata bergerak yang berbeda di dua kerangka waktu yang berbeda.
Strategi ini menggunakan dua rata-rata bergerak, rata-rata bergerak cepat dan rata-rata bergerak lambat. Kerangka waktu rata-rata bergerak cepat harus lebih besar atau sama dengan kerangka waktu grafik. Ketika rata-rata bergerak cepat melintasi di atas rata-rata bergerak lambat, sinyal beli dihasilkan. Ketika rata-rata bergerak cepat melintasi di bawah rata-rata bergerak lambat, sinyal jual dihasilkan.
Pengguna dapat memilih dari berbagai jenis rata-rata bergerak seperti SMA, EMA, KAMA dll, dan kerangka waktu dapat berbeda.
Keuntungan terbesar dari strategi ini adalah memungkinkan penyesuaian mudah parameter untuk bereksperimen dengan kombinasi yang berbeda untuk menemukan pengaturan parameter terbaik.
Pengguna dapat bebas memilih jenis, panjang, kerangka waktu dari dua moving average. Sistem menghitung dan menampilkan hasil secara real time. Ini jauh lebih mudah daripada menguji strategi dengan kombinasi parameter yang berbeda.
Selain itu, fungsi stop loss/take profit yang dibangun membantu mengurangi risiko dan meningkatkan profitabilitas.
Risiko terbesar dari strategi ini adalah bahwa pengaturan parameter yang tidak tepat dapat mengakibatkan sinyal perdagangan yang terlalu sering, sehingga meningkatkan biaya perdagangan dan kerugian slippage.
Selain itu, rata-rata bergerak ganda sendiri cenderung memberikan sinyal palsu.
Risiko ini dapat dikurangi dengan mengoptimalkan parameter dan menggabungkannya dengan indikator lain.
Pertimbangkan untuk menambahkan indikator lain seperti RSI untuk menyaring sinyal beli / jual di atas rata-rata bergerak ganda. Ini dapat membantu mengurangi sinyal palsu.
Parameter rata-rata bergerak juga dapat dioptimalkan melalui pelatihan untuk menemukan kombinasi terbaik.
Ini adalah sandbox yang sangat baik untuk bereksperimen dengan rata-rata bergerak ganda. Keuntungannya yang terbesar adalah iterasi cepat dari kombinasi parameter yang berbeda untuk menemukan strategi perdagangan terbaik. Tentu saja ada juga risiko pengaturan parameter yang tidak tepat, yang dapat dikurangi dengan menambahkan indikator penyaring. Optimasi lebih lanjut dari strategi ini berpotensi dapat menyebabkan kinerja perdagangan yang lebih baik.
/*backtest start: 2023-01-28 00:00:00 end: 2024-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License https://creativecommons.org/licenses/by-sa/4.0/ // © dman103 // A moving averages SandBox strategy where you can experiment using two different moving averages (like KAMA, ALMA, HMA, JMA, VAMA and more) on different time frames to generate BUY and SELL signals, when they cross. // Great sandbox for experimenting with different moving averages and different time frames. // // == How to use == // We select two types of moving averages on two different time frames: // // First is the FAST moving average that should be at the same time frame or higher. // Second is the SLOW moving average that should be on the same time frame or higher. // When FAST moving average cross over the SLOW moving average we have a BUY signal (for LONG) // When FAST moving average cross under the SLOW moving average we have a SELL signal (for SHORT) // WARNING: Using a lower time frame than your chart time frame will result in unrealistic results in your backtesting and bar replay. // == NOTES == // You can select BOTH, LONG, SHORT or NONE in the strategy settings. // You can also enable Stop Loss and Take Profit. // More sandboxes to come, Follow to get notified. // Can also act as indicator by settings 'What trades should be taken' to 'NONE' //@version=4 strategy("Multi MA MTF SandBox Strategy","Multi MA SandBox",overlay=true) tradeType = input("LONG", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"]) fast_title = input(true, title='---------------- Fast Moving Average (BLUE)----------------', type=input.bool) ma_select1 = input(title="First Slow moving average", defval="EMA", options=["SMA", "EMA", "WMA", "HMA", "JMA", "KAMA", "TMA", "VAMA", "SMMA", "DEMA" , "VMA", "WWMA", "EMA_NO_LAG", "TSF","ALMA"]) resma_fast = input(title="First Time Frame", type=input.resolution, defval="") lenma_fast = input(title="First MA Length", type=input.integer, defval=6) slow_title = input(true, title='---------------- Slow Moving Average (YELLOW)----------------', type=input.bool) ma_select2 = input(title="Second Fast moving average", defval="JMA", options=["SMA", "EMA", "WMA", "HMA", "JMA", "KAMA", "TMA", "VAMA", "SMMA", "DEMA" , "VMA", "WWMA", "EMA_NO_LAG", "TSF","ALMA"]) resma_slow = input(title="Second time frame", type=input.resolution, defval="") lenma_slow = input(title="Second MA length", type=input.integer, defval=14) settings = input(true, title='---------------- Other Settings ----------------', type=input.bool) lineWidth = input(2,title="Line Width") colorTransparency=input(50,title="Color Transparency",step=10,minval=0,maxval=100) color_fast=input(color.blue,type=input.color) color_slow=input(color.yellow,type=input.color) fillColor = input(title="Fill Color", type=input.bool, defval=true) IndicatorSettings = input(true, title='---------------- Indicators Settings ----------------', type=input.bool) offset=input(title="Alma Offset (only for ALMA)",defval=0.85, step=0.05) volatility_lookback =input(title="Volatility lookback (only for VAMA)",defval=12) i_fastAlpha = input(1.25,"KAMA's alpha (only for KAMA)", minval=1,step=0.25) fastAlpha = 2.0 / (i_fastAlpha + 1) slowAlpha = 2.0 / (31) ///////Moving Averages MA_selector(src, length,ma_select) => ma = 0.0 if ma_select == "SMA" ma := sma(src, length) ma if ma_select == "EMA" ma := ema(src, length) ma if ma_select == "WMA" ma := wma(src, length) ma if ma_select == "HMA" ma := hma(src,length) ma if ma_select == "JMA" beta = 0.45*(length-1)/(0.45*(length-1)+2) alpha = beta tmp0 = 0.0, tmp1 = 0.0, tmp2 = 0.0, tmp3 = 0.0, tmp4 = 0.0 tmp0 := (1-alpha)*src + alpha*nz(tmp0[1]) tmp1 := (src - tmp0[0])*(1-beta) + beta*nz(tmp1[1]) tmp2 := tmp0[0] + tmp1[0] tmp3 := (tmp2[0] - nz(tmp4[1]))*((1-alpha)*(1-alpha)) + (alpha*alpha)*nz(tmp3[1]) tmp4 := nz(tmp4[1]) + tmp3[0] ma := tmp4 ma if ma_select == "KAMA" momentum = abs(change(src, length)) volatility = sum(abs(change(src)), length) efficiencyRatio = volatility != 0 ? momentum / volatility : 0 smoothingConstant = pow((efficiencyRatio * (fastAlpha - slowAlpha)) + slowAlpha, 2) var kama = 0.0 kama := nz(kama[1], src) + smoothingConstant * (src - nz(kama[1], src)) ma:=kama ma if ma_select == "TMA" ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1) ma if ma_select == "VMA" valpha=2/(length+1) vud1=src>src[1] ? src-src[1] : 0 vdd1=src<src[1] ? src[1]-src : 0 vUD=sum(vud1,9) vDD=sum(vdd1,9) vCMO=nz((vUD-vDD)/(vUD+vDD)) VAR=0.0 VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1]) ma := VAR ma if ma_select == "WWMA" wwalpha = 1/ length WWMA = 0.0 WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1]) ma := WWMA ma if ma_select == "EMA_NO_LAG" EMA1= ema(src,length) EMA2= ema(EMA1,length) Difference= EMA1 - EMA2 ma := EMA1 + Difference ma if ma_select == "TSF" lrc = linreg(src, length, 0) lrc1 = linreg(src,length,1) lrs = (lrc-lrc1) TSF = linreg(src, length, 0)+lrs ma := TSF ma if ma_select =="VAMA" // Volatility Adjusted from @fractured mid=ema(src,length) dev=src-mid vol_up=highest(dev,volatility_lookback) vol_down=lowest(dev,volatility_lookback) ma := mid+avg(vol_up,vol_down) ma if ma_select == "SMMA" smma = float (0.0) smaval=sma(src, length) smma := na(smma[1]) ? smaval : (smma[1] * (length - 1) + src) / length ma := smma if ma_select == "DEMA" e1 = ema(src, length) e2 = ema(e1, length) ma := 2 * e1 - e2 ma if ma_select == "ALMA" ma := alma(src, length,offset, 6) ma ma // Calculate EMA ma_fast = MA_selector(close, lenma_fast,ma_select1) ma_slow = MA_selector(close, lenma_slow,ma_select2) maFastStep = security(syminfo.tickerid, resma_fast, ma_fast) maSlowStep = security(syminfo.tickerid, resma_slow, ma_slow) ma1_plot=plot(maFastStep, color=color_fast,linewidth=lineWidth,transp=colorTransparency) ma2_plot=plot(maSlowStep, color=color_slow,linewidth=lineWidth,transp=colorTransparency) colors=ma_fast>ma_slow ? color.green : color.red fill(ma1_plot,ma2_plot, color=fillColor? colors: na,transp=colorTransparency+15) closeStatus = strategy.openprofit > 0 ? "win" : "lose" ////////Long Rules long = crossover(maFastStep,maSlowStep) and (tradeType == "LONG" or tradeType == "BOTH") longClose =crossunder(maFastStep,maSlowStep)//and falling(maSlowStep,1) ///////Short Rules short =crossunder(maFastStep,maSlowStep) and (tradeType == "SHORT" or tradeType == "BOTH") shortClose = crossover(maFastStep,maSlowStep) longShape= crossover(maFastStep,maSlowStep) and tradeType == "NONE" shortShape = crossunder(maFastStep,maSlowStep) and tradeType == "NONE" plotshape(longShape, style=shape.triangleup,location=location.belowbar, color=color.lime,size=size.small) plotshape(shortShape,style=shape.triangledown,location=location.abovebar, color=color.red,size=size.small) // === Stop LOSS === useStopLoss = input(false, title='----- Add Stop Loss / Take profit -----', type=input.bool) sl_inp = input(2.5, title='Stop Loss %', type=input.float, step=0.1)/100 tp_inp = input(5, title='Take Profit %', type=input.float, step=0.1)/100 stop_level = strategy.position_avg_price * (1 - sl_inp) take_level = strategy.position_avg_price * (1 + tp_inp) stop_level_short = strategy.position_avg_price * (1 + sl_inp) take_level_short = strategy.position_avg_price * (1 - tp_inp) if (long) strategy.entry("long", strategy.long) if (short) strategy.entry("short", strategy.short) strategy.close ("long", when = longClose, comment=closeStatus) strategy.close ("short", when = shortClose, comment=closeStatus) if (useStopLoss) strategy.exit("Stop Loss/Profit Long","long", stop=stop_level, limit=take_level,comment =closeStatus ) strategy.exit("Stop Loss/Profit Short","short", stop=stop_level_short, limit=take_level_short, comment = closeStatus)