Tài nguyên đang được tải lên... tải...

Chiến lược chéo trung bình chuyển động theo hàm số theo nhiều khung thời gian

Tác giả:ChaoZhang, Ngày: 2024-07-30 12:02:23
Tags:EMASLTPTF

img

Tổng quan

Chiến lược giao dịch EMA Multi-Timeframe là một hệ thống giao dịch tự động dựa trên tín hiệu giao dịch EMA. Nó sử dụng EMA từ các khung 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à lấy lợi nhuận để quản lý rủi ro. Chiến lược chủ yếu dựa trên giao dịch giữa EMA nhanh và chậm, cũng như EMA khung thời gian cao hơn, để xác định các cơ hội 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 Mức trung bình chuyển động biểu số (EMA) từ nhiều khung thời gian để xác định xu hướng thị trường và tạo ra tín hiệu giao dịch.

  1. Nó sử dụng EMA 9 giai đoạn như đường nhanh, EMA 50 giai đoạn như đường chậm và EMA 100 giai đoạn trên khung thời gian 15 phút như khung thời gian tham chiếu cao hơn.

  2. Điều kiện tín hiệu mua:

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

    • EMA nhanh vượt dưới EMA chậm và EMA nhanh nằm dưới EMA khung thời gian cao hơn; hoặc
    • EMA nhanh vượt dưới EMA khung thời gian cao hơn.
  4. Quản lý thương mại:

    • Đặt mức dừng lỗ cố định (SL) và mức lấy lợi nhuận (TP).
    • Khi giá đạt mức lợi nhuận đầu tiên (TP1), nó đóng 25% vị trí và di chuyển lệnh dừng lỗ đến mức cân bằng.
    • Vị trí còn lại tiếp tục chạy cho đến khi đạt đến mức lợi nhuận thứ hai (TP2) hoặc dừng lỗ.
  5. Kiểm soát thời gian giao dịch:

    • Cho phép thiết lập giờ giao dịch và ngày giao dịch cụ thể.

Ưu điểm chiến lược

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

  2. Theo dõi xu hướng: Có hiệu quả nắm bắt các xu hướng thị trường thông qua các giao diện chéo EMA và các vị trí tương đối.

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

  4. Tính linh hoạt: Các thông số EMA, mức dừng lỗ và mức lợi nhuận có thể được điều chỉnh cho 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ể được tự động hóa hoàn toàn bằng nền tảng TradingView và PineConnector.

  6. Quản lý thời gian: Khả năng thiết lập giờ và ngày giao dịch cụ thể để tránh giao dịch trong điều kiện thị trường không thuận lợi.

Rủi ro chiến lược

  1. Sự chậm trễ: EMA vốn là các chỉ số chậm trễ và có thể không phản ứng đủ nhanh trong các thị trường biến động.

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

  3. Dừng lỗ cố định: Sử dụng các điểm dừng lỗ cố định có thể không phù hợp với tất cả các điều kiện thị trường, đôi khi 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 thị trường trong thời gian kiểm tra ngược, có thể khác nhau trong tương lai.

  5. Khả năng thích nghi thị trường: Trong khi chiến lược hoạt động tốt trên một số cặp tiền tệ, nó có thể không hiệu quả trên những cặp khác.

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

  1. Điều chỉnh tham số động: Xem xét điều chỉnh động các khoảng thời gian EMA, mức dừng lỗ và mức lợi nhuận dựa trên biến động thị trường.

  2. Các điều kiện lọc bổ sung: giới thiệu các chỉ số kỹ thuật hoặc tinh thần bổ sung để lọc các tín hiệu giao dịch và giảm dương tính giả.

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

  4. Tối ưu hóa thời gian giao dịch: Tiến hành phân tích thời gian chi tiết hơn để tìm giờ và ngày giao dịch tốt nhất.

  5. Cải thiện kích thước vị trí: Điều chỉnh kích thước vị trí dựa trên biến động thị trường và rủi ro tài khoản.

  6. Phân tích mối tương quan nhiều loại tiền tệ: Xem xét các mối tương quan giữa nhiều cặp tiền tệ để tránh tiếp xúc quá mức với các 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 quá trình lựa chọn tham số và tạo tín hiệu.

Kết luận

Chiến lược giao dịch đa khung thời gian là một hệ thống giao dịch tự động kết hợp theo xu hướng với quản lý rủi ro. Bằng cách tận dụng các tín hiệu giao dịch EMA từ các khung thời gian khác nhau, chiến lược nhằm nắm bắt xu hướng thị trường và thực hiện 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ất định, nhưng nó vẫn có những rủi ro và hạn chế vốn có. Để tăng thêm độ mạnh mẽ và khả năng thích nghi của chiến lược, có thể xem xét việc giới thiệu các điều chỉnh tham số năng động, các điều kiện lọc bổ sung và các kỹ thuật quản lý rủi ro phức tạp hơn. Nhìn chung, chiến lược này cung cấp một điểm khởi đầu vững chắc cho các nhà giao dịch định lượng, có thể được tối ưu hóa và tùy chỉnh hơn nữa theo nhu cầu cá nhân và đặc điểm thị trường.


/*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

Có liên quan

Thêm nữa