Chiến lược vượt qua đường sắt kép

Tác giả:ChaoZhang, Ngày: 2023-12-07 15:32:51
Tags:

img

Tổng quan

Chiến lược chuyển động trung bình vượt bậc hai đường ray là một chiến lược giao dịch định lượng theo xu hướng. Chiến lược này sử dụng một cơ chế đường ray hai để đánh giá hướng xu hướng thị trường và kết hợp các tín hiệu chuyển động trung bình để vào thị trường. Cụ thể, chiến lược sử dụng trung bình chuyển động của các chu kỳ khác nhau để xây dựng một đường ray hai và đánh giá xu hướng bằng cách xem giá có vượt qua đường ray trên hoặc dưới; sau đó nó kết hợp các tín hiệu chuyển động trung bình nhanh và chậm để lọc thời gian nhập cảnh.

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

Chiến lược chéo trung bình di chuyển thông qua đường ray hai bao gồm các phần sau:

  1. Mô-đun đánh giá xu hướng: Sử dụng đường trung bình động của các chu kỳ khác nhau để xây dựng một đường ray kép. Khi giá vượt qua đường ray trên, nó được đánh giá là xu hướng tăng. Khi nó vượt qua đường ray dưới, nó được đánh giá là xu hướng giảm.

  2. Mô-đun nhập: Đi dài khi trung bình di chuyển nhanh vượt qua trung bình di chuyển trung bình và dài, và đi ngắn khi nó vượt qua dưới.

  3. Mô-đun thoát: Đóng các vị trí khi đường trung bình chuyển động nhanh vượt qua đường trung bình chuyển động trung bình và dài.

Chiến lược đầu tiên sử dụng tham số Trend Required để thiết lập sức mạnh xu hướng cần thiết. Khi giá vượt qua đường ray trên hoặc dưới, một xu hướng được xác định là đã hình thành. Sau đó, đi dài khi trung bình di chuyển nhanh vượt qua trên trung bình di chuyển trung bình và dài; đi ngắn khi trung bình di chuyển nhanh vượt qua dưới. Sử dụng trung bình di chuyển nhanh vượt qua dưới trung bình di chuyển trung bình và dài như tín hiệu thoát sau khi nhập.

Ngoài ra, chiến lược cũng có các mô-đun dừng lỗ và lấy lợi nhuận. Các thông số cụ thể có thể được điều chỉnh và tối ưu hóa để kiểm soát rủi ro và lợi nhuận.

Phân tích lợi thế

So với các chiến lược trung bình động đơn đường ray hoặc đơn đường ray, chiến lược vượt qua trung bình động hai đường ray kết hợp phán đoán xu hướng và lựa chọn thời gian nhập cảnh, có thể nắm bắt tốt hơn nhịp điệu thị trường.

  1. Cài đặt đường ray hai có thể xác định chính xác hơn xu hướng và tránh bỏ lỡ cơ hội.

  2. Bộ lọc chéo trung bình động có thể làm giảm xác suất thực hiện các hoạt động đảo ngược do đột phá sai.

  3. Rủi ro và lợi nhuận có thể được tối ưu hóa bằng cách điều chỉnh các tham số.

  4. Chiến lược logic là đơn giản và rõ ràng, dễ hiểu và theo dõi.

Phân tích rủi ro

Chiến lược chuyển đổi trung bình động vượt qua hai đường ray cũng có một số rủi ro, chủ yếu là:

  1. Cài đặt đường ray hai vẫn không thể loại bỏ hoàn toàn khả năng đánh giá sai xu hướng.

  2. Việc thiết lập không chính xác các thông số trung bình động có thể dẫn đến tần suất giao dịch quá cao hoặc các hoạt động đảo ngược.

  3. Các điểm dừng lỗ quá lỏng lẻo không thể kiểm soát hiệu quả lỗ đơn.

Các giải pháp tương ứng là:

  1. Điều chỉnh các thông số đường ray hai phù hợp để mở rộng phạm vi phán đoán đột phá.

  2. Tối ưu hóa danh mục đầu tư trung bình động để đảm bảo tần suất giao dịch hợp lý.

  3. Kiểm tra các mức điểm dừng lỗ khác nhau để tìm các thông số tối ưu.

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

