Strategi Dagangan Purata Bergerak Lesu Berganda

Penulis:ChaoZhang, Tarikh: 2023-10-13 15:45:58
Tag:

Ringkasan

Strategi ini menggunakan sistem purata bergerak lancar berganda sebagai isyarat dagangan utama, digabungkan dengan penunjuk pengesahan jumlah TDFI untuk penapisan isyarat dagangan, untuk memanfaatkan kelebihan purata bergerak lancar sambil mengurangkan dagangan yang tidak betul di pasaran bukan trend.

Logika Strategi

Strategi ini menggunakan dua set purata bergerak lancar dengan konfigurasi parameter yang berbeza sebagai isyarat dagangan utama. Pertama purata bergerak lancar 8 tempoh digunakan sebagai pengesahan awal, kemudian purata bergerak lancar 16 tempoh yang sedikit lebih perlahan bertindak sebagai pengesahan kedua. Apabila MA pantas memberi isyarat beli, jika MA perlahan juga memberi isyarat ke arah yang sama dalam 1-2 bar terakhir, kedudukan panjang dibuka. Apabila MA pantas memberikan isyarat jual, jika MA perlahan juga memberi isyarat ke arah yang sama dalam 1-2 bar terakhir, kedudukan pendek dibuka. Keluar diaktifkan apabila MA pengesahan kedua membalikkan arah. Di samping itu, penunjuk jumlah TDFI digunakan untuk mengesan jumlah perdagangan di belakang isyarat harga untuk menapis isyarat yang mengelirukan. Dagangan hanya diambil apabila selaras dengan jangkaan.

Kelebihan

  • Pemasaran lancar secara berkesan mengesan trend dan mengelakkan bunyi pasaran, menangkap trend jangka menengah hingga panjang
  • Penetapan MA yang lancar berganda meningkatkan kebolehpercayaan isyarat, mengelakkan perdagangan yang tidak betul di pasaran yang tidak trend
  • Penapis pengenalan penunjuk kelantangan yang mengelirukan isyarat kelantangan rendah, mengelakkan kehilangan yang tidak perlu
  • Ruang pengoptimuman parameter yang tinggi, boleh diselaraskan untuk produk dan jangka masa yang berbeza, sangat mudah disesuaikan

Risiko

  • PEM yang lancar boleh menjadi perlahan untuk mengenal pasti pembalikan trend, berpotensi membawa kepada beberapa kerugian
  • Pemasaran lancar berganda masih boleh menjana isyarat yang salah pada masa yang sama di pasaran bukan trend
  • Penunjuk jumlah mempunyai kesan terhad, tidak boleh menapis semua isyarat yang mengelirukan

Untuk mengurangkan risiko, arah pengoptimuman berikut boleh dipertimbangkan:

  • Tambah penunjuk kekuatan trend untuk membantu pengenalan pembalikan trend
  • Mengoptimumkan parameter MA yang lancar untuk konfigurasi cepat / perlahan yang lebih berkesan
  • Uji penunjuk kelantangan yang berbeza untuk menyaring isyarat kelantangan yang mengelirukan dengan lebih baik

Arahan pengoptimuman

  • Tambah MACD dll untuk membantu mengenal pasti pembalikan trend
  • Sesuaikan hentian dan had ATR agar sesuai dengan ciri produk yang berbeza
  • Cuba meningkatkan saiz kedudukan untuk meningkatkan pulangan strategi
  • Mengoptimumkan parameter berdasarkan hasil backtest untuk meningkatkan kestabilan

Ringkasan

Secara keseluruhan ini adalah strategi trend-mengikuti yang tipikal. Sistem MA berganda yang lancar digabungkan dengan penapis jumlah TDFI dapat dengan berkesan memanfaatkan keupayaan penjejakan trend sambil mengurangkan kadar isyarat yang tidak betul di pasaran yang tidak trend. Melalui pengoptimuman parameter ia boleh disesuaikan dengan jangka masa dan produk yang berbeza. Walau bagaimanapun, ia lebih bergantung pada penyesuaian parameter daripada aplikasi mekanikal. Kekurangan pengenalan pembalikan trend dan kesan penyesuaian parameter harus diperhatikan. Secara keseluruhan pendekatan yang jelas dan mudah, layak untuk pengoptimuman dan amalan lanjut.


