Chiến lược giao dịch chéo giữa trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2023-10-13 15:40:49
Tags:

Tổng quan

Chiến lược giao dịch chéo trung bình động đôi tạo ra tín hiệu giao dịch bằng cách tính toán hai đường trung bình động với các thiết lập tham số khác nhau và giao dịch khi đường trung bình động vượt qua.

Chiến lược logic

Logic cốt lõi của chiến lược này là:

  1. Các thông số đầu vào: thời gian MA nhanh hơn maLen1, thời gian MA chậm hơn maLen2, loại MA maTypeChoice

  2. Tính toán MA maValue1 nhanh hơn và MA maValue2 chậm hơn dựa trên các thông số đầu vào

  3. Xác định các điều kiện mua và bán bằng cách so sánh hai MA:

    • Mua khi maValue1 vượt trên maValue2

    • Bán khi maValue1 vượt dưới maValue2

  4. Thực hiện giao dịch bằng tín hiệu mua và bán

  5. Hiển thị MAs trong màu sắc khác nhau dựa trên mối quan hệ của họ

  6. Gửi tín hiệu báo động mua và bán

Ưu điểm

  • Sử dụng hệ thống chéo MA kép, tránh tín hiệu sai từ MA duy nhất

  • Thời gian MA tùy chỉnh phù hợp với các chân trời giao dịch khác nhau

  • Logic đơn giản và thẳng thắn, dễ hiểu và thực hiện

  • Các cảnh báo tín hiệu có thể tùy chỉnh để thực hiện kịp thời

  • Xu hướng MA hiển thị hình thành chỉ số giao dịch trực quan

  • Các tham số tối ưu hóa để tìm kết hợp tốt nhất

  • Áp dụng cho backtesting và giao dịch trực tiếp

Rủi ro

  • MA chéo có thể tạo ra tín hiệu sai, cần thêm xu hướng và xác nhận mô hình

  • Các whipsaws xung quanh MA crossover gây ra chi phí giao dịch không cần thiết

  • Các thông số không chính xác dẫn đến giao dịch quá mức hoặc giao dịch thưa thớt

  • Các sự kiện cực đoan gây ra sự biến động giá rất lớn, không thể hạn chế tổn thất

  • Sự phá vỡ xu hướng dài hạn làm vô hiệu hóa các chỉ số ngắn hạn

  • Cần giám sát thường xuyên, không hoàn toàn tự động

Quản lý rủi ro:

  • Thêm bộ lọc xu hướng để tránh giao dịch chống lại xu hướng

  • Thêm bộ lọc mẫu để xác nhận hiệu lực tín hiệu

  • Tối ưu hóa các tham số cho tần suất giao dịch hợp lý

  • Đặt lệnh dừng lỗ/lấy lợi nhuận để giới hạn lỗ

  • Kiểm tra độ bền trong các khung thời gian dài

  • Các bộ lọc giá và thời gian để tránh các vụ phá vỡ sai

Hướng dẫn tối ưu hóa

  • Kiểm tra các thông số MA khác nhau để tìm ra tối ưu

  • Kiểm tra các loại MA khác nhau cho các tín hiệu chính xác nhất

  • Thêm bộ lọc xu hướng để tránh giao dịch ngược xu hướng

  • Thêm bộ lọc biến động để xác định các điểm thoát thích hợp

  • Thêm bộ lọc giá/thời gian để giảm tín hiệu sai

  • Thực hiện kiểm soát trượt cho giao dịch thực tế

  • Kiểm tra độ bền trên các thiết bị và khung thời gian

  • Tích hợp lỗ dừng tự động / lấy lợi nhuận

  • Khám phá máy học để cải thiện chiến lược

Kết luận

Phân tích trung bình động kép là một chiến lược chỉ số kỹ thuật cổ điển. Nó tạo ra các tín hiệu từ các đường chéo MA và có thể tạo ra kết quả backtest tốt thông qua tối ưu hóa. Tuy nhiên, các rủi ro như tín hiệu sai vẫn còn, đòi hỏi các bộ lọc bổ sung. Giao dịch thực cũng cần các chi tiết thực thi như kiểm soát trượt. Nhìn chung, chiến lược phù hợp với giao dịch trung hạn như một lựa chọn đơn giản và trực quan. Với những cải tiến liên tục và xác nhận độ bền, chiến lược này có thể đạt được lợi nhuận ổn định trong giao dịch trực tiếp.


/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)

maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )

maValue1 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen1 )
else
    0
    
maValue2 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen2 )
else
    0

buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )

mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red 

plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )

var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100

barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")

alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")

// Strategy Tester
stratTesterOn    = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime        = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime        = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss     = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize     = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )

tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)

fixedTPSL        = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue     = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue     = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )

fromDay          = input(defval = 1,    title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth        = input(defval = 1,    title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear         = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay          = input(defval = 1,    title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth        = input(defval = 1,    title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear         = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )

isTime(_position) =>
    range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )

if ( stratTesterOn and window() )
    if ( buySignal and isTime( entryTime ) )
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Buy", strategy.long, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0 )
            strategy.entry( "Buy", strategy.long, contractSize )
            strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        
    if ( sellSignal and isTime( entryTime ))
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Sell", strategy.short, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0  )
            strategy.entry( "Sell", strategy.short, contractSize )
            strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
        if ( maValue1 > maValue2 )
            strategy.entry( "Buy", strategy.long, contractSize )
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        else
            strategy.entry( "Sell", strategy.short, contractSize ) 
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    strategy.close_all( when=not isTime( entryTime ) )

plot( strategy.equity )

Thêm nữa