Sumber dimuat naik... memuat...

Strategi Perdagangan Squeeze EMA-Stop-Loss Dinamis Berbilang Jangka Masa

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

img

Ringkasan

Strategi ini adalah sistem dagangan dinamik berdasarkan analisis pelbagai jangka masa, menggabungkan Purata Bergerak Eksponensial (EMA), Penunjuk Momentum Squeeze (SQM), dan Indeks Aliran Wang (CMF) untuk penjanaan isyarat. Konsep teras melibatkan pengesahan trend melalui pelbagai jangka masa dan pengoptimuman stop-loss dinamik untuk pengurusan risiko. Strategi ini menggunakan skema stop-loss dan mengambil keuntungan adaptif yang menyesuaikan parameter dagangan secara automatik berdasarkan turun naik pasaran.

Prinsip Strategi

Strategi ini menggunakan tiga penunjuk teknikal utama untuk mengenal pasti peluang perdagangan. Pertama, ia menggunakan EMA 11 tempoh dan 34 tempoh untuk menentukan arah trend pasaran. Kedua, ia menggunakan penunjuk Squeeze Momentum yang diubah suai untuk mengesan tekanan pasaran dan peluang pecah berpotensi, dikira melalui regresi linear penyimpangan harga. Akhirnya, ia mengesahkan arah perdagangan melalui penunjuk Aliran Wang yang diubah suai, memastikan modal yang mencukupi menyokong pergerakan harga. Strategi menetapkan tahap stop-loss dinamik selepas pengesahan, yang secara automatik menyesuaikan isyarat apabila keuntungan meningkat, melindungi keuntungan sambil membenarkan turun naik harga.

Kelebihan Strategi

  1. Pengesahan isyarat pelbagai dimensi: Mengurangkan isyarat palsu dengan ketara melalui integrasi pelbagai penunjuk teknikal dan jangka masa.
  2. Pengurusan risiko yang pintar: Sistem stop-loss dinamik menyesuaikan diri secara automatik berdasarkan turun naik pasaran, melindungi keuntungan sambil mengelakkan keluar awal.
  3. Kemudahan penyesuaian yang tinggi: Parameter strategi boleh disesuaikan dengan keadaan pasaran yang berbeza.
  4. Kitaran dagangan lengkap: Peraturan yang jelas dari kemasukan ke pengurusan keluar mengurangkan pengaruh penilaian subjektif.
  5. Pengesahan aliran wang: Memvalidasi trend harga melalui pemantauan aliran wang, meningkatkan kebolehpercayaan perdagangan.

Risiko Strategi

  1. Sensitiviti parameter: Beberapa parameter penunjuk teknikal memerlukan pengoptimuman yang teliti.
  2. Ketergantungan persekitaran pasaran: Kualiti isyarat boleh terjejas di pasaran yang sangat tidak menentu atau likuiditi rendah.
  3. Kerumitan pengiraan: Pengiraan pelbagai jangka masa boleh menyebabkan kelewatan isyarat.
  4. Risiko penyesuaian stop-loss: Stop dinamik boleh menjadi terlalu agresif atau konservatif dalam keadaan pasaran tertentu.
  5. Keperluan pengurusan modal: Strategi memerlukan pengurusan dana yang betul untuk mengimbangi risiko dan ganjaran.

Arahan pengoptimuman

  1. Memperkenalkan penyesuaian turun naik: Sesuaikan parameter secara dinamik berdasarkan ATR atau penunjuk turun naik lain.
  2. Mengoptimumkan penapisan isyarat: Tambah berat volum atau penapisan masa untuk meningkatkan kualiti isyarat.
  3. Meningkatkan mekanisme stop-loss: Mengoptimumkan penempatan stop-loss menggunakan tahap sokongan dan rintangan.
  4. Analisis persekitaran pasaran yang dipertingkatkan: Memperkenalkan penunjuk kekuatan trend untuk keadaan pasaran yang berbeza.
  5. Pengurusan modal yang halus: Melaksanakan algoritma saiz kedudukan berdasarkan kekuatan isyarat dan turun naik pasaran.

Ringkasan

Strategi ini menawarkan peniaga pendekatan perdagangan yang sistematik melalui analisis teknikal berbilang dimensi dan pengurusan risiko pintar. Kekuatannya terletak pada menggabungkan trend berikut dengan pengurusan risiko dinamik, menangkap peluang pasaran sambil melindungi keuntungan. Walaupun terdapat aspek yang memerlukan pengoptimuman, strategi ini boleh berfungsi sebagai alat perdagangan yang berkesan dengan tetapan parameter yang betul dan kawalan risiko.


/*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 lanjut