
Chiến lược này dựa trên tín hiệu giao dịch dựa trên sự giao thoa của giá mở và giá cao. Khi giá mở, giá mở cao hơn và khi giá mở thấp hơn, giá mở. Sử dụng trung bình di chuyển có thể làm mỏng dữ liệu giá, giảm tiếng ồn giao dịch.
Quyết định sử dụng độ phân giải chu kỳ thay thế (useRes) dựa trên tham số đầu vào. Nếu sử dụng, hãy đặt chu kỳ theo stratRes.
Tùy thuộc vào tham số đầu vào để quyết định sử dụng hoặc không sử dụng trung bình di chuyển ((useMA) 。 Nếu sử dụng, hãy chọn loại trung bình di chuyển theo BasisType, và BasisLen sẽ thiết lập độ dài chu kỳ 。
Lấy chuỗi dữ liệu với giá mở và giá đóng. Nếu sử dụng trung bình di chuyển, hãy áp dụng loại trung bình di chuyển được chọn và xử lý trơn tru các tham số
So sánh giá mở x hiện tại với chuỗi giá mở openSeries. Nếu x lớn hơn openSeries thì trạng thái xu hướng là nhiều đầu, nếu không thì là đầu trống.
LongCond được tạo ra khi giá mở ở trên giá mở và ShortCond được tạo ra khi giá mở ở dưới giá mở.
Đưa vào vị trí đa đầu hoặc trống theo tín hiệu đa đầu. Nếu bật theo dõi dừng lỗ, hãy đặt vị trí điểm dừng lỗ và khoảng cách lệch.
Sử dụng hai loạt khác nhau của giá mở và giá cao để đánh giá tín hiệu giao dịch, tránh sự hạn chế của một loạt dữ liệu duy nhất.
Sử dụng công nghệ trung bình di chuyển có thể lọc ra tiếng ồn thị trường ngắn hạn và khóa các xu hướng chính.
Có thể cấu hình linh hoạt các loại trung bình di chuyển, điều chỉnh tham số để có hiệu quả tối ưu.
Có thể chọn sử dụng Tracking Stop để kiểm soát rủi ro và khóa lợi nhuận.
Có rất nhiều không gian để tối ưu hóa chiến lược và điều chỉnh các tham số cho các giống và môi trường thị trường khác nhau.
Một nguồn tín hiệu giao dịch duy nhất, tín hiệu hiếm, dễ bị bỏ qua.
Các trung bình di chuyển có vấn đề về sự chậm trễ, có thể bỏ lỡ cơ hội ngắn hạn.
Thiết lập tracking stop loss không đúng có thể dừng quá sớm hoặc quá lớn.
Thiết lập tham số không đúng cách có thể dẫn đến giao dịch ảo quá thường xuyên và ảnh hưởng đến hiệu quả của ổ đĩa thực.
Các loại khác nhau và môi trường thị trường cần điều chỉnh các tham số, tối ưu hóa là khó khăn hơn.
Có thể làm phong phú nguồn tín hiệu bằng cách thêm các chỉ số đánh giá khác hoặc giới thiệu mô hình học máy. Điều chỉnh loại trung bình di chuyển và tham số để đạt hiệu quả mài dũa tối ưu. Thiết lập điểm dừng cẩn thận, nới lỏng thích hợp để có được nhiều lợi nhuận hơn.
Thêm các chỉ số kỹ thuật khác, chẳng hạn như Blink, KD, để làm giàu tín hiệu giao dịch.
Ứng dụng mô hình học máy xử lý tín hiệu phán đoán.
Tối ưu hóa các tham số trung bình di chuyển để tìm các tham số kết hợp tốt nhất.
Tối ưu hóa theo dõi các tham số dừng lỗ, cân bằng mức dừng lỗ và thu lợi nhuận.
Thêm chức năng tối ưu hóa tham số, tự động tìm các tham số tối ưu.
Phát triển mẫu tham số độc quyền cho các giống khác nhau.
Phát triển khung phản hồi định lượng, chiến lược lặp nhanh.
Chiến lược này dựa trên giao dịch tín hiệu phán đoán dựa trên giá mở và giá cao, sử dụng công nghệ trung bình di chuyển lọc tiếng ồn. Có thể cấu hình tham số linh hoạt, để đạt được nhiều hiệu quả. Có một số ưu điểm, nhưng cũng có một số vấn đề, chẳng hạn như ít tín hiệu, chậm trễ, v.v.
/*backtest
start: 2022-10-17 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
//strategy(title = "Open Close Cross Strategy", shorttitle = "OCC Strategy", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)
// 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 )")
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 )")
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
v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len // Smoothed
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) => use ? request.security(syminfo.tickerid, res, exp) : exp
// === /BASE FUNCTIONS ===
// === SERIES SETUP ===
// open/close
//closeSeries = useMA ? reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(close, useRes, stratRes)
openSeries = useMA ? reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(open, useRes, stratRes)
x = openSeries[1]
trendState = x > openSeries ? true : x < openSeries ? false : trendState[1]
// === /SERIES ===
// === PLOTTING ===
barcolor(color = x > openSeries ? #006600 : #990000, title = "Bar Colours")
// channel outline
closePlot = plot(x, title = "Close Line", color = #009900, linewidth = 2, style = line, transp = 90)
openPlot = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = line, transp = 90)
// channel fill
closePlotU = plot(trendState ? x : na, transp = 100, editable = false)
openPlotU = plot(trendState ? openSeries : na, transp = 100, editable = false)
closePlotD = plot(trendState ? na : x, 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(openSeries, x)
shortCond = crossunder(openSeries, x)
// entries and base exit
strategy.entry("long", true, when = longCond)
strategy.entry("short", false, 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 ===