Chiến lược chéo trung bình di chuyển thông qua đường ray hai cũng có các hướng tối ưu hóa sau:

  1. Kiểm tra các thông số chu kỳ trung bình động khác nhau để tìm danh mục đầu tư tối ưu.

  2. Hãy thử thêm nhiều trung bình động để xây dựng một hệ thống lọc đa trung bình động.

  3. Kiểm tra các thuật toán dừng lỗ khác nhau, chẳng hạn như dừng lỗ sau, dừng lỗ dao động, v.v.

  4. Thêm cơ chế hợp chất để tối ưu hóa hiệu quả sử dụng vốn.

  5. Kết hợp với các chỉ số khác để lọc, chẳng hạn như Bollinger Bands, KDJ, v.v.

Tóm lại

Chiến lược vượt qua trung bình di chuyển hai đường ray xem xét toàn diện phán đoán xu hướng và lựa chọn thời gian nhập cảnh, có thể nắm bắt hiệu quả nhịp điệu của thị trường. So với các chỉ số duy nhất, chiến lược này có những lợi thế của phán đoán chính xác hơn và lọc tốt hơn. Bằng cách tối ưu hóa các thông số và nâng cấp các mô-đun, nó dự kiến sẽ tiếp tục cải thiện sự ổn định và lợi nhuận của chiến lược.


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

