Chiến lược giao dịch đột phá Pullback Triple EMA


Ngày tạo: 2023-09-12 15:12:56 sửa đổi lần cuối: 2023-09-12 15:12:56
sao chép: 0 Số nhấp chuột: 802
1
tập trung vào
1617
Người theo dõi

Chiến lược này là một chiến lược theo dõi xu hướng, nhằm nắm bắt cơ hội điều chỉnh xu hướng trong xu hướng đường dài và đường dài.

Nguyên tắc chiến lược:

  1. Cài đặt ba EMA nhanh, trung bình và chậm, các tham số điển hình là 25, 100 và 200 chu kỳ.

  2. Khi giá trên hồi động chạm đến EMA nhanh nhất, nó được coi là giao dịch đa đầu đường dài trung bình, và khi giá dưới hồi động chạm đến EMA nhanh nhất, nó được coi là giao dịch trống.

  3. Khi bắt đầu hồi phục ở cuối hồi phục trên, làm nhiều hơn khi phá vỡ EMA nhanh nhất; khi bắt đầu hồi phục ở cuối hồi phục dưới, làm trống khi giảm EMA nhanh nhất.

  4. Các khu vực mua bán được đánh dấu bằng màu sắc để làm cho hình ảnh trực quan.

  5. Thiết lập dừng lỗ cố định, tỷ lệ lợi nhuận rủi ro và quản lý rủi ro.

Lợi thế của chiến lược này:

  1. Giao dịch quay lại có tỷ lệ thành công cao hơn.

  2. 3 EMA đánh giá xu hướng, tránh bị lôi kéo.

  3. Tỷ lệ lợi nhuận rủi ro cao hơn so với kiểm soát tăng hiệu suất bền vững.

Chiến lược này có những rủi ro:

  1. Thời gian quay trở lại quá dài có thể làm bạn bỏ lỡ điểm đến tốt nhất.

  2. Cần tối ưu hóa tham số EMA để phù hợp với các chu kỳ khác nhau.

  3. Cốp dừng cố định có thể quá cơ học và cần thiết lập hợp lý.

Tóm lại, chiến lược này giúp theo dõi xu hướng đường dài trung bình thông qua đột phá điều chỉnh EMA ba lần. Cơ chế kiểm soát rủi ro có thể giúp thu được lợi nhuận ổn định trong thời gian dài, nhưng các nhà đầu tư vẫn cần chú ý đến việc tối ưu hóa tham số và phán đoán điều chỉnh.

Mã nguồn chiến lược
/*backtest
start: 2023-09-04 00:00:00
end: 2023-09-11 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Pullback", overlay=true, initial_capital=1000, slippage=25)

averageData = input.source(close, title="Source")
target_stop_ratio = input.float(title="Ratio Risk/Reward", defval=2, group="Money Management")
security = input.float(50, title='min of pips (00001.00) for each position', group="Money Management")
risk = input.float(2, title="Risk per Trade %", group="Money Management")

riskt = risk / 100 + 1

ema1V = input.int(25, title="Rapide", group="Ema Period")
ema2V = input.int(100, title="Moyenne", group="Ema Period")
ema3V = input.int(200, title="Lente", group="Ema Period")

ema1 = ta.ema(averageData, ema1V)
ema2 = ta.ema(averageData, ema2V)
ema3 = ta.ema(averageData, ema3V)

useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
     group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
     title="End Date", group="Backtest Time Period",
     tooltip="This end date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")

inTradeWindow = true

float pricePullAboveEMA_maxClose = na
float pricePullBelowEMA_minClose = na

if ta.crossover(close, ema1)
    pricePullAboveEMA_maxClose := close
  
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]

if close > pricePullAboveEMA_maxClose
    pricePullAboveEMA_maxClose := close

if ta.crossunder(close, ema1)
    pricePullBelowEMA_minClose := close
 
else
    pricePullBelowEMA_minClose := pricePullBelowEMA_minClose[1]

if close < pricePullBelowEMA_minClose
    pricePullBelowEMA_minClose := close

BuyZone = ema1 > ema2 and ema2 > ema3
SellZone = ema1 < ema2 and ema2 < ema3

longcondition = ta.crossover(close, ema1) and pricePullBelowEMA_minClose > ema3 and pricePullBelowEMA_minClose < ema1 
shortcondition = ta.crossunder(close , ema1) and pricePullAboveEMA_maxClose < ema3 and pricePullAboveEMA_maxClose > ema1

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

risk_long := risk_long[1]
risk_short := risk_short[1]

lotB = (strategy.equity*riskt-strategy.equity)/(close - ema2)
lotS = (strategy.equity*riskt-strategy.equity)/(ema2 - close)

if strategy.position_size == 0 and BuyZone and longcondition and inTradeWindow
    risk_long := (close - ema2) / close
    minp = close - ema2
    if minp > security
        strategy.entry("long", strategy.long, qty=lotB)
    
if strategy.position_size == 0 and SellZone and shortcondition and inTradeWindow
    risk_short := (ema2 - close) / close
    minp = ema2 - close
    if minp > security
        strategy.entry("short", strategy.short, qty=lotS)
    
if strategy.position_size > 0

    stopLoss := strategy.position_avg_price * (1 - risk_long)
    takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit)
    
if strategy.position_size < 0

    stopLoss := strategy.position_avg_price * (1 + risk_short)
    takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit)
    
plot(ema1, color=color.blue, linewidth=2, title="Ema Rapide")
plot(ema2, color=color.orange, linewidth=2, title="Ema Moyenne")
plot(ema3, color=color.white, linewidth=2, title="Ema Lente")
p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))

bgcolor(BuyZone ? color.new(color.green, 95)  : na)
bgcolor(SellZone ? color.new(color.red, 95)  : na)