Chiến lược bao trùm phạm vi trung bình động


Ngày tạo: 2024-01-18 14:56:24 sửa đổi lần cuối: 2024-01-18 14:56:24
sao chép: 0 Số nhấp chuột: 337
1
tập trung vào
1213
Người theo dõi

Chiến lược bao trùm phạm vi trung bình động

Tổng quan

Chiến lược ăn trôi dải trung bình di chuyển là một chiến lược theo dõi xu hướng dựa trên trung bình di chuyển. Nó đánh giá xu hướng giá bằng cách tính toán chéo của hai trung bình di chuyển và kết hợp với quản lý dải để theo dõi xu hướng và tạo ra lợi nhuận.

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

Chiến lược này sử dụng hai đường trung bình di chuyển: đường nhanh và đường chậm. Các tham số đường nhanh nhỏ hơn, nhạy cảm hơn với sự thay đổi giá; tham số đường chậm lớn hơn, đánh giá xu hướng đáng tin cậy hơn.

Ngoài ra, chiến lược này đã giới thiệu nhiều đường trung bình di chuyển phụ trợ để xác định hướng của xu hướng chính và tránh sự cố. Ngoài ra, nó cũng sử dụng hàm Highest và Lowest kết hợp với ATR để tính toán lỗ hổng động và khóa lợi nhuận.

Đối với mỗi giao dịch, chiến lược này có thể chọn đặt hàng số lượng cố định, hoặc tính toán các vị trí theo tỷ lệ phần trăm tổn thất tối đa theo tham số được đặt. Điều này có thể làm cho rủi ro của mỗi giao dịch được kiểm soát trong một phạm vi nhất định.

Phân tích lợi thế

  • Sử dụng hệ thống trung bình di chuyển kép để theo dõi xu hướng giá một cách hiệu quả
  • introdu nhiều điều kiện lọc đồng tuyến và hướng phụ trợ, có thể giảm giao dịch tiếng ồn
  • Tính năng tính toán mức dừng lỗ và điều chỉnh vị trí để hạn chế tổn thất tối đa cho mỗi giao dịch
  • Hệ thống quản lý vị trí có thể tăng lợi nhuận theo chỉ số, trong khi điều khiển rút tiền tối đa trong một phạm vi nhất định

Phân tích rủi ro

  • Chiến lược trung bình di chuyển đôi dễ bị phá sản trong kỳ thu hồi
  • Các điều kiện hỗ trợ đồng nhất và lọc có thể bỏ lỡ một số cơ hội giao dịch
  • Khi thị trường biến động mạnh, lệnh dừng có thể bị phá vỡ, gây ra tổn thất lớn
  • Hành động cực đoan có thể gây thiệt hại lớn khi các vị thế quá lớn

Những rủi ro này có thể được giảm thiểu bằng cách tối ưu hóa các tham số của đường trung bình di chuyển, điều chỉnh trọng lượng của đường trung bình hỗ trợ, sửa đổi tỷ lệ dừng lỗ. Đồng thời kiểm soát chặt chẽ các quy tắc quản lý vị trí, giảm tác động của tổn thất đơn lẻ.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Kiểm tra nhiều loại kết hợp trung bình di chuyển để tìm tham số tối ưu
  2. Thêm chỉ số cường độ xu hướng để tránh biến đổi xu hướng gây thiệt hại
  3. Nghiên cứu các thuật toán tự điều chỉnh để làm cho dừng lỗ thông minh hơn
  4. Tối ưu hóa chương trình quản lý vị trí, cân bằng giữa lợi nhuận và rủi ro

Tóm tắt

Chiến lược tiêu thụ khoảng trung bình di chuyển nói chung là một chiến lược giao dịch định lượng rất thực tế. Nó đồng thời có lợi thế của theo dõi xu hướng và kiểm soát rủi ro, phù hợp với việc giữ vị trí dài. Bằng cách điều chỉnh tham số và tối ưu hóa tính năng mở rộng, chiến lược có thể được làm cho mạnh mẽ hơn và thông minh hơn, do đó có khả năng lợi nhuận lâu dài hơn.

Mã nguồn chiến lược
/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-17 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// This is a simple crossover Moving Average strategy, good for long term crypto trades. 
// It buys when the MA "X" crosses up the MA "Y", viceversa for shorts. 
// Both MAs are selectable from the Inputs section in the front panel. 
// There is also a Position Management option thats 
// sizes positions to have the same USD risk (using leverage) on each trade,
// based on the percentage distance to the stop loss level.
// If you turn this option on you will see how the profit 
// grows exponentially while the drawdown percentage almost remains the same.

strategy("4 MA Strat", overlay=true, pyramiding=1, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     commission_value = 0.04, 
     initial_capital=100, 
     process_orders_on_close=false)

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))

//Inputs
PSMGMT=input(defval=false, title="Position Management")
risk_per_trade=input(defval=5, title="Risk Per Trade % (for PSMGMT)", step=0.5)*.01