//@version=4
//Author = Dustin Drummond https://www.tradingview.com/u/Dustin_D_RLT/
//Strategy based in part on original 10ema Basic Swing Trade Strategy by Matt Delong: https://www.tradingview.com/u/MattDeLong/
//Link to original 10ema Basic Swing Trade Strategy: https://www.tradingview.com/script/8yhGnGCM-10ema-Basic-Swing-Trade-Strategy/
//This is the Original EMAC - Exponential Moving Average Cross Strategy built as a class for reallifetrading dot com and so has all the default settings and has not been optimized
//I would not recomend using this strategy with the default settings and is for educational purposes only
//For the fully optimized version please come back around the same time tomorrow 6/16/21 for the EMAC - Exponential Moving Average Cross - Optimized
//EMAC - Exponential Moving Average Cross
strategy(title="EMAC - Exponential Moving Average Cross", shorttitle = "EMAC", overlay = true, calc_on_every_tick=false, default_qty_value = 100, initial_capital = 100000, default_qty_type = strategy.fixed, pyramiding = 0, process_orders_on_close=true)
//creates a time filter to prevent "too many orders error" and allows user to see Strategy results per year by changing input in settings in Stratey Tester
startYear = input(2015, title="Start Year", minval=1980, step=1)
timeFilter = (year >= startYear) and (month >= 1) and (dayofmonth >= 1)
//R Size (Risk Amount)
rStaticOrPercent = input(title="R Static or Percent", defval="Static", options=["Static", "Percent"])
rSizeStatic = input(2000, title="R Size Static", minval=1, step=100)
rSizePercent = input(3, title="R Size Percent", minval=.01, step=.01)
rSize = rStaticOrPercent == "Static" ? rSizeStatic : rStaticOrPercent == "Percent" ? (rSizePercent * .01 * strategy.equity) : 1
//Recent Trend Indicator "See the standalone version for detailed description"
res = input(title="Trend Timeframe", type=input.resolution, defval="W")
trend = input(26, minval=1, title="# of Bars for Trend")
trendMult = input(15, minval=0, title="Trend Growth %", step=.25) / 100
currentClose = security(syminfo.tickerid, res, close)
pastClose = security(syminfo.tickerid, res, close[trend])
//Trend Indicator
upTrend = (currentClose >= (pastClose * (1 + trendMult)))
downTrend = (currentClose <= (pastClose * (1 - trendMult)))
sidewaysUpTrend = (currentClose < (pastClose * (1 + trendMult)) and (currentClose > pastClose))
sidewaysDownTrend = (currentClose > (pastClose * (1 - trendMult)) and (currentClose < pastClose))
//Plot Trend on Chart
plotshape(upTrend, "Up Trend", style=shape.square, location=location.top, color=color.green, size=size.small)
plotshape(downTrend, "Down Trend", style=shape.square, location=location.top, color=color.red, size=size.small)
plotshape(sidewaysUpTrend, "Sideways Up Trend", style=shape.square, location=location.top, color=color.yellow, size=size.small)
plotshape(sidewaysDownTrend, "Sideways Down Trend", style=shape.square, location=location.top, color=color.orange, size=size.small)
//What trend signals to use in entrySignal
trendRequired = input(title="Trend Required", defval="Orange", options=["Green", "Yellow", "Orange", "Red"])
goTrend = trendRequired == "Orange" ? upTrend or sidewaysUpTrend or sidewaysDownTrend : trendRequired == "Yellow" ? upTrend or sidewaysUpTrend : trendRequired == "Green" ? upTrend : trendRequired == "Red" ? upTrend or sidewaysUpTrend or sidewaysDownTrend or downTrend : na
//MAs Inputs Defalt is 10 EMA, 20 EMA, 50 EMA, 100 SMA and 200 SMA
ma1Length = input(10, title="MA1 Period", minval=1, step=1)
ma1Type = input(title="MA1 Type", defval="EMA", options=["SMA", "EMA", "WMA"])
ma2Length = input(20, title="MA2 Period", minval=1, step=1)
ma2Type = input(title="MA2 Type", defval="EMA", options=["SMA", "EMA", "WMA"])
ma3Length = input(50, title="MA3 Period", minval=1, step=1)
ma3Type = input(title="MA3 Type", defval="EMA", options=["SMA", "EMA", "WMA"])
ma4Length = input(100, title="MA4 Period", minval=1, step=1)
ma4Type = input(title="MA4 Type", defval="SMA", options=["SMA", "EMA", "WMA"])
ma5Length = input(200, title="MA5 Period", minval=1, step=1)
ma5Type = input(title="MA5 Type", defval="SMA", options=["SMA", "EMA", "WMA"])
//MAs defined
ma1 = ma1Type == "EMA" ? ema(close, ma1Length) : ma1Type == "SMA" ? sma(close, ma1Length) : wma(close, ma1Length)
ma2 = ma2Type == "EMA" ? ema(close, ma2Length) : ma2Type == "SMA" ? sma(close, ma2Length) : wma(close, ma2Length)
ma3 = ma3Type == "EMA" ? ema(close, ma3Length) : ma3Type == "SMA" ? sma(close, ma3Length) : wma(close, ma3Length)
ma4 = ma4Type == "SMA" ? sma(close, ma4Length) : ma4Type == "EMA" ? ema(close, ma4Length) : wma(close, ma4Length)
ma5 = ma5Type == "SMA" ? sma(close, ma5Length) : ma5Type == "EMA" ? ema(close, ma5Length) : wma(close, ma5Length)
//Plot MAs
plot(ma1, title="MA1", color=color.yellow, linewidth=1, style=plot.style_line)
plot(ma2, title="MA2", color=color.purple, linewidth=1, style=plot.style_line)
plot(ma3, title="MA3", color=#00FFFF, linewidth=1, style=plot.style_line)
plot(ma4, title="MA4", color=color.blue, linewidth=2, style=plot.style_line)
plot(ma5, title="MA5", color=color.orange, linewidth=2, style=plot.style_line)
//Allows user to toggle on/off ma1 > ma2 filter
enableShortMAs = input(title="Enable Short MA Cross Filter", defval="Yes", options=["Yes", "No"])
shortMACross = enableShortMAs == "Yes" and ma1 > ma2 or enableShortMAs == "No"
//Allows user to toggle on/off ma4 > ma5 filter
enableLongMAs = input(title="Enable Long MA Cross Filter", defval="Yes", options=["Yes", "No"])
longMACross = enableLongMAs == "Yes" and ma4 >= ma5 or enableLongMAs == "No"
//Entry Signals
entrySignal = (strategy.position_size <= 0 and close[1] < ma1[1] and close > ma1 and close > ma2 and close > ma3 and shortMACross and ma1 > ma3 and longMACross and goTrend)
secondSignal = (strategy.position_size > 0 and close[1] < ma1[1] and close > ma1 and close > ma2 and close > ma3 and shortMACross and ma1 > ma3 and longMACross and goTrend)
plotshape(entrySignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(secondSignal, style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.small)
//ATR for Stops
atrValue = (atr(14))
//to test ATR enable next line
//plot(atrValue, linewidth=1, color=color.black, style=plot.style_line)
atrMult = input(2.5, minval=.25, step=.25, title="Stop ATR Multiple")
//Only target3Mult is used in current strategy target1 and target2 might be used in the future with pyramiding
//target1Mult = input(1.0, minval=.25, step=.25, title="Targert 1 Multiple")
//target2Mult = input(2.0, minval=.25, step=.25, title="Targert 2 Multiple")
target3Mult = input(3.0, minval=.25, step=.25, title="Target Multiple")
enableAtrStop = input(title="Enable ATR Stops", defval="Yes", options=["Yes", "No"])
//Intitial Recomended Stop Location
atrStop = entrySignal and ((high - (atrMult * atrValue)) < low) ? (high - (atrMult * atrValue)) : low
//oneAtrStop is used for testing only enable next 2 lines to test
//oneAtrStop = entrySignal ? (high - atrValue) : na
//plot(oneAtrStop, "One ATR Stop", linewidth=2, color=color.orange, style=plot.style_linebr)
initialStop = entrySignal and enableAtrStop == "Yes" ? atrStop : entrySignal ? low : na
//Stops changed to stoploss to hold value for orders the next line is old code "bug"
//plot(initialStop, "Initial Stop", linewidth=2, color=color.red, style=plot.style_linebr)
//Set Initial Stop and hold value "debug code"
stoploss = valuewhen(entrySignal, initialStop, 0)
plot(stoploss, title="Stop", linewidth=2, color=color.red)
enableStops = input(title="Enable Stops", defval="Yes", options=["Yes", "No"])
yesStops = enableStops == "Yes" ? 1 : enableStops == "No" ? 0 : na
//Calculate size of trade based on R Size
//Original buggy code: 
//positionSize = (rSize/(close - initialStop))
//Added a minimum order size of 1 "debug code"
positionSize = (rSize/(close - initialStop)) > 1 ? (rSize/(close - initialStop)) : 1
//Targets
//Enable or Disable Targets
enableTargets = input(title="Enable Targets", defval="Yes", options=["Yes", "No"])
yesTargets = enableTargets == "Yes" ? 1 : enableTargets == "No" ? 0 : na
//Only target3 is used in current strategy target1 and target2 might be used in the future with pyramiding
//target1 = entrySignal ? (close + ((close - initialStop) * target1Mult)) : na
//target2 = entrySignal ? (close + ((close - initialStop) * target2Mult)) : na
target3 = entrySignal ? (close + ((close - initialStop) * target3Mult)) : na
//plot(target1, "Target 1", linewidth=2, color=color.green, style=plot.style_linebr)
//plot(target2, "Target 2", linewidth=2, color=color.green, style=plot.style_linebr)
plot(target3, "Target 3", linewidth=2, color=color.green, style=plot.style_linebr)
//Set Target and hold value "debug code"
t3 = valuewhen(entrySignal, target3, 0)
//To test t3 and see plot enable next line
//plot(t3, title="Target", linewidth=2, color=color.green)
//MA1 Cross Exit
enableEarlyExit = input(title="Enable Early Exit", defval="Yes", options=["Yes", "No"])
earlyExit = enableEarlyExit == "Yes" ? 1 : enableEarlyExit == "No" ? 0 : na
ma1CrossExit = strategy.position_size > 0 and close < ma1
//Entry Order
strategy.order("Entry", long = true, qty = positionSize, when = (strategy.position_size <= 0 and entrySignal and timeFilter))
//Early Exit Order
strategy.close_all(when = ma1CrossExit and timeFilter and earlyExit, comment = "MA1 Cross Exit")
//Stop and Target Orders
//strategy.cancel orders are needed to prevent bug with Early Exit Order
strategy.order("Stop Loss", false, qty = strategy.position_size, stop=stoploss, oca_name="Exit",when = timeFilter and yesStops, comment = "Stop Loss")
strategy.cancel("Stop Loss", when = ma1CrossExit and timeFilter and earlyExit)
strategy.order("Target", false, qty = strategy.position_size, limit=t3, oca_name="Exit",  when = timeFilter and yesTargets, comment = "Target")
strategy.cancel("Target", when = ma1CrossExit and timeFilter and earlyExit)

Thêm nữa