Chiến lược thoát trung bình chuyển động theo hàm số

Tác giả:ChaoZhang, Ngày: 2023-12-08 16:47:39
Tags:

img

Tổng quan chiến lược

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.

Tên chiến lược

Chiến lược thoát trung bình chuyển động theo hàm số

Chiến lược logic

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:

  • Nếu giá đầu tiên phá vỡ đường EMA và sau đó phục hồi trở lại trên đường EMA, đó là một tín hiệu tăng
  • Nếu giá đầu tiên phá vỡ đường EMA và sau đó giảm xuống dưới đường EMA, đó là một tín hiệu giảm

Sự phục hồi như vậy là tín hiệu đầu vào cho chiến lược.

Phân tích lợi thế

Giao dịch theo xu hướng, tránh bị mắc kẹt

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.

Lượng thu nhỏ, lợi nhuận lịch sử tố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.

Dễ hiểu, điều chỉnh tham số linh hoạ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.

Phân tích rủi ro

Thường bị tín hiệu sai

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.

Giao dịch theo xu hướng, không thể dự đoán các bước ngoặt

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ỳ.

Stop loss dễ bị loại bỏ

Đặt lỗ gần đường trung bình động đôi khi bị trúng, dẫn đến tổn thất mở rộng.

Tối ưu hóa

Tích hợp các chỉ số khác để lọc tín hiệu

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.

Tối ưu hóa phương pháp dừng lỗ

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 tham số

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.

Kết luận

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)


Thêm nữa