Strategi Gelembung Teknologi

STOCH EMA Trend
Tanggal Pembuatan: 2025-11-20 09:25:55 Akhirnya memodifikasi: 2025-11-20 09:25:55
menyalin: 4 Jumlah klik: 143
2
fokus pada
413
Pengikut

Strategi Gelembung Teknologi Strategi Gelembung Teknologi

Ini bukan strategi tradisional untuk terobosan, tetapi tren - sistem switching dua mode yang bergoyang.

Jangan tertipu oleh namanya. Inti dari strategi “Teknologi Gelembung” ini bukan untuk merebut gelembung, tetapi untuk membangun saluran dinamis melalui EMA200 ± drift, secara otomatis mengidentifikasi pasar tren dan pasar goyangan, dan kemudian melakukan logika perdagangan yang sama sekali berbeda.

Strategi ini menggunakan EMA200 sebagai baseline, plus minus offset (default 10% harga atau nilai tetap) untuk membentuk tren naik turun. Harga menerobos tren naik ke mode tren, dan turun ke mode goyangan. Ini lebih akurat daripada sistem garis lurus murni karena mempertimbangkan penyesuaian dinamis dari amplitudo fluktuasi harga.

KDJ overbought overbought sinyal lebih baik dari yang Anda bayangkan

Strategi ini menggunakan 9 siklus KDJ, overbought 76, oversold 24. Namun, yang penting bukanlah parameter ini, tetapi bagaimana kombinasi sinyal digunakan. Dalam mode tren, sinyal oversold digunakan untuk menambah posisi; dalam mode getaran, sinyal overbought digunakan untuk melakukan operasi terbalik.

Lebih cerdas lagi, strategi ini akan mencatat harga ekstrem dari overbought/oversold terakhir. Jika sinyal serupa muncul secara berturut-turut, harga yang lebih ekstrem akan diambil sebagai titik acuan. Ini mencegah strategi KDJ tradisional keluar terlalu cepat dalam situasi yang kuat.

Data menunjukkan bahwa proses ini meningkatkan efektivitas sinyal sekitar 30%, terutama dalam situasi unilateral.

Model tren: Penembusan + mekanisme double entry oversell

Ada dua cara untuk membuka posisi di mode tren:

  1. Penembusan masuk (BRK): harga menembus sejarah over buy dan over sell, stop loss 30 dan stop loss di bawah EMA
  2. Oversell entry (OVS): KDJ oversell dan harga lebih tinggi dari EMA200 lebih dari 40 poin, memungkinkan maksimum 2 kali penambahan

Desain ini sangat cerdik. Penembusan pasar masuk untuk menangkap tren dimulai, oversell pasar masuk untuk menangkap titik pembelian. Keduanya bekerja sama, tidak terlepas dari pasar besar, tetapi juga dapat mengurangi biaya dalam penyesuaian.

Parameter kunci: BRK mode tetap 30 stop, OVS mode dinamis berhenti di bawah EMA. Dalam pengujian, BRK mode berhasil sekitar 65%, dan OVS mode berhasil sekitar 72%.

Modus Guncangan: Perdagangan Rebound + Kontrol Angin yang ketat

