Strategi Perdagangan EMA-Squeeze dengan Stop Loss Dinamis untuk Berbagai Kerangka Waktu

EMA SQM CMF KC SL TP MTF
Tanggal Pembuatan: 2024-12-11 15:50:38 Akhirnya memodifikasi: 2024-12-11 15:50:38
menyalin: 0 Jumlah klik: 435
1
fokus pada
1617
Pengikut

Strategi Perdagangan EMA-Squeeze dengan Stop Loss Dinamis untuk Berbagai Kerangka Waktu

Ringkasan

Strategi ini adalah sistem perdagangan dinamis yang didasarkan pada analisis multi-siklus waktu, yang menggabungkan indeks Moving Average (EMA), Squeeze Moving Volume (SQM) dan Capital Flow Indicator (CMF) untuk menghasilkan sinyal perdagangan. Inti dari strategi ini adalah untuk mengkonfirmasi tren melalui analisis beberapa kerangka waktu, dan menggunakan stop loss dinamis untuk mengoptimalkan manajemen risiko. Strategi ini menggunakan program stop loss dan profit yang disesuaikan, yang dapat secara otomatis menyesuaikan parameter perdagangan sesuai dengan volatilitas pasar.

Prinsip Strategi

Strategi ini menggunakan tiga kombinasi indikator teknis utama untuk mengidentifikasi peluang perdagangan. Pertama, untuk menentukan arah tren pasar melalui 11 siklus dan 34 siklus EMA. Kedua, untuk mendeteksi tekanan pasar dan peluang potensial untuk terobosan menggunakan Squeeze Momentum, yang menghitung deviasi harga melalui metode regresi linier. Terakhir, untuk mengkonfirmasi arah perdagangan melalui indikator aliran dana yang disempurnakan (CMF) untuk memastikan bahwa ada cukup dana untuk mendukung pergerakan harga.

Keunggulan Strategis

  1. Konfirmasi sinyal multi-dimensi: Mengurangi risiko sinyal palsu secara signifikan dengan menggabungkan beberapa indikator teknis dan analisis periode waktu.
  2. Manajemen Risiko Cerdas: Sistem Stop Loss Dinamis dapat menyesuaikan diri secara otomatis dengan fluktuasi pasar, menghindari keluar prematur sambil melindungi keuntungan.
  3. Adaptif: Parameter strategi dapat disesuaikan dengan kondisi pasar yang berbeda, memiliki kemampuan adaptasi yang baik.
  4. Penutupan transaksi yang lengkap: ada aturan yang jelas dari sinyal masuk ke manajemen keluar, mengurangi pengaruh penilaian subjektif.
  5. Konfirmasi aliran dana: meningkatkan keandalan transaksi dengan memantau aliran dana untuk memverifikasi pergerakan harga.

Risiko Strategis

  1. Sensitivitas parameter: pengaturan parameter untuk beberapa indikator teknis membutuhkan optimasi yang cermat, parameter yang tidak tepat dapat menyebabkan penurunan kinerja.
  2. Ketergantungan pada lingkungan pasar: Kualitas sinyal dapat terpengaruh dalam lingkungan pasar yang sangat berfluktuasi atau likuiditas rendah.
  3. Kompleksitas perhitungan: Perhitungan dalam periode waktu yang panjang dapat menyebabkan sinyal tertunda dan mempengaruhi hasil transaksi yang sebenarnya.
  4. Stop loss adjustment risk: Stop loss dinamis mungkin terlalu radikal atau konservatif dalam kondisi pasar tertentu.
  5. Persyaratan manajemen dana: Strategi memerlukan manajemen dana yang masuk akal untuk menyeimbangkan risiko dan keuntungan.

Arah optimasi strategi

  1. Memperkenalkan adaptasi volatilitas: parameter dapat disesuaikan secara dinamis berdasarkan ATR atau indikator volatilitas lainnya untuk meningkatkan adaptasi strategi.
  2. Optimasi sinyal filter: Anda dapat menambahkan volume transaksi bertimbang atau waktu filter untuk meningkatkan kualitas sinyal.
  3. Peningkatan mekanisme stop loss: dapat digabungkan dengan posisi support dan resistance untuk mengoptimalkan posisi stop loss.
  4. Menambahkan analisis lingkungan pasar: memperkenalkan indikator kekuatan tren pasar, menggunakan pengaturan parameter yang berbeda dalam lingkungan pasar yang berbeda.
  5. Pengelolaan modal yang lebih baik: memperkenalkan algoritma manajemen posisi yang menyesuaikan rasio kepemilikan posisi sesuai dengan kekuatan sinyal dan fluktuasi pasar.