/*backtest
start: 2022-10-06 00:00:00
end: 2023-10-12 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Designed per No Nonsense Forex VP rules
//Made to be as modular as possible, so we can swap the indicators in and out.
//Originated from causecelebre
//Tried to put in as much VP rules as possible

///////////////////////////////////////////////////
//Rules Implemented:
///////////////////////////////////////////////////
// - SL 1.5 x ATR
// - TP 1 x ATR
//
// - Entry conditions
//// - Entry within first confirmation cross over and 1 candle of second confirmation + volume
// - Exit conditions
//// - Exit on exit indicator or when baseline or confirmation flip 

///////////////////////////////////////////////////
//Trades entries
///////////////////////////////////////////////////
// - First entry L1 or S1 with standard SL and TP

///////////////////////////////////////////////////
//Included Indicators and settings
///////////////////////////////////////////////////
// - Confirmtion = SSL 8, 16
// - Volume = TDFI 6

///////////////////////////////////////////////////
//Credits
// Strategy causecelebre https://www.tradingview.com/u/causecelebre/
// TDFI causecelebre https://www.tradingview.com/u/causecelebre/
// SSL Channel ErwinBeckers https://www.tradingview.com/u/ErwinBeckers/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// strategy(title="NNFX Strategy 3 Indicator Template | jh", overlay = true, pyramiding=0, initial_capital=20000, currency=currency.USD, calc_on_order_fills=0,default_qty_type=strategy.fixed, default_qty_value=10000)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Set the main stuff  ****
///////////////////////////////////////////////////

//Price
price = close

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ATR stuff
///////////////////////////////////////////////////

slMultiplier = input(1.5, "SL")
tpMultiplier = input(1, "TP")

atrlength = input(title="ATR Length", defval=14, minval=1)
atrsmoothing = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])

ma_function(source, atrlength) => 
    if atrsmoothing == "RMA"
        rma(source, atrlength)
    else
        if atrsmoothing == "SMA"
            sma(source, atrlength)
        else
            if atrsmoothing == "EMA"
                ema(source, atrlength)
            else
                wma(source, atrlength)

//plot(ma_function(tr(true), atrlength), title = "ATR", color=#991515, transp=0)

atr = ma_function(tr(true), atrlength)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Confirmation 1 Fast ****
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//SSL 6
///////////////////////////////////////////////////

ssllen1=input(title="SSL 1 Length Period", defval=8)
smaHigh1=sma(high, ssllen1)
smaLow1=sma(low, ssllen1)
Hlv1 = na
Hlv1 := close > smaHigh1 ? 1 : close < smaLow1 ? -1 : Hlv1[1]
sslDown1 = Hlv1 < 0 ? smaHigh1: smaLow1
sslUp1   = Hlv1 < 0 ? smaLow1 : smaHigh1

plot(sslDown1, "SSL Down", linewidth=1, color=red)
plot(sslUp1, "SSL Up", linewidth=1, color=lime)

///////////////////////////////////////////////////
//Confirm Signals
///////////////////////////////////////////////////

c_Up = sslUp1
c_Down =sslDown1

//Signals based on crossover
c_cross_Long = crossover(c_Up, c_Down)
c_cross_Short = crossover(c_Down, c_Up)

//Signals based on signal position
c_trend_Long = c_Up > c_Down ? 1 : 0
c_trend_Short = c_Down > c_Up ? 1 : 0

confirm_Long = c_cross_Long
confirm_Short = c_cross_Short

plotshape(c_cross_Long, color = green, style=shape.triangleup, location=location.top)
plotshape(c_cross_Short, color = red, style=shape.triangledown, location=location.top)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Confirmation 2 Slow ****
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//SSL 30
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//SSL
///////////////////////////////////////////////////

ssllen2=input(title="SSL 2 Length Period", defval=16)
smaHigh2=sma(high, ssllen2)
smaLow2=sma(low, ssllen2)
Hlv2 = na
Hlv2 := close > smaHigh2 ? 1 : close < smaLow2 ? -1 : Hlv2[1]
sslDown2 = Hlv2 < 0 ? smaHigh2: smaLow2
sslUp2   = Hlv2 < 0 ? smaLow2 : smaHigh2

plot(sslDown2, "SSL Down", linewidth=1, color=orange)
plot(sslUp2, "SSL Up", linewidth=1, color=blue)

///////////////////////////////////////////////////
//Confirm Signals
///////////////////////////////////////////////////
c2_Up = sslUp2
c2_Down = sslDown2

//Signals based on crossover
c2_cross_Long = crossover(c2_Up, c2_Down)
c2_cross_Short = crossover(c2_Down, c2_Up)

//Signals based on signal position
c2_trend_Long = c2_Up > c2_Down ? 1 : 0
c2_trend_Short = c2_Down > c2_Up ? 1 : 0

confirm2_Long = c2_trend_Long
confirm2_Short = c2_trend_Short

plotshape(c2_cross_Long, color = green, style=shape.triangleup, location=location.bottom)
plotshape(c2_cross_Short, color = red, style=shape.triangledown, location=location.bottom)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Volume Indicator Start ****
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//TDFI
///////////////////////////////////////////////////

lookback = input(6, title = "TDFI Lookback") 
filterHigh = input(0.05, title = "Filter High") 
filterLow = input(-0.05, title = "Filter Low") 

mma = ema(price * 1000, lookback)
smma = ema(mma, lookback)

impetmma = mma - mma[1]
impetsmma= smma - smma[1]
divma = abs(mma - smma)
averimpet = (impetmma + impetsmma) / 2

number = averimpet
pow = 3
result = na

for i = 1 to pow - 1
    if i == 1
        result := number
    result := result * number

tdf = divma * result
ntdf = tdf / highest(abs(tdf), lookback * 3)

///////////////////////////////////////////////////
//Volume Signals
///////////////////////////////////////////////////
v_Long = ntdf > filterHigh ? 1 : 0
v_Short = filterLow > ntdf ? 1 : 0

volumeLong = v_Long
volumeShort = v_Short

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **************************** Logic to handle NNFX rules ****************************
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Checking for confirmation indication with 1 candle difference for second confirmtion and volume
enterLong   = confirm_Long and (confirm2_Long[0] or confirm2_Long[1])      and (volumeLong[0] or volumeLong[1]) ? 1 : 0
enterShort  = confirm_Short and (confirm2_Short[0] or confirm2_Short[1])   and (volumeShort[0] or volumeShort[1]) ? 1 : 0

exitLong = c_cross_Short or c2_cross_Short ? 1 : 0 
exitShort = c_cross_Long or c2_cross_Long ? 1 : 0 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Entries and Exits
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if (year>2009)

    //Long entries with standard 1.5 ATR for SL, 1 ATR for TP
    long_sl = price - (atr * slMultiplier)
    long_tp = price + (atr * tpMultiplier)

    //Short entries with standard 1.5 ATR for SL, 1 ATR for TP
    short_sl = price + (atr * slMultiplier)
    short_tp = price - (atr * tpMultiplier)

    strategy.close("L1", when = exitLong)
    strategy.close("S1", when = exitShort)

    strategy.exit("L Limit Exit", "L1", stop = long_sl, limit = long_tp)
    strategy.exit("S Limit Exit", "S1", stop = short_sl, limit = short_tp)

    strategy.order("L1", strategy.long, when = enterLong)
    strategy.order("S1", strategy.short, when = enterShort)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//End
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    




Lebih lanjut