
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 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ể:
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.
Điều kiện mua:
Điều kiện bán tín hiệu:
Quản lý giao dịch:
Kiểm soát thời gian giao dịch:
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.
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.
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.
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.
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.
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.
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.
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.
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ỏ.
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.
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.
Đ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.
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ả.
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.
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.
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.
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ự.
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.
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ó.
/*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