Meringkaskan

Strategi ini menyediakan program perdagangan yang sistematis bagi pedagang melalui analisis teknis dan manajemen risiko cerdas multi-dimensi. Keunggulan utamanya adalah kombinasi dari pelacakan tren dan manajemen risiko dinamis, yang dapat menangkap peluang pasar sambil melindungi keuntungan. Meskipun ada beberapa aspek strategi yang perlu dioptimalkan, namun dengan pengaturan parameter dan kontrol risiko yang masuk akal, masih dapat digunakan sebagai alat perdagangan yang efektif.

Kode Sumber Strategi
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("LL Crypto - SUI", overlay=true)

// Parâmetros de tempo para criptomoedas
fast_ema_len = input.int(11, minval=5, title="Fast EMA")
slow_ema_len = input.int(34, minval=20, title="Slow EMA")
sqm_lengthKC = input.int(20, title="SQM KC Length")
kauf_period = input.int(20, title="Kauf Period")
kauf_mult = input.float(2, title="Kauf Mult factor")
min_profit_sl = input.float(5, minval=0.01, maxval=100.0, title="Min profit to start moving SL [%]")
longest_sl = input.float(10, minval=0.01, maxval=100.0, title="Maximum possible of SL [%]")
sl_step = input.float(0.5, minval=0.0, maxval=1.0, title="Take profit factor")

// Parâmetros adaptados para criptomoedas
CMF_length = input.int(11, minval=1, title="CMF length")
show_plots = input.bool(true, title="Show plots")

// Definir intervalos de tempo para criptomoedas
selected_timeframe = input.string(defval="15", title="Intervalo de Tempo", options=["1", "15", "60"])

lower_resolution = timeframe.period == '1' ? '1' :
                   timeframe.period == '5' ? '15' :
                   timeframe.period == '15' ? '60' :
                   timeframe.period == '60' ? '240' :
                   timeframe.period == '240' ? 'D' :
                   timeframe.period == 'D' ? 'W' : 'M'

sp_close = close[barstate.isrealtime ? 1 : 0]
sp_high = high[barstate.isrealtime ? 1 : 0]
sp_low = low[barstate.isrealtime ? 1 : 0]
sp_volume = volume[barstate.isrealtime ? 1 : 0]

// Calcular Squeeze Momentum ajustado para criptomoedas
sqm_val = ta.linreg(sp_close - math.avg(math.avg(ta.highest(sp_high, sqm_lengthKC), ta.lowest(sp_low, sqm_lengthKC)), ta.sma(sp_close, sqm_lengthKC)), sqm_lengthKC, 0)
close_low = request.security(syminfo.tickerid, lower_resolution, sp_close, lookahead=barmerge.lookahead_on)
high_low = request.security(syminfo.tickerid, lower_resolution, sp_high, lookahead=barmerge.lookahead_on)
low_low = request.security(syminfo.tickerid, lower_resolution, sp_low, lookahead=barmerge.lookahead_on)
sqm_val_low = ta.linreg(close_low - math.avg(math.avg(ta.highest(high_low, sqm_lengthKC), ta.lowest(low_low, sqm_lengthKC)), ta.sma(close_low, sqm_lengthKC)), sqm_lengthKC, 0)

// CMF adaptado para criptomoedas
ad = sp_close == sp_high and sp_close == sp_low or sp_high == sp_low ? 0 : ((2 * sp_close - sp_low - sp_high) / (sp_high - sp_low)) * sp_volume
money_flow = math.sum(ad, CMF_length) / math.sum(sp_volume, CMF_length)

// Condições de entrada para criptomoedas
low_condition_long = (sqm_val_low > sqm_val_low[1])
low_condition_short = (sqm_val_low < sqm_val_low[1])
money_flow_min = (money_flow[4] > money_flow[2]) and (money_flow[3] > money_flow[2]) and (money_flow[2] < money_flow[1]) and (money_flow[2] < money_flow)
money_flow_max = (money_flow[4] < money_flow[2]) and (money_flow[3] < money_flow[2]) and (money_flow[2] > money_flow[1]) and (money_flow[2] > money_flow)
condition_long = ((sqm_val > sqm_val[1])) and money_flow_min and ta.lowest(sqm_val, 5) < 0
condition_short = ((sqm_val < sqm_val[1])) and money_flow_max and ta.highest(sqm_val, 5) > 0
enter_long = low_condition_long and condition_long
enter_short = low_condition_short and condition_short

