Chiến lược giao cắt đường trung bình động hàm mũ nhiều thời kỳ

EMA SL TP TF
Ngày tạo: 2024-07-30 12:02:23 sửa đổi lần cuối: 2024-07-30 12:02:23
sao chép: 3 Số nhấp chuột: 618
1
tập trung vào
1617
Người theo dõi

Chiến lược giao cắt đường trung bình động hàm mũ nhiều thời kỳ

Tổng quan

Chiến lược chéo trung bình di chuyển chỉ số nhiều chu kỳ thời gian này là một hệ thống giao dịch tự động dựa trên tín hiệu chéo EMA. Nó sử dụng các EMA trong các chu kỳ thời gian khác nhau để tạo ra tín hiệu giao dịch và kết hợp các cơ chế dừng lỗ và kết thúc lợi nhuận để quản lý rủi ro. Chiến lược này chủ yếu dựa trên EMA nhanh và EMA chậm và EMA chu kỳ thời gian cao hơn để xác định các giao dịch tiềm năng.

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

Nguyên tắc cốt lõi của chiến lược này là sử dụng chỉ số di chuyển trung bình (EMA) trong nhiều chu kỳ thời gian để xác định xu hướng thị trường và tạo tín hiệu giao dịch. Cụ thể:

  1. Sử dụng EMA 9 chu kỳ làm đường nhanh, EMA 50 chu kỳ làm đường chậm và EMA 100 chu kỳ trên chu kỳ thời gian 15 phút làm đường tham chiếu chu kỳ thời gian cao hơn.

  2. Điều kiện mua:

    • trên EMA nhanh vượt qua EMA chậm và EMA nhanh nằm trên EMA giai đoạn thời gian cao hơn; hoặc
    • EMA nhanh hơn trên EMA thời gian cao hơn.
  3. Điều kiện bán tín hiệu:

    • EMA nhanh nằm dưới EMA chậm và EMA nhanh nằm dưới EMA của chu kỳ thời gian cao hơn; hoặc
    • Tốc độ EMA dưới EMA thời gian cao hơn.
  4. Quản lý giao dịch:

    • Đặt mục tiêu dừng lỗ cố định (SL) và mục tiêu thu lợi nhuận (TP).
    • Khi giá đạt mục tiêu lợi nhuận đầu tiên (TP1), vị thế 25% sẽ được thanh toán và dừng lỗ sẽ được di chuyển đến vị trí bảo vệ.
    • Các vị thế còn lại tiếp tục hoạt động đến mục tiêu lợi nhuận thứ hai ((TP2) hoặc dừng lỗ)).
  5. Kiểm soát thời gian giao dịch:

    • Bạn có thể đặt thời gian giao dịch và ngày giao dịch cụ thể.

Lợi thế chiến lược

  1. Phân tích nhiều chu kỳ thời gian: kết hợp các EMA trong các chu kỳ thời gian khác nhau, giúp giảm tín hiệu giả và cải thiện chất lượng giao dịch.

  2. Theo dõi xu hướng: có thể nắm bắt được xu hướng thị trường hiệu quả thông qua các mối quan hệ giao dịch và vị trí của EMA.

  3. Quản lý rủi ro: Sử dụng chiến lược dừng lỗ cố định và tăng lợi nhuận theo từng bước, hạn chế tổn thất tiềm ẩn và cho phép lợi nhuận tiếp tục tăng.

  4. Tính linh hoạt: Các tham số EMA, mức dừng lỗ và lợi nhuận có thể được điều chỉnh theo các thị trường và phong cách giao dịch khác nhau.

  5. Tự động hóa: Chiến lược có thể thực hiện giao dịch tự động hóa hoàn toàn thông qua nền tảng TradingView và PineConnector.

  6. Quản lý thời gian: Bạn có thể đặt thời gian và ngày giao dịch cụ thể để tránh giao dịch trong môi trường thị trường bất lợi.

Rủi ro chiến lược

  1. Sự chậm trễ: EMA về bản chất là một chỉ số chậm trễ, có thể không phản ứng kịp thời trong thị trường biến động mạnh.

  2. Tín hiệu giả: Trong thị trường ngang, giao dịch EMA có thể tạo ra các tín hiệu giả thường xuyên, dẫn đến giao dịch quá mức.

  3. Hạn chế cố định: Hạn chế sử dụng số điểm cố định có thể không phù hợp với tất cả các điều kiện thị trường và đôi khi có thể quá lớn hoặc quá nhỏ.

  4. Tùy thuộc vào dữ liệu lịch sử: hiệu quả của chiến lược phụ thuộc rất nhiều vào hành vi của thị trường trong thời gian đánh giá lại, và hiệu suất trong tương lai có thể khác nhau.

  5. Thị trường thích ứng: Chiến lược có thể hoạt động tốt với một số cặp tiền tệ nhưng có thể không hiệu quả với các cặp tiền tệ khác.

Hướng tối ưu hóa chiến lược

  1. Điều chỉnh tham số động: Xem xét chuyển động EMA theo chu kỳ biến động của thị trường, mức dừng lỗ và lợi nhuận.

  2. Thêm điều kiện lọc: Tiếp tục giới thiệu thêm các chỉ số kỹ thuật hoặc chỉ số cảm xúc thị trường để lọc tín hiệu giao dịch và giảm tín hiệu giả.

  3. Cải thiện chiến lược dừng lỗ: thực hiện dừng theo dõi hoặc dừng động dựa trên ATR để thích ứng tốt hơn với biến động thị trường.

  4. Tối ưu hóa thời gian giao dịch: thực hiện phân tích thời gian chi tiết hơn, tìm ra thời gian và ngày giao dịch tốt nhất.

  5. Tăng quản lý khối lượng giao dịch: Điều chỉnh kích thước vị trí theo biến động thị trường và rủi ro tài khoản.

  6. Phân tích liên quan đa loại tiền tệ: xem xét mối liên quan giữa nhiều cặp tiền tệ, tránh tiếp xúc quá mức với rủi ro thị trường tương tự.

  7. Tích hợp học máy: Sử dụng thuật toán học máy để tối ưu hóa lựa chọn tham số và quá trình tạo tín hiệu.

Tóm tắt

Chiến lược giao dịch đa chu kỳ là một hệ thống giao dịch tự động kết hợp theo dõi xu hướng và quản lý rủi ro. Bằng cách sử dụng các tín hiệu giao dịch EMA trong các chu kỳ thời gian khác nhau, chiến lược này nhằm mục đích nắm bắt xu hướng thị trường và giao dịch vào thời điểm thích hợp. Mặc dù chiến lược hoạt động tốt trong một số điều kiện thị trường, nhưng vẫn có một số rủi ro và hạn chế vốn có.

Mã nguồn chiến lược
/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0