Chiến lược giao dịch tương lai trong ngày với giá trung bình động kép

Tác giả:ChaoZhang, Ngày: 2023-11-15 16:48:02
Tags:

img

Tổng quan

Chiến lược này sử dụng nguyên tắc chéo trung bình động kép, kết hợp chỉ số ATR để dừng lỗ và lấy lợi nhuận và thêm kiểm soát giờ giao dịch để thiết kế một chiến lược giao dịch trong ngày phù hợp với hợp đồng tương lai.

Chiến lược logic

Chiến lược này sử dụng 5 giai đoạn và 20 giai đoạn WMA đường chéo như các tín hiệu đầu vào. Nó đi dài khi 5 giai đoạn đường phá vỡ trên 20 giai đoạn đường, và đi ngắn khi 5 giai đoạn đường phá vỡ dưới 20 giai đoạn đường. Nó cũng sử dụng 50 giai đoạn WMA đường để xác định xu hướng.

Ngoài ra, chiến lược sử dụng chỉ số ATR để thiết lập mức dừng lỗ và lấy lợi nhuận năng động. ATR phản ánh sự biến động của thị trường. Chiến lược sử dụng giá trị ATR nhân một yếu tố (chẳng hạn như 3) để xác định dừng lỗ và lấy lợi nhuận, do đó kiểm soát mỗi lỗ giao dịch.

Cuối cùng, chiến lược chỉ kích hoạt giao dịch trong giờ giao dịch của Hoa Kỳ (9:00-14:30 CST) để tránh biến động cao xung quanh thị trường mở và đóng nơi các tín hiệu sai dễ dàng hình thành.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Crossover trung bình di chuyển kép có hiệu quả nắm bắt các điểm chuyển hướng xu hướng để nhập vào kịp thời.

  2. Bộ lọc xu hướng tránh giao dịch chống lại xu hướng chính và giảm các tín hiệu sai.

  3. Điều khiển dừng lỗ dựa trên ATR năng động cho mỗi lỗ giao dịch.

  4. Hạn chế giờ giao dịch tránh các giai đoạn mở và đóng biến động.

  5. Quy tắc đơn giản và rõ ràng, dễ hiểu và thực hiện cho người mới bắt đầu.

  6. Các thông số tùy chỉnh như thời gian MA, ATR nhân, giờ giao dịch vv để tối ưu hóa.

Phân tích rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. Thêm kích hoạt dừng lỗ trong các thị trường giới hạn phạm vi.

  2. Sự giao thoa hai MA có sự chậm trễ và có thể bỏ lỡ các đột quỵ ngắn hạn.

  3. Cài đặt tham số ATR không chính xác dẫn đến lỗ dừng lớn hoặc nhỏ.

  4. Chỉ dựa vào các chỉ số kỹ thuật mà không cần phân tích cơ bản.

  5. Hiệu quả phụ thuộc vào biểu tượng và khung thời gian thích hợp.

  6. Hệ thống cơ khí có nguy cơ bị điều chỉnh.

  7. Các thông số cần điều chỉnh cho các phiên giao dịch khác nhau.

Chúng có thể được cải thiện thông qua điều chỉnh tham số, kết hợp chỉ số, can thiệp thủ công chọn lọc v.v.

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

Chiến lược có thể được cải thiện trong các khía cạnh sau:

  1. Kiểm tra các hệ thống MA khác nhau như EMA, DMA v.v.

  2. Thêm các bộ lọc kỹ thuật khác như MACD, RSI v.v.

  3. Tối ưu hóa các thông số ATR để dừng lỗ / lợi nhuận tốt hơn.

  4. Kết hợp các chỉ số âm lượng để tìm tín hiệu đầu vào chất lượng cao.

  5. Điều chỉnh các thông số dựa trên đặc điểm của biểu tượng.

  6. Kết hợp các yếu tố cơ bản để tránh giao dịch chống lại thị trường.

  7. Giới thiệu máy học như mạng thần kinh để mô hình hóa thị trường.

  8. Khám phá các kết hợp nhiều khung thời gian để có nhiều cơ hội hơn.

  9. Xây dựng tập thể chiến lược để cải thiện độ bền.

