Chiến lược bật trung bình chuyển động theo cấp số nhân (EMA) là một chiến lược theo dõi sự đột phá giá của đường trung bình chuyển động. Nó kiểm tra xem nến có bật trở lại từ dưới đường trung bình chuyển động hay không. Nếu có, đó là một tín hiệu tăng; nếu nến bật xuống từ trên đường trung bình chuyển động, đó là một tín hiệu giảm.
Chiến lược thoát trung bình chuyển động theo hàm số
Chiến lược này dựa trên đường trung bình động theo cấp số nhân (EMA). Nó tính toán đường EMA trong thời gian thực. Sau đó nó kiểm tra xem giá có bật trở lại từ đường EMA hay không:
Sự phục hồi như vậy là tín hiệu đầu vào cho chiến lược.
Chiến lược thoát EMA chỉ được thực hiện sau khi xác nhận sự đảo ngược giá, tránh giao dịch chống lại xu hướng và bị mắc kẹt.
Bằng cách sử dụng đường trung bình động theo cấp số nhân, chiến lược có thể làm mịn dữ liệu giá và lọc tiếng ồn thị trường hiệu quả, dẫn đến giảm giá nhỏ và lợi nhuận lịch sử tốt.
Chiến lược EMA phục hồi chỉ dựa vào đường trung bình động, điều này rất dễ hiểu cho người mới bắt đầu.
Thường có những sự đột phá sai dày đặc xung quanh đường EMA, có thể gây ra tín hiệu sai. Các thông số EMA cần được điều chỉnh để lọc tiếng ồn.
Chiến lược về cơ bản giao dịch cùng với xu hướng. Nó không thể dự đoán các điểm chuyển đổi giá và chỉ có thể theo xu hướng. Điều này có thể bỏ lỡ cơ hội đầu vào tốt nhất trong các điều chỉnh chu kỳ.
Đặt lỗ gần đường trung bình động đôi khi bị trúng, dẫn đến tổn thất mở rộng.
Các chỉ số như RSI và MACD có thể được thêm vào để xác nhận sự đảo ngược giá và lọc ra các tín hiệu sai.
Các phương pháp dừng lỗ linh hoạt hơn như dừng thời gian và dừng biến động có thể được sử dụng để giảm rủi ro bị rút.
Tối ưu hóa các thông số EMA thời gian để tìm kết hợp thông số tốt nhất. Các thông số EMA cũng có thể được biến động để theo dõi chu kỳ thị trường.
Chiến lược EMA là một chiến lược theo xu hướng đơn giản và thực tế. Nó có những drawdown nhỏ và dễ hiểu. Đồng thời, nó cũng có một số rủi ro của tín hiệu sai và bị dừng lại. Chúng ta có thể tối ưu hóa chiến lược bằng cách sử dụng kết hợp chỉ số tốt hơn, phương pháp dừng lỗ và lựa chọn tham số để làm cho nó trở thành một chiến lược định lượng ổn định và đáng tin cậy.
/*backtest start: 2022-12-01 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © tweakerID // Simple strategy that checks for price bounces over an Exponential Moving Average. If the CLOSE of the candle bounces // back from having it's LOW below the EMA, then it's a Bull Bounce. If the CLOSE of the candle bounces down from having it's // high above the EMA, then it's a Bear Bounce. This logic can be reverted. //@version=4 strategy("EMA Bounce", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, commission_value=0.04, calc_on_every_tick=false, slippage=0) direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) /////////////////////// STRATEGY INPUTS //////////////////////////////////////// title1=input(true, "-----------------Strategy Inputs-------------------") i_EMA=input(20, title="EMA Length") /////////////////////// BACKTESTER ///////////////////////////////////////////// title2=input(true, "-----------------General Inputs-------------------") // Backtester General Inputs i_SL=input(true, title="Use Swing Stop Loss and Take Profit") i_SPL=input(defval=10, title="Swing Point Loopback") i_PercIncrement=input(defval=.2, step=.1, title="Swing Point SL Perc Increment")*0.01 i_TPRRR = input(1.2, step=.1, title="Take Profit Risk Reward Ratio") // Bought and Sold Boolean Signal bought = strategy.position_size > strategy.position_size[1] or strategy.position_size < strategy.position_size[1] // Price Action Stop and Take Profit LL=(lowest(i_SPL))*(1-i_PercIncrement) HH=(highest(i_SPL))*(1+i_PercIncrement) LL_price = valuewhen(bought, LL, 0) HH_price = valuewhen(bought, HH, 0) entry_LL_price = strategy.position_size > 0 ? LL_price : na entry_HH_price = strategy.position_size < 0 ? HH_price : na tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR /////////////////////// STRATEGY LOGIC ///////////////////////////////////////// EMA=ema(close, i_EMA) LowAboveEMA=low > EMA LowBelowEMA=low < EMA HighAboveEMA=high > EMA HighBelowEMA=high < EMA BullBounce=LowAboveEMA[1] and LowBelowEMA and close > EMA //and close > open BearBounce=HighBelowEMA[1] and HighAboveEMA and close < EMA //and close < open plot(EMA) BUY=BullBounce SELL=BearBounce //Inputs DPR=input(false, "Allow Direct Position Reverse") reverse=input(false, "Reverse Trades") // Entries if reverse if not DPR strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0) strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0) else strategy.entry("long", strategy.long, when=SELL) strategy.entry("short", strategy.short, when=BUY) else if not DPR strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0) strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0) else strategy.entry("long", strategy.long, when=BUY) strategy.entry("short", strategy.short, when=SELL) SL=entry_LL_price SSL=entry_HH_price TP=tp STP=stp strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL) strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL) /////////////////////// PLOTS ////////////////////////////////////////////////// plot(strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red) plot(strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red) plot(strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green) plot(strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green) // Draw price action setup arrows plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup", transp=80, size=size.auto) plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup", transp=80, size=size.auto)