
Chiến lược theo dõi xu hướng trung bình di chuyển giao dịch mở là một chiến lược theo dõi xu hướng dựa trên các đường trung bình di chuyển. Chiến lược này đánh giá xu hướng thị trường hiện tại bằng cách tính toán giá mở và giá đóng bằng đường trung bình di chuyển; làm nhiều hơn khi giá đóng trên đường trung bình di chuyển của giá mở; làm trống khi đường trung bình di chuyển của giá mở dưới đường trung bình di chuyển của giá đóng.
Lập luận 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 để đánh giá xu hướng hiện tại. Giá mở phản ánh mối quan hệ cung cầu và tâm lý giao dịch của thị trường hiện tại, giá đóng phản ánh kết quả giao dịch trong ngày. Nói chung, nếu giá đóng cao hơn giá mở, điều đó có nghĩa là ngày hôm đó có xu hướng mạnh, khí hậu đa đầu tốt hơn; nếu giá đóng thấp hơn giá mở, điều đó có nghĩa là ngày hôm đó có xu hướng yếu, khí hậu không khí nặng hơn.
Chiến lược này sử dụng logic này để đánh giá xu hướng hiện tại bằng cách tính toán đường trung bình di chuyển của giá mở và giá đóng. Cụ thể, quy tắc quyết định của nó như sau:
Khi giá tròn tròn trên giá tròn tròn trên giá tròn tròn trên giá tròn tròn trên giá tròn tròn trên giá tròn tròn trên giá tròn tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn trên giá tròn.
Khi giá đóng cửa di chuyển trung bình dưới giá mở cửa di chuyển trung bình, làm trống. Điều này cho thấy hiện tại không khí trống đang tăng cường, có thể vào thẻ trống.
Khi có tín hiệu đảo ngược, vị trí ban đầu sẽ dừng lỗ.
Chiến lược này cũng thiết lập theo dõi dừng lỗ để khóa lợi nhuận. Sau khi vào, sẽ tính toán trong thời gian thực điểm chênh lệch của giá vào với giá hiện tại. Khi giá chạy vượt quá số điểm dừng lỗ được thiết lập, đường dừng sẽ leo lên để khóa một phần lợi nhuận.
Nói chung, chiến lược này đánh giá xu hướng trong khoảng thời gian của chu kỳ trung bình di chuyển; chỉ giữ vị trí một hướng mỗi lần; dừng vị trí ban đầu là một cách ngược lại trực tiếp, không có cài đặt tương tự như dừng ATR; có cài đặt theo dõi dừng để khóa lợi nhuận.
Chiến lược này có một số lợi thế:
Quy tắc ra quyết định rõ ràng và đơn giản│ Xác định xu hướng dựa trên mối quan hệ mở và đóng, dễ hiểu, cũng dễ dàng để tối ưu hóa các tham số│
Lựa chọn linh hoạt các loại moving averageCó hơn một chục đường trung bình di chuyển để lựa chọn và có thể kết hợp một cách linh hoạt để tìm các tham số tốt nhất.
Có thể điều chỉnh độ phân giảiĐể làm cho tín hiệu nhạy cảm hơn và kịp thời hơn, bạn có thể đặt độ phân giải của chiến lược là 3-4 lần so với biểu đồ.
Có hệ thống ngăn chặnChiến lược được thiết lập theo dõi dừng lỗ, có thể kiểm soát hiệu quả tổn thất đơn lẻ và rút lui.
Có thể tùy chỉnh thời gian giữĐiều chỉnh biến động và chu kỳ giữ bằng cách điều chỉnh các tham số trung bình di chuyển.
Có thể điều chỉnh lợi nhuận rủi ro một cách linh hoạtBạn có thể kiểm soát mức độ rủi ro bằng cách điều chỉnh điểm dừng và lệch.
Chiến lược này cũng có một số rủi ro, chủ yếu tập trung vào các khía cạnh sau:
Bị bỏ lỡ bước ngoặtCác tín hiệu xuất phát của chiến lược này có thể chậm hơn một chút so với sự đảo ngược giá, dẫn đến việc chốt đuôi. Điều này có thể được giảm bớt bằng cách rút ngắn chu kỳ trung bình di chuyển một cách thích hợp.
Không phù hợp với thành phố bị chấn động mạnh│ Trong tình huống biến động mạnh mẽ, chiến lược này thường xuyên mở và đóng cửa các vị trí, chi phí xử lý nặng. │ Tại thời điểm này, có thể nới lỏng điểm dừng lỗ một cách thích hợp, hoặc kéo dài chu kỳ trung bình di chuyển │
Đánh giá chỉ số duy nhất。 Chiến lược này chỉ dựa trên một nhóm các chỉ số, dễ bị ảnh hưởng bởi sự thất bại。 Các chỉ số khác có thể được xem xét như MACD, làm phong phú chiến lược logic。
Các tham số dễ bị tối ưu hóaCác tham số trung bình di chuyển và tham số dừng đều dễ bị tối ưu hóa quá mức, hiệu suất thực tế có thể kém hơn so với phản hồi.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Kết hợp các chỉ số khác│ có thể thử nghiệm giới thiệu các chỉ số gia tăng, chỉ số biến động, v.v., làm phong phú logic chiến lược, tăng sự ổn định │
Chu kỳ điều chỉnh tham số│ có thể kết hợp với loại thị trường, động điều chỉnh các tham số trung bình di chuyển, kéo dài chu kỳ trong xu hướng, rút ngắn chu kỳ trong biến động │
Phong trào điều chỉnh đo lường rủi roCác điểm dừng và lệch có thể được điều chỉnh động dựa trên sự biến động thực tế trong thời gian gần đây.
Tăng cường logic dừng lỗ。 Các phương thức dừng lỗ hiện có chỉ dựa trên giá và số điểm, có thể xem xét các phương thức dừng lỗ phong phú hơn như ATR.。
Chiến lược theo dõi xu hướng trung bình di chuyển giao dịch mở là một chiến lược đánh giá xu hướng dựa trên quan hệ giao dịch mở và giao dịch đóng. Nó có các lợi thế như quy tắc quyết định đơn giản, rõ ràng, linh hoạt, có thể điều chỉnh và có thể kiểm soát rủi ro, cũng có các vấn đề như sai lệch, không phù hợp với sự biến động mạnh mẽ. Chiến lược này có thể được tối ưu hóa từ các khía cạnh như cơ sở chỉ số phong phú, điều chỉnh tham số động và tăng cường logic dừng lỗ, cho phép nắm bắt tốt hơn các cơ hội xu hướng, phản ứng với sự thay đổi của thị trường.
/*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 ===