Kết luận

Tóm lại, đây là một chiến lược đơn giản và trực quan phù hợp cho người mới bắt đầu thực hành giao dịch trực tiếp. Đồng thời, vẫn còn rất nhiều chỗ để tối ưu hóa thông qua các chỉ số kỹ thuật hơn hoặc học máy. Chế độ điều chỉnh tham số dựa trên biểu tượng và động lực thị trường cũng là chìa khóa. Chiến lược cung cấp một khung tham chiếu cho người mới bắt đầu giao dịch lượng, nhưng đòi hỏi phải thử nghiệm và nâng cao không ngừng để có lợi nhuận ổn định.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © james4392010

//@version=4

strategy(title="DayTradingFutures Cross-Strategy", overlay=true)




// === GENERAL INPUTS ===
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
//highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn



wmaFastSource   = input(defval = close, title = "Fast WMA Source")
wmaFastLength   = input(defval = 5, title = "Fast WMA Period")
wmaSlowSource   = input(defval = close, title = "Slow WMA Source")
wmaSlowLength   = input(defval = 20, title = "Slow WMA Period")
wmaDirectionSource  = input(defval = close, title = "Trend 50 Period Source")
wmaDirectionLength  = input(defval = 50, title = "Trend 50 Period")
timeinrange(res, sess) => time(res, sess) != 0



// === SERIES SETUP ===
/// a couple of ma's..
wmaFast = wma(close, 5)
wmaSlow = wma(close, 20)
wmaDirection = wma(close, 50)





// === PLOTTING ===
fast = plot(series=wmaFast, color=color.white, linewidth=2)
slow = plot(series=wmaSlow, color=color.yellow, linewidth=2)
direction = plot(series=wmaDirection, color=color.red, linewidth=2)


// === INPUT BACKTEST RANGE ===

//fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//fromYear = input(defval = 2022, title = "From Year", minval = 2022)
 
// To Date Inputs
//toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//toYear = input(defval = 2022, title = "To Year", minval = 2022)
//startDate = timestamp(fromYear, fromMonth, fromDay)
//finishDate = timestamp(toYear, toMonth, toDay)
//inDateRange= (time >= fromDay, fromMonth, fromYear and time <= toDay, toMonth, toYear) 



// === FUNCTION EXAMPLE ===
//inDateRange = (time >= fromDay, fromMonth, fromYear) and (time <= toDay, toMonth, toYear)


// === LOGIC ===

enterLong = crossover(wmaFast, wmaSlow) and close > wmaDirection and timeinrange(timeframe.period, "0900-1430")
enterShort = crossunder(wmaFast, wmaSlow) and close < wmaDirection and timeinrange(timeframe.period, "0900-1430")

//trend := nz(trend[1], trend)
//trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
//upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)

buySignal = enterLong 
//plotshape(enterLong ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green)
plotshape(enterLong and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)
//dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)

sellSignal = enterShort
//plotshape(enterShort ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red)
plotshape(enterShort and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)
//mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
//longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
//shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
//fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
//fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="Buy", message="Buy!")
alertcondition(sellSignal, title="Sell", message="Sell!")
//changeCond = trend != trend[1]
//alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")



// Entry for strategy //

//tp=input(25,title="TakeProfit")
//sl=input(40,title="StopLoss")

strategy.entry("Long",1, when=buySignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)

strategy.entry("Short",1, when=sellSignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)
//strategy.exit("Exit", wmaFastwmaSlow)

//Buy and Sell Signals

//strategy.close_all(when =not timeinrange(timeframe.period, "1000-1430"))   


// === FILL ====

fill (fast, slow, color = wmaSlow > wmaDirection ? color.green : color.red)
//fill(when=enterLong, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterLong, sl, color = color.new(color.red, 90), title = "Loss area")
//fill(when=enterShort, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterShort, sl, color = color.new(color.red, 90), title = "Loss area")






Thêm nữa