//SL & TP Inputs
i_SL=input(true, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(10, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=1, title="SL Expander")

i_MAFilter=input(false, title="Use MA4 as Bull / Bear filter")

//MA Type Selector
MAtype = input(false, title="----------------MA Selector-----------------")
MA1Period = input(9, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])
MA2Period = input(21, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])
MA3Period = input(50, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])
MA4Period = input(100, title="MA4 Period")
MA4Type = input(title="MA4 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])

//MA Selector 
MA1 = if MA1Type == "SMA"
    sma(close, MA1Period)
else
    if MA1Type == "EMA"
        ema(close, MA1Period)
    else
        if MA1Type == "WMA"
            wma(close, MA1Period)
        else
            if MA1Type == "RMA"
                rma(close, MA1Period)
            else
                if MA1Type == "HMA"
                    hma(close, MA1Period)
                else
                    if MA1Type == "ALMA"
                        alma(close, MA1Period, 0.85, 6)
                    
MA2 = if MA2Type == "SMA"
    sma(close, MA2Period)
else
    if MA2Type == "EMA"
        ema(close, MA2Period)
    else
        if MA2Type == "WMA"
            wma(close, MA2Period)
        else
            if MA2Type == "RMA"
                rma(close, MA2Period)
            else
                if MA2Type == "HMA"
                    hma(close, MA2Period)
                else
                    if MA2Type == "ALMA"
                        alma(close, MA2Period, 0.85, 6)
                            
MA3 = if MA3Type == "SMA"
    sma(close, MA3Period)
else
    if MA3Type == "EMA"
        ema(close, MA3Period)
    else
        if MA3Type == "WMA"
            wma(close, MA3Period)
        else
            if MA3Type == "RMA"
                rma(close, MA3Period)
            else
                if MA3Type == "HMA"
                    hma(close, MA3Period)
                else
                    if MA3Type == "ALMA"
                        alma(close, MA3Period, 0.85, 6)
                    
MA4 = if MA4Type == "SMA"
    sma(close, MA4Period)
else
    if MA4Type == "EMA"
        ema(close, MA4Period)
    else
        if MA4Type == "WMA"
            wma(close, MA4Period)
        else
            if MA4Type == "RMA"
                rma(close, MA4Period)
            else
                if MA4Type == "HMA"
                    hma(close, MA4Period)
                else
                    if MA4Type == "ALMA"
                        alma(close, MA4Period, 0.85, 6)
                    
// X Y Logic
x=input(title="x", defval="close", options=["MA1", "MA2", "MA3", "MA4", "close"])
y=input(title="y", defval="MA1", options=["MA1", "MA2", "MA3", "MA4", "close"])

X = if x == "MA1"
    MA1
else
    if x == "MA2"
        MA2
    else
        if x == "MA3"
            MA3
        else
            if x == "MA4"
                MA4
            else
                if x == "close"
                    close
                    
Y = if y == "MA1"
    MA1
else
    if y == "MA2"
        MA2
    else
        if y == "MA3"
            MA3
        else
            if y == "MA4"
                MA4
            else
                if y == "close"
                    close

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na

//Position Management Calculations
capital=strategy.equity
distance_to_long_stop_loss=1-(LSL/strategy.position_avg_price)
distance_to_short_stop_loss=(SSL/strategy.position_avg_price)-1
PS=(capital*risk_per_trade)/distance_to_long_stop_loss
SPS=(capital*risk_per_trade)/distance_to_short_stop_loss
PSqty=PS/close
SPSqty=SPS/close

//Strategy Calculations
MAFilter=close > MA4
BUY = crossover(X , Y) 
SELL = crossunder(X , Y) 
BUY2 = crossover(X , Y) and MAFilter
SELL2 = crossunder(X , Y) and not MAFilter

//Entries
strategy.entry("long", true, qty=PSMGMT ? PSqty : na, when=not i_MAFilter ? BUY : BUY2)
strategy.entry("short", false, qty=PSMGMT ? SPSqty : na, when=not i_MAFilter ? SELL : SELL2)

//Exits
if i_SL //and SL != na
    strategy.exit("longexit", "long", stop=LSL)
    strategy.exit("shortexit", "short", stop=SSL)
if i_MAFilter
    strategy.close("long", when=SELL)
    strategy.close("short", when=BUY)


//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(MA1, color=color.green, linewidth=1, title="MA1")
plot(MA2, color=color.yellow, linewidth=2, title="MA2")
plot(MA3, color=color.red, linewidth=3, title="MA3")
plot(MA4, color=color.white, linewidth=3, title="MA4")
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")


//Debugging Plots
plot(LSL, transp=100, title="SwingLow")
plot(bought ? 1:0, transp=100, title="bought")
plot(PSqty, title="PSqty", transp=100)
plot(SPSqty, title="SPSqty", transp=100)
plot(PS, title="PS", transp=100)
plot(SPS, title="SPS", transp=100)
plot(distance_to_long_stop_loss, title="distance to LSL", transp=100)
plot(distance_to_short_stop_loss, title="distance to SSL", transp=100)
plot(capital, title="equity", transp=100)