// Stop conditions
var float current_target_price = na
var float current_sl_price = na
var float current_target_per = na
var float current_profit_per = na

set_targets(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    if isLong
        target := sp_close * (1.0 + current_target_per)
        sl := sp_close * (1.0 - (longest_sl / 100.0))
    else
        target := sp_close * (1.0 - current_target_per)
        sl := sp_close * (1.0 + (longest_sl / 100.0))
    [target, sl]

target_reached(isLong, min_profit, current_target_per, current_profit_per) =>
    float target = na
    float sl = na
    float profit_per = na
    float target_per = na
    if current_profit_per == na
        profit_per := (min_profit * sl_step) / 100.0
    else
        profit_per := current_profit_per + ((min_profit * sl_step) / 100.0)
    target_per := current_target_per + (min_profit / 100.0)
    if isLong
        target := strategy.position_avg_price * (1.0 + target_per)
        sl := strategy.position_avg_price * (1.0 + profit_per)
    else
        target := strategy.position_avg_price * (1.0 - target_per)
        sl := strategy.position_avg_price * (1.0 - profit_per)
    [target, sl, profit_per, target_per]

hl_diff = ta.sma(sp_high - sp_low, kauf_period)
stop_condition_long = 0.0
new_stop_condition_long = sp_low - (hl_diff * kauf_mult)
if (strategy.position_size > 0)
    if (sp_close > current_target_price)
        [target, sl, profit_per, target_per] = target_reached(true, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_long := math.max(stop_condition_long[1], current_sl_price)
else
    stop_condition_long := new_stop_condition_long

stop_condition_short = 99999999.9
new_stop_condition_short = sp_high + (hl_diff * kauf_mult)
if (strategy.position_size < 0)
    if (sp_close < current_target_price)
        [target, sl, profit_per, target_per] = target_reached(false, min_profit_sl, current_target_per, current_profit_per)
        current_target_price := target
        current_sl_price := sl
        current_profit_per := profit_per
        current_target_per := target_per
    stop_condition_short := math.min(stop_condition_short[1], current_sl_price)
else
    stop_condition_short := new_stop_condition_short

// Submit entry orders
if (enter_long and (strategy.position_size <= 0))
    if (strategy.position_size < 0)
        strategy.close(id="SHORT")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(true, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="LONG", direction=strategy.long)

    if show_plots
        label.new(bar_index, sp_high, text="LONG\nSL: " + str.tostring(stop_condition_long), style=label.style_label_down, color=color.green)





if (enter_short and (strategy.position_size >= 0))
    if (strategy.position_size > 0)
        strategy.close(id="LONG")
    current_target_per := (min_profit_sl / 100.0)
    current_profit_per := na
    [target, sl] = set_targets(false, min_profit_sl, current_target_per, current_profit_per)
    current_target_price := target
    current_sl_price := sl
    strategy.entry(id="SHORT", direction=strategy.short)
    if show_plots
        label.new(bar_index, sp_high, text="SHORT\nSL: " + str.tostring(stop_condition_short), style=label.style_label_down, color=color.red)

if (strategy.position_size > 0)
    strategy.exit(id="EXIT LONG", stop=stop_condition_long)

if (strategy.position_size < 0)
    strategy.exit(id="EXIT SHORT", stop=stop_condition_short)

// Plot anchor trend
plotshape(low_condition_long, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(low_condition_short, style=shape.triangledown, location=location.abovebar, color=color.red)

plotshape(condition_long, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(condition_short, style=shape.triangledown, location=location.belowbar, color=color.red)

plotshape(enter_long, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(enter_short, style=shape.triangledown, location=location.bottom, color=color.red)

// Plot emas
plot(ta.ema(close, 20), color=color.blue, title="20 EMA")
plot(ta.ema(close, 50), color=color.orange, title="50 EMA")
plot(ta.sma(close, 200), color=color.red, title="MA 200")

// Plot stop loss values for confirmation
plot(series=(strategy.position_size > 0) and show_plots ? stop_condition_long : na, color=color.green, style=plot.style_linebr, title="Long Stop")
plot(series=(strategy.position_size < 0) and show_plots ? stop_condition_short : na, color=color.green, style=plot.style_linebr, title="Short Stop")
plot(series=(strategy.position_size < 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Short TP")
plot(series=(strategy.position_size > 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Long TP")