Chiến lược giao dịch trung bình di chuyển hai thân tàu

Tác giả:ChaoZhang, Ngày: 2023-12-11 11:30:15
Tags:

img

Tổng quan

Chiến lược giao dịch trung bình di chuyển kép là một chiến lược giao dịch định lượng sử dụng trung bình di chuyển kép như tín hiệu giao dịch. Nó dựa trên phương pháp phân tích kỹ thuật truyền thống sử dụng một đường trung bình di chuyển duy nhất và thay thế nó bằng trung bình di chuyển kép để đưa ra các quyết định dài và ngắn tại các điểm chéo.

Nguyên tắc

Cốt lõi của chiến lược giao dịch trung bình chuyển động hai thân là trung bình chuyển động hai thân (DHMA). DHMA bao gồm ba dòng: đường ray giữa, trên và dưới, đại diện cho các giá trị giá trung bình khác nhau.

Đường sắt trung tâm: Mode ((modeSwitch, src, len)
Đường sắt trên: HULL[0] Đường sắt dưới: HULL [2]

Ở đây hàm Mode có thể chọn giữa các biến thể Hull MA khác nhau như HMA, EHMA hoặc THMA. Src là nguồn giá, và len là tham số thời gian.

Chiến lược sử dụng đường ray giữa của DHMA như một tham chiếu để xác định mối quan hệ giá và tạo ra các tín hiệu giao dịch:

  • Khi giá vượt qua đường sắt giữa, đi dài.
  • Khi giá vượt dưới đường sắt giữa, đóng vị trí.

Nói cách khác, nếu giá đóng cửa của thanh hiện tại cao hơn giá trị đường ray giữa, hãy mua dài trên thanh tiếp theo; nếu giá đóng cửa thấp hơn, đóng lệnh dài trên thanh tiếp theo.

Ưu điểm

Chiến lược giao dịch trung bình di chuyển hai khung có những lợi thế sau:

  1. Sử dụng cơ chế ba dải thay vì một đường trung bình động duy nhất để có hiệu ứng hỗ trợ / kháng cự tốt hơn và theo dõi xu hướng.

  2. So với các MAs thông thường, Các trung bình di chuyển Hull có sự chậm trễ ít hơn và phản ứng tốt hơn với những thay đổi giá.

  3. Sử dụng các kỹ thuật phân tích kỹ thuật truyền thống để dễ hiểu, phù hợp với giao dịch algo.

  4. Logic là đơn giản và rõ ràng, dễ thực hiện, phù hợp với giao dịch thuật toán tần số cao.

  5. Các loại và tham số MA Hull có thể tùy chỉnh để tối ưu hóa trên các sản phẩm và khung thời gian khác nhau.

Rủi ro

Mặc dù có nhiều ưu điểm, chiến lược này cũng đặt ra một số rủi ro cần lưu ý:

  1. Các thông số điều chỉnh tinh tế để lọc ra một số giao dịch ồn ào.

  2. Chiến lược chủ yếu theo xu hướng, ít hiệu quả hơn trong thời gian phẳng.

  3. Hull MAs vẫn có một số mức độ chậm trễ, đặc biệt là trong thời gian ngắn.

  4. Các tín hiệu thường xuyên có thể dẫn đến giao dịch quá mức.

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

Dưới đây là một số khía cạnh chính để tối ưu hóa cho chiến lược:

  1. Tối ưu hóa các loại và tham số MA Hull để điều chỉnh độ nhạy của đường sắt giữa cho các sản phẩm khác nhau.

  2. Thêm các cơ chế dừng lỗ như dừng lại hoặc dừng lỗ gia tăng để kiểm soát số tiền lỗ giao dịch duy nhất.

  3. Kết hợp với các chỉ số khác để xác định hướng và sức mạnh của xu hướng, tránh những cái bẫy.

  4. Thêm các điều kiện kích hoạt chiến lược dựa trên số lượng giao dịch hoặc tỷ lệ lợi nhuận để kiểm soát số lượng kết thúc chu kỳ, giảm việc thoát.

  5. Sử dụng TF cao hơn để quyết định xu hướng tổng thể để tránh tiếng ồn.

  6. Cải thiện logic nhập, xác nhận nhập bằng các mẫu nến để tăng độ chắc chắn nhập.

Kết luận

Tóm lại, Chiến lược giao dịch trung bình chuyển động hai khung (Dual Hull Moving Average Trading Strategy) là một phương pháp định lượng sử dụng phản ứng nhanh, theo xu hướng theo Trung bình chuyển động khung để xây dựng các tín hiệu giao dịch. So với các MAs truyền thống, nó có phản ứng nhanh hơn và khả năng theo dõi tốt hơn.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite Strategy", overlay=true, pyramiding=1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
HAClose = security(heikinashi(syminfo.tickerid), timeframe.period, close)
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(55, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)


if HULL[0] > HULL[2] and testPeriod()
    strategy.entry("long", strategy.long)
if HULL[0] < HULL[2] and testPeriod()
    strategy.close("long")

Thêm nữa