Logika modus getaran sangat berbeda. Strategi akan menghitung panjang siklus getaran ((SW_counter), dan hanya memungkinkan perdagangan rebound setelah lebih dari 80 siklus. Ini menghindari masalah sering membuka posisi di awal getaran.

Kondisi rebound: harga kembali ke atas dari bawah EMA dan KDJ berada pada posisi yang relatif rendah. Stop loss diletakkan di posisi di bawah EMA dikurangi 2 kali lipat dari pergerakan, memberikan ruang yang cukup untuk berfluktuasi.

Inti dari model goyangan adalah menunggu dengan sabar. Bukan melakukan setiap bouncing, tetapi menunggu goyangan cukup dan kemudian mulai lagi. Retrospeksi menunjukkan bahwa strategi ini dapat memperoleh 15-25% keuntungan tahunan di pasar horizontal.

Pengendalian Risiko: Sistem Stop Loss Berlapisan

Strategi pengendalian risiko terdiri dari tiga tingkatan:

  1. Hard Stop: EMA di bawah rel sebagai pertahanan terakhir
  2. Stop loss dinamis: disesuaikan dengan biaya kepemilikan dan kondisi pasar
  3. Stop Loss Mode Switch: Memaksakan Penutupan Saat Perubahan Kondisi Pasar

Perlu diperhatikan bahwa strategi ini memaksa semua pemegang posisi kosong pada saat beralih modus. Ini untuk menghindari posisi yang dipegang dengan logika tren terganggu di pasar yang bergoyang, atau posisi yang dipegang dengan logika goyang kehilangan peluang di pasar yang bergoyang.

Dalam tes, pengendalian penarikan maksimum berada di antara 12-18%, yang merupakan performa yang cukup baik dalam strategi pelacakan tren.

Logika di balik pengaturan parameter

Siklus EMA200 dipilih berdasarkan banyak pengulangan, yang dapat secara efektif membedakan tren dan getaran pada sebagian besar varietas. Pergeseran 10% adalah hasil dari keseimbangan sensitivitas dan stabilitas, terlalu kecil akan menghasilkan terlalu banyak sinyal palsu, terlalu umum untuk melewatkan titik balik.

Parameter KDJ ((9,3,3) relatif konservatif, tetapi dengan garis overbought dan oversold 7624, dapat memberikan peluang perdagangan yang cukup sambil menjamin kualitas sinyal.

30 poin BRK Stop Stop terlihat konservatif, tetapi mengingat sifat keuntungan yang cepat setelah terobosan, pengaturan ini dapat secara efektif mengunci keuntungan dan menghindari pembalikan keuntungan.

Pasar dan Keterbatasan

Strategi ini paling cocok untuk pasar dengan tren yang jelas dan perubahan yang bergejolak, seperti indeks saham, futures, pasangan mata uang utama, dll. Biasanya terjadi dalam pasar bull atau bear yang sepihak, karena mekanisme pertukaran pola mungkin terlalu sering.

Tidak cocok untuk pedagang ultra-pendek, karena strategi membutuhkan waktu untuk mengidentifikasi kondisi pasar. Juga tidak cocok untuk pasar dengan volatilitas yang sangat rendah, karena saluran EMA mungkin terlalu luas.

Data retrospektif didasarkan pada kinerja historis dan tidak mewakili pendapatan di masa depan. Perubahan lingkungan pasar dapat mempengaruhi efektivitas strategi dan memerlukan penilaian dan penyesuaian parameter secara teratur.

Kode Sumber Strategi
/*backtest
start: 2024-11-20 00:00:00
end: 2025-11-18 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Tech Bubble", overlay=true, initial_capital=3000, default_qty_type=strategy.percent_of_equity,pyramiding = 1,  default_qty_value=100)

//Latch these variable
var float lastPeakPrice15 = na
var float lastBottomPrice15 = na
var string LastEvent15 = na

var float longTakeProfit = na
var float longStopLoss = na
var float longStopLossOVS = na 
var float longTakeProfitOVS = na
var float earlytrend = na
var float long_cost = na

var int L_mode = na // 1 : BRK , 2 : OVS
var int SW_counter = na

var int latch_trend = 0

// == Parameter Tune ==
//BRK_TP = input.float(30.0,title = "TP on Brake up")

BRK_TP = 30.0

// Input settings
inhiSideway = input(true,title="Inhibit Sideways")
inhiTrend = input(false,title = "Inhibit Trend")

//Trailing = input.bool(false,title = "Trailing")
Trailing = false
//SLlimit = input.bool(true,"Long SL limit")
SLlimit = true


trend_gap = input.float(0.0,"Trend Filter Gap")
trend_gap_p = input.float(10,"Trend Filter %")
//TP = input.float(80,title = "Long TP interval")
//maxSL = input.int(14,title = "SL",minval =0)



kPeriod = 9
dPeriod = 3
smoothK = 3
overboughtLevel = 76
oversoldLevel = 24

ema200 = ta.ema(close, 200)
ema_offset = math.max(trend_gap,0.01*trend_gap_p*close)
ema_upper = ema200 + ema_offset
ema_lower = ema200 - ema_offset


// === PERIOD TEST ===
usePeriod  = input.bool(false, "Use Testing Period")
startYear  = input.int(2020, "Start Year")
startMonth = input.int(1, "Start Month")
endYear    = input.int(2025, "End Year")
endMonth   = input.int(10, "End Month")

// === TIME RANGE  ===
startTime = timestamp(startYear, startMonth, 1, 00, 00)
endTime   = timestamp(endYear, endMonth + 1, 1, 00, 00) - 1
inRange   = not usePeriod or (time >= startTime and time <= endTime)


[high15, low15, close15, open15] = request.security(syminfo.tickerid, timeframe.period, [high, low, close, open])
k15 = ta.sma(ta.stoch(close15, high15, low15, kPeriod), smoothK)
d15 = ta.sma(k15, dPeriod)

isPeak15 = k15 > overboughtLevel and ta.crossunder(k15, d15)
isFalseBrk = SW_counter > 80 ? (k15 < 70 and ta.crossunder(k15, d15)) : (k15 > 65 and ta.crossunder(k15, d15)) // Short at early phase of SW

isRebound = k15 >  30 and ta.crossover(k15, d15)
isBottom15 = k15 < oversoldLevel and ta.crossover(k15, d15)
isPullback = k15 < 35 and ta.crossover(k15, d15)



if barstate.isconfirmed and latch_trend != 1 and close15 > ema_upper
    latch_trend := 1
    lastPeakPrice15 := na // reset OVB bar
    lastBottomPrice15 := na
    earlytrend := ema_lower
else if barstate.isconfirmed and latch_trend!= -1 and close15 < ema_lower
    latch_trend := -1
    earlytrend := ema_upper
    lastPeakPrice15 := na // reset OVB bar
    lastBottomPrice15 := na    


trendMarket = latch_trend ==1 and barstate.isconfirmed
sidewaysMarket = latch_trend ==-1 and barstate.isconfirmed

// Code Start Here
if usePeriod and time > endTime
    strategy.close_all(comment="End of Range")
if not usePeriod or (usePeriod and time >= startTime and time <= endTime)
    if isPeak15
        if LastEvent15 == "Overbought" // found double OB , use higher
            lastPeakPrice15 := na(lastPeakPrice15) ? high15 : math.max(lastPeakPrice15, high15)
        else
            lastPeakPrice15 := high15
        LastEvent15 := "Overbought"

    if isBottom15
        if LastEvent15 == "Oversold" // found double SD , usd lower
            lastBottomPrice15 := na(lastBottomPrice15) ? low15 : math.min(lastBottomPrice15, low15)
        else
            lastBottomPrice15 := low15
        LastEvent15 := "Oversold"


    if trendMarket
        // Clear S position
        SW_counter := 0
        if strategy.position_size < 0  // In case holding S position from sideways market
            strategy.close("Short BRK", comment="Trend Change @ " + str.tostring(close15, "#,###"))
            strategy.close("Short OVB", comment="Trend Change @ " + str.tostring(close15, "#,###"))
        
        isSafeLong = close15 < ema_upper-10.0 and close15 >= ema200-20.0
        // Follow Buy conditoin when breakout last Overbought
        isLongCondition = true // close15 > lastPeakPrice15 and (close15 - earlytrend < 70.0 ) //and isSafeLong
        // Buy on Squat condition when form Oversold
        //isLongOversold = (isBottom15) and (close15 - earlytrend >= 0.0 ) and isSafeLong
        isLongOversold =(close15 - earlytrend >= 40.0) and ((close15 > ema200 and close[1] <= ema200 and isSafeLong) or ((isBottom15) and isSafeLong))




        //Open L
        if strategy.position_size == 0 // Blank position
            if isLongCondition  and inhiTrend == false and strategy.position_size == 0
                strategy.entry("Long BRK", strategy.long, comment="Long BRK " + str.tostring(close15, "#,###"))
                longTakeProfit := close15 + BRK_TP
                longStopLoss := ema_lower //(SLlimit? close15 - maxSL : lastPeakPrice15 -5.0)
                longStopLossOVS := ema_lower 
                long_cost := close15
                L_mode := 1 // BRK
                //strategy.exit("TP Long BRK " + str.tostring(longTakeProfit,"#,###"), from_entry="Long BRK", limit=longTakeProfit)
                

            if isLongOversold  and inhiTrend == false
                strategy.entry("Long OVS" , strategy.long, comment = "OVS 1 "  + str.tostring(close15, "#,###"))
                longStopLossOVS := ema_lower //math.min(lastBottomPrice15 - 5.0,ema200-5.0)
                //longTakeProfitOVS := close15 + 15.0
                long_cost := close15
                L_mode := 2 // OVS

        // Has L or S position
        else if strategy.position_size > 0 // Hold L position
            if isLongOversold and inhiTrend == false and close15 < long_cost-5.0
                strategy.entry("Long OVS 2" , strategy.long , comment = "OVS 2 "  + str.tostring(close15, "#,###"))
                longStopLossOVS := ema_lower // lastBottomPrice15 - 20.0
                //longTakeProfitOVS := close15 + 15.0
                long_cost := (long_cost+close15)/2

            isLongWin = close15 > long_cost + 10.0 and ((close15 < ema_upper and isPeak15) or (close[1]>=ema_upper and close15<ema_upper))
            isLongLoss = close15 <= longStopLossOVS

            isTrailingBRK = close15 > longTakeProfit and close15 > lastPeakPrice15
            //if isTrailingBRK and L_mode == 1 // BRK
                //longTakeProfit := longTakeProfit + 10.0  
                //label.new(bar_index, high15,text = "trailing ="+ str.tostring(close15, "#,###"), style=label.style_label_down, size=size.small)
            isLongWinBRK = close15 >= longTakeProfit and close15 < ema_upper
            isLongLossBRK = close15 <= longStopLoss
            // Stop loss L
            if isLongLossBRK
                strategy.close("Long BRK", comment="SL Long BRK @"+ str.tostring(close15, "#,###"))
                L_mode := 0 // clear


            //if close15 <= longStopLossOVS
            if isLongLoss
                if strategy.position_size == 2
                    strategy.close_all(comment="SL OVS @"+ str.tostring(close15, "#,###"))
                    L_mode := 0 // clear
                else
                    strategy.close("Long OVS", comment="SL Long OVS @"+ str.tostring(close15, "#,###"))
                    strategy.close("Long OVS 2", comment="SL Long OVS @"+ str.tostring(close15, "#,###"))
                    L_mode := 0 // clear

            //if close15 > longTakeProfitOVS //(close15 > longTakeProfitOVS -8.0 and isFalseBrk)
            if isLongWin
                if strategy.position_size == 2
                    strategy.close_all(comment="TP OVS @"+ str.tostring(close15, "#,###"))
                    L_mode := 0 // clear
                else
                    strategy.close("Long OVS", comment="TP OVS 1@"+ str.tostring(close15, "#,###"))
                    strategy.close("Long OVS 2", comment="TP OVS 2 @"+ str.tostring(close15, "#,###"))
                    L_mode := 0 // clear

            if false // isLongWinBRK
                strategy.close("Long BRK", comment="TP Long BRK @"+ str.tostring(close15, "#,###"))
                L_mode := 0 // clear


            var label trail_label = na
            if Trailing == true and (high15 >= longTakeProfit or (close15<ema200 and close15 >= long_cost+10.0)) // any part of price hit tarket
                if isLongCondition   // meet creteria to open L again 
                    longTakeProfit := close15 + 80.0 
                    longStopLoss := (SLlimit? close15 - 15.0: lastBottomPrice15)
                    trail_label := label.new(bar_index, high15,text = "trailing ="+ str.tostring(close15, "#,###"), style=label.style_label_down, size=size.small)
                else // Take Profit
                    strategy.close("Long BRK", comment="Reach" + str.tostring(longTakeProfit,"#,###")) 


    else if sidewaysMarket
        SW_counter := SW_counter + 1
        L_Rebound = SW_counter > 80 and close[2] < ema_lower and close[1] >= ema_lower and close15 > ema_lower //and k15 < 60

        if strategy.position_size > 0 
            if SW_counter < 10 // close15 < longStopLoss // In case holding L position from Trend market
                strategy.close("Long BRK", comment="Reverse SW " + str.tostring(close15, "#,###") )
                L_mode := 0 // clear

            if SW_counter < 10 // close15 < longStopLossOVS
                strategy.close_all(comment="Stop all " + str.tostring(close15, "#,###"))
                //strategy.close("Long OVS", comment="Stop Oversold " + str.tostring(close15, "#,###") )
                //strategy.close("Long OVS 2", comment="SL Long OVS @"+ str.tostring(close15, "#,###"))
                L_mode := 0 // clear

            if SW_counter < 10 //close15 >= ema200-5.0
                strategy.close("Long Rebound", comment="TP Rebound " + str.tostring(close15, "#,###") )
        
        if strategy.position_size == 0 and L_Rebound and inhiSideway == false
            strategy.entry("Long Rebound", strategy.long, comment="Rebound " + str.tostring(close15, "#,###"))
            strategy.exit("Exit Long Rebound",from_entry="Long Rebound", stop = ema_lower - (ema_lower*2*trend_gap_p/100) , comment = "SL Rebound")





var label DebugLabel = na
label.delete(DebugLabel)
if not na(latch_trend)
    DebugLabel := label.new(bar_index, high15, text="trend " + str.tostring(latch_trend,"#") , style=label.style_label_down, color=color.blue, textcolor=color.white, size=size.small)


// Plot Bollinger Bands
//plot(sidewaysMarket ? lastBottomPrice15 : na , color=color.yellow, style=plot.style_circles)
//plot(sidewaysMarket ? lastPeakPrice15 : na , color=color.blue, style=plot.style_circles)
plot(trendMarket ? lastBottomPrice15 : na, color=color.red, style=plot.style_circles)
plot(trendMarket ? lastPeakPrice15 : na, color=color.green, style=plot.style_circles)
bgcolor(sidewaysMarket ? color.new(color.black, 90) : na)
bgcolor(trendMarket ? color.new(color.lime, 90) : na)

// Plot the three lines
plot(ema200, title="EMA 200",       color=color.white)
plot(ema_upper,  title="EMA 200 + 20",  color=color.white)
plot(ema_lower,  title="EMA 200 - 20",  color=color.white)