Sumber daya yang dimuat... Pemuatan...

Strategi perdagangan EMA-Squeeze Stop-Loss Dinamis Multi-Timeframe

Penulis:ChaoZhang, Tanggal: 2024-12-11 15:50:38
Tag:EMASQMCMFKCSLTPMTF

img

Gambaran umum

Strategi ini adalah sistem perdagangan dinamis yang didasarkan pada analisis multi-frame waktu, menggabungkan Exponential Moving Averages (EMA), Squeeze Momentum Indicator (SQM), dan Money Flow Index (CMF) untuk generasi sinyal. Konsep inti melibatkan konfirmasi tren melalui beberapa kerangka waktu dan optimasi stop-loss dinamis untuk manajemen risiko. Strategi ini menggunakan skema stop-loss dan profit-taking adaptif yang secara otomatis menyesuaikan parameter perdagangan berdasarkan volatilitas pasar.

Prinsip Strategi

Strategi ini menggunakan tiga indikator teknis utama untuk mengidentifikasi peluang perdagangan. Pertama, ia menggunakan EMA 11 periode dan 34 periode untuk menentukan arah tren pasar. Kedua, ia menggunakan indikator Squeeze Momentum yang dimodifikasi untuk mendeteksi tekanan pasar dan peluang breakout potensial, yang dihitung melalui regresi linier deviasi harga. Akhirnya, ia mengkonfirmasi arah perdagangan melalui indikator Aliran Uang yang dimodifikasi, memastikan modal yang cukup mendukung pergerakan harga. Strategi menetapkan tingkat stop-loss dinamis setelah konfirmasi, yang secara otomatis menyesuaikan sinyal saat keuntungan meningkat, melindungi keuntungan sambil memungkinkan fluktuasi harga.

Keuntungan Strategi

  1. Konfirmasi sinyal multi-dimensi: Mengurangi sinyal palsu secara signifikan melalui integrasi beberapa indikator teknis dan kerangka waktu.
  2. Manajemen risiko cerdas: Sistem stop-loss dinamis secara otomatis menyesuaikan berdasarkan volatilitas pasar, melindungi keuntungan sambil menghindari keluar prematur.
  3. Kemampuan beradaptasi yang tinggi: Parameter strategi dapat disesuaikan dengan kondisi pasar yang berbeda.
  4. Siklus perdagangan lengkap: Aturan yang jelas dari manajemen masuk ke keluar mengurangi pengaruh penilaian subjektif.
  5. Konfirmasi arus uang: Memvalidasi tren harga melalui pemantauan arus uang, meningkatkan keandalan perdagangan.

Risiko Strategi

  1. Sensitivitas parameter: Beberapa parameter indikator teknis membutuhkan optimasi yang cermat.
  2. Ketergantungan lingkungan pasar: Kualitas sinyal dapat terpengaruh di pasar yang sangat volatile atau likuiditas rendah.
  3. Kompleksitas komputasi: Perhitungan multi-timeframe dapat menyebabkan keterlambatan sinyal.
  4. Risiko penyesuaian stop-loss: Stop dinamis dapat menjadi terlalu agresif atau konservatif dalam kondisi pasar tertentu.
  5. Persyaratan manajemen modal: Strategi membutuhkan manajemen dana yang tepat untuk menyeimbangkan risiko dan imbalan.

Arahan Optimasi

  1. Memperkenalkan adaptasi volatilitas: Sesuaikan parameter secara dinamis berdasarkan ATR atau indikator volatilitas lainnya.
  2. Optimalkan penyaringan sinyal: Tambahkan bobot volume atau penyaringan waktu untuk meningkatkan kualitas sinyal.
  3. Memperbaiki mekanisme stop-loss: Optimalkan penempatan stop-loss menggunakan level support dan resistance.
  4. Analisis lingkungan pasar yang ditingkatkan: Memperkenalkan indikator kekuatan tren untuk kondisi pasar yang berbeda.
  5. Manajemen modal yang disempurnakan: Mengimplementasikan algoritma ukuran posisi berdasarkan kekuatan sinyal dan volatilitas pasar.

Ringkasan

Strategi ini menawarkan pedagang pendekatan perdagangan yang sistematis melalui analisis teknis multidimensi dan manajemen risiko cerdas. Kekuatannya utama terletak pada menggabungkan tren mengikuti dengan manajemen risiko dinamis, menangkap peluang pasar sambil melindungi keuntungan. Meskipun ada aspek yang membutuhkan optimasi, strategi dapat berfungsi sebagai alat perdagangan yang efektif dengan pengaturan parameter yang tepat dan kontrol risiko. Pedagang disarankan untuk melakukan backtesting menyeluruh dan optimasi parameter sebelum implementasi langsung, secara bertahap menyempurnakan sistem perdagangan berdasarkan pengalaman pasar.


/*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")


Berkaitan

Lebih banyak