Mở Khép Xu hướng trung bình động chéo Theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-01-15 14:24:27
Tags:

img

Tổng quan

Open Close Cross Moving Average Trend Following Strategy là một chiến lược theo xu hướng dựa trên các đường trung bình động của giá mở và đóng. Nó xác định xu hướng thị trường hiện tại bằng cách tính toán đường trung bình động của giá mở và đóng; nó đi dài khi giá đóng vượt trên đường trung bình động của giá mở, và đi ngắn khi giá đóng vượt dưới đường trung bình động của giá mở. Chiến lược cũng thiết lập các điểm dừng để khóa lợi nhuận và kiểm soát rủi ro hiệu quả.

Nguyên tắc

Lý thuyết cốt lõi của chiến lược này dựa trên mối quan hệ giữa giá mở và giá đóng để xác định xu hướng hiện tại. Giá mở phản ánh mối quan hệ cung cầu thị trường hiện tại và tâm lý giao dịch, trong khi giá đóng phản ánh kết quả giao dịch cuối cùng của ngày. Nói chung, nếu giá đóng cao hơn giá mở, nó cho thấy xu hướng thị trường cho ngày tăng và tâm lý tăng hơn. Nếu giá đóng thấp hơn giá mở, nó cho thấy xu hướng thị trường cho ngày giảm và tâm lý giảm hơn.

Chiến lược này sử dụng logic này bằng cách tính toán trung bình động của giá mở và đóng để đánh giá hướng xu hướng hiện tại.

  1. Đi dài khi giá đóng cửa vượt qua giá mở cửa. Điều này báo hiệu rằng tâm lý tăng trưởng đang tăng và một vị trí dài có thể được bắt đầu.

  2. Đi ngắn khi giá đóng cửa chuyển động trung bình vượt dưới giá mở cửa chuyển động trung bình.

  3. Đóng các vị trí hiện có với một lỗ dừng khi tín hiệu ngược xảy ra.

Chiến lược này cũng thiết lập các điểm dừng để khóa lợi nhuận. Sau khi nhập vào một vị trí, nó tính toán động sự khác biệt điểm giữa giá nhập cảnh và giá hiện tại. Khi chuyển động giá vượt quá ngưỡng điểm dừng lỗ đã thiết lập, đường dừng lỗ sẽ di chuyển lên để khóa lợi nhuận một phần.

Tóm lại, chiến lược đánh giá xu hướng trong khoảng thời gian trung bình động; chỉ giữ một vị trí theo hướng tại một thời điểm; thoát khỏi các vị trí hiện có trực tiếp với các tín hiệu ngược mà không có ATR dừng lại; và có cài đặt dừng lại để khóa lợi nhuận.

Phân tích lợi thế

Chiến lược này có những lợi thế chính sau:

  1. Quy tắc đơn giản và rõ ràng. Đánh giá xu hướng dựa trên mối quan hệ mở-gần là dễ hiểu và tối ưu hóa các thông số cho.

  2. Tùy chọn MA linh hoạtCó hàng chục loại MA để lựa chọn và tối ưu hóa.

  3. Độ phân giải điều chỉnhĐộ phân giải có thể được thiết lập đến 3-4 lần biểu đồ để có độ nhạy và tính kịp thời của tín hiệu.

  4. Cơ chế dừng mất mát. Việc dừng lại có hiệu quả kiểm soát lỗ và rút tiền cho mỗi giao dịch.

  5. Thời gian lưu giữ có thể tùy chỉnhThời gian giữ và biến động có thể được kiểm soát bằng cách điều chỉnh các tham số MA.

  6. Khả năng điều chỉnh linh hoạt về phần thưởng rủi ro. điểm dừng lỗ và bù đắp các giai điệu mịn rủi ro-lợi nhuận ưu tiên.

Phân tích rủi ro

Những rủi ro chính của chiến lược này nằm ở các lĩnh vực sau:

  1. Sự đảo ngược xu hướng thiếu sótCác tín hiệu ra khỏi có thể chậm lại sự đảo ngược giá dẫn đến việc giữ lỗ.

  2. Không phù hợp với điều kiện biến động cao. Thường xuyên whipsaws trong điều kiện biến động tạo ra chi phí hoa hồng cao. mở rộng điểm dừng lỗ hoặc kéo dài thời gian MA có thể giúp ở đây.

  3. Dựa vào chỉ số duy nhấtViệc đưa ra quyết định dựa trên chỉ một chỉ số sẽ khiến nó có nguy cơ thất bại.

  4. Nguy cơ tối ưu hóa quá mứcCác thông số MA và cài đặt stop loss có thể dễ dàng quá phù hợp. Hiệu suất ngoài mẫu có thể xấu đi. Cần thận trọng trong việc lựa chọn tham số.

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

Chiến lược có thể được tối ưu hóa và tăng cường từ các lĩnh vực như:

  1. Các chỉ số bổ sungCác chỉ số biến động và động lực có thể tăng độ bền và ổn định.

  2. Các tham số động lực có điều kiệnThời gian MA có thể được điều chỉnh dựa trên xu hướng hoặc phát hiện chế độ thị trường bên để thích nghi tốt hơn.

  3. Kiểm soát rủi ro năng độngCác điểm dừng lỗ và bù đắp có thể được hiệu chỉnh trên các mức biến động gần đây.

  4. Cải thiện Logic Stop Loss. Các cơ chế dừng lỗ tiên tiến hơn như ATR dừng có thể thay thế cho việc dừng lại đơn giản.

Kết luận

Open Close Cross Moving Average Trend Following Strategy là một chiến lược giao dịch xu hướng điển hình dựa trên mối quan hệ mở-khép và trung bình động. Những lợi thế của nó như các quy tắc đơn giản, tính linh hoạt và rủi ro có thể kiểm soát được cũng đi kèm với những nhược điểm của việc thiếu đảo ngược và chém. Các lĩnh vực cải thiện bao gồm nhiều chỉ số hơn, các tham số năng động và quản lý rủi ro tiên tiến để nắm bắt xu hướng tốt hơn và thích nghi với các điều kiện thị trường khác nhau.


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

//@version=4

strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true )

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution? ( recommended )")
stratRes = input(defval="120", title="Set Resolution ( should not be lower than chart )", type=input.resolution)
useMA = input(defval=true, title="Use MA? ( otherwise use simple Open/Close data )")
basisType = input(defval="DEMA", title="MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )", type=input.string)
basisLen = input(defval=14, title="MA Period", minval=1)
offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01)
useStop = input(defval=true, title="Use Trailing Stop?")
slPoints = input(defval=200, title="Stop Loss Trail Points", minval=1)
slOffset = input(defval=400, title="Stop Loss Trail Offset", minval=1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)  // Simple
    v2 = ema(src, len)  // Exponential
    v3 = 2 * v2 - ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)  // Triple Exponential
    v5 = wma(src, len)  // Weighted
    v6 = vwma(src, len)  // Volume Weighted
    sma_1 = sma(src, len)  // Smoothed
    v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))  // Hull
    v9 = linreg(src, len, offSig)  // Least Squares
    v10 = alma(src, len, offALMA, offSig)  // Arnaud Legoux
    type == "EMA" ? v2 : type == "DEMA" ? v3 : type == "TEMA" ? v4 : 
       type == "WMA" ? v5 : type == "VWMA" ? v6 : type == "SMMA" ? v7 : 
       type == "HullMA" ? v8 : type == "LSMA" ? v9 : type == "ALMA" ? v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = security(syminfo.tickerid, res, exp)
    use ? security_1 : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
reso__1 = reso(variant__1, useRes, stratRes)
reso__2 = reso(close, useRes, stratRes)
closeSeries = useMA ? reso__1 : reso__2
variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
reso__3 = reso(variant__2, useRes, stratRes)
reso__4 = reso(open, useRes, stratRes)
openSeries = useMA ? reso__3 : reso__4
trendState = bool(na)
trendState := closeSeries > openSeries ? true : 
   closeSeries < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours")
// channel outline
closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90)
openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90)
// channel fill
closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false)
openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false)
closePlotD = plot(trendState ? na : closeSeries, transp=100, editable=false)
openPlotD = plot(trendState ? na : openSeries, transp=100, editable=false)
fill(openPlotU, closePlotU, title="Up Trend Fill", color=#009900, transp=40)
fill(openPlotD, closePlotD, title="Down Trend Fill", color=#CC0000, transp=40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond = crossover(closeSeries, openSeries)
shortCond = crossunder(closeSeries, openSeries)
// entries and base exit
strategy.entry("long", strategy.long, when=longCond)
strategy.entry("short", strategy.short, when=shortCond)
// if we're using the trailing stop
if useStop
    strategy.exit("XL", from_entry="long", trail_points=slPoints, trail_offset=slOffset)
    strategy.exit("XS", from_entry="short", trail_points=slPoints, trail_offset=slOffset)
// not sure needed, but just incase..
strategy.exit("XL", from_entry="long", when=shortCond)
strategy.exit("XS", from_entry="short", when=longCond)
// === /STRATEGY ===


Thêm nữa