Ý tưởng cốt lõi của chiến lược này là kết hợp các chỉ số đa không gian với các đường di chuyển cơ bản, để thực hiện theo dõi xu hướng và giao dịch đảo ngược xu hướng. Khi giá đồng ý với chỉ số, hãy theo dõi xu hướng; Khi giá và chỉ số đi ngược, hãy sử dụng giao dịch đảo ngược.
Chiến lược này dựa trên ba chỉ số tùy chỉnh:
Chỉ số đa luồng ((Trend): tính toán mối quan hệ giữa giá và kênh mua bán quá mức, đánh giá xu hướng đa đầu và vô đầu, trả về 1, 0, - 1 ba trạng thái.
Thẻ mua bán quá mức (Tsl): Xử lý ATR để tính toán đường lên và đường xuống, giá phá vỡ đường lên được coi là mua quá mức, phá vỡ đường xuống được coi là bán quá mức.
Đường trung bình di chuyển cơ bản ((MA): Đường trung bình di chuyển đơn giản của giá đóng cửa trong 20 chu kỳ.
Cụ thể, chiến lược dựa trên giá trị chỉ số đa luồng để xác định giá đang ở trạng thái đa đầu, dao động hoặc trống. Khi chỉ số đa luồng là 1, đại diện cho trạng thái đa đầu; khi chỉ số đa luồng là -1, đại diện cho trạng thái trống. Khi đó, nếu giá phù hợp với hướng chỉ số, hãy sử dụng chiến lược theo dõi xu hướng, làm nhiều lỗ hổng trong trường hợp phù hợp.
Ngoài ra, giá phá vỡ đường trung bình di chuyển cũng là tín hiệu hỗ trợ hướng dẫn giao dịch. Giá tăng khi vượt qua đường trung bình và giảm khi vượt qua đường trung bình.
Các chiến lược giao dịch đa đầu cụ thể như sau:
Chỉ số đa không gian > 0, giá tăng đột phá lên đường ray, thuộc trường hợp theo dõi xu hướng, làm nhiều hơn.
Chỉ số đa hốc < 0, giá giảm phá vỡ đường mòn, thuộc tình huống đảo ngược xu hướng, làm trống.
Giá đóng cửa > Giá mở cửa > Điểm trung tâm, xem như là cơ hội phá vỡ trung tâm làm nhiều hơn, làm nhiều hơn.
Giá đóng cửa vượt lên đường và giá đóng cửa > trung bình di chuyển, làm nhiều hơn.
Chiến lược giao dịch không đầu là như sau:
Chỉ số đa không gian < 0, giá giảm phá vỡ đường mòn, thuộc trường hợp theo dõi xu hướng, làm trống.
Chỉ số đa không gian > 0, giá tăng đột phá lên đường ray, thuộc tình huống đảo ngược xu hướng, làm nhiều hơn.
Giá mở > Giá đóng < Điểm trung tâm, được coi là cơ hội phá vỡ trung tâm để làm空, làm空.
Giá đóng cửa đã phá vỡ đường mòn và giá đóng cửa < trung bình di chuyển, làm trống.
Chiến lược giao dịch bằng phẳng đơn giản hơn, bằng cách phá vỡ lại giá để dừng lỗ.
Chiến lược này có những ưu điểm sau:
Chỉ số đa không gian giúp đánh giá chính xác xu hướng thị trường và là chỉ số cốt lõi của chiến lược.
Các kênh mua quá mức và bán quá mức được kết hợp với các chỉ số để phát hiện cơ hội đảo ngược tiềm năng.
Đường trung bình di chuyển cơ bản có thể được sử dụng như một tín hiệu lọc phụ để tránh phá vỡ giả.
Điểm trung tâm kết hợp với chỉ số đa không gian, tạo thành điểm giao dịch có xác suất cao.
Với khả năng theo dõi xu hướng và đảo ngược giao dịch, cơ hội thu nhập sẽ nhiều hơn.
Đường dừng lỗ mua bán quá mức rõ ràng và đơn giản, có lợi cho việc kiểm soát rủi ro
Chiến lược này cũng có những rủi ro sau:
Chỉ số đa không gian có thể phát ra tín hiệu sai và cần phải lọc các chỉ số khác.
Các giao dịch đột phá dễ bị mắc kẹt và cần có mức lỗ hổng nghiêm ngặt.
Chu kỳ trung bình di chuyển được thiết lập không đúng cách, có thể bỏ lỡ xu hướng hoặc tạo ra tín hiệu sai.
Điểm trung tâm cần kiểm tra lại xác suất xác minh độ tin cậy.
Các kênh mua bán quá mức cần tối ưu hóa các tham số để phù hợp với các giống khác nhau.
Các tham số chỉ số không phù hợp, có thể dẫn đến giao dịch thường xuyên.
Các biện pháp sau đây có thể được áp dụng để đối phó với những rủi ro này:
Kết hợp với các chỉ số khác như đường K, xác nhận số lượng giao dịch và tín hiệu chỉ số đa không gian.
Theo dõi chặt chẽ chiến lược dừng lỗ của kênh mua bán quá mức, dừng lỗ nhanh chóng.
Kiểm tra các tham số khác nhau của chu kỳ trung bình di chuyển để tìm tham số tốt nhất.
Đánh giá đầy đủ xác suất chiến lược điểm trung tâm.
Tối ưu hóa tham số đường dẫn để tìm ra sự kết hợp tham số tốt nhất cho từng giống.
Điều chỉnh các tham số chỉ số để hệ thống hoạt động ổn định.
Chiến lược này cũng có thể được tối ưu hóa theo các khía cạnh sau:
Thêm các thuật toán học máy, sử dụng dữ liệu lớn để đào tạo các chỉ số đa không. Có thể cải thiện độ chính xác của chỉ số và giảm tín hiệu sai.
Thêm kênh thích ứng, tự động điều chỉnh tham số kênh theo biến động thị trường. Có thể cải thiện độ chính xác của đột phá.
Sử dụng Deep Learning để trích xuất nhiều chỉ số thay đổi hơn, tạo ra các bộ chỉ số để tối ưu hóa chiến lược nhập cảnh và xuất cảnh.
Thêm thuật toán dừng chân cao cấp, có thể theo dõi xu hướng dừng chân.
Tối ưu hóa tham số và thử nghiệm kết hợp để cải thiện sự ổn định của chiến lược tổng thể.
Thêm mô-đun quản lý tài chính để kiểm soát rủi ro một cách khoa học hơn.
Chiến lược này thông qua các chỉ số đa không gian để đánh giá cấu trúc thị trường, và các kênh, trung bình di chuyển để tạo ra tín hiệu giao dịch, thực hiện sự kết hợp hữu cơ của theo dõi xu hướng và xu hướng đảo ngược. Có hiệu quả tốt của chỉ số, cơ hội giao dịch phong phú, dừng lỗ rõ ràng.
/*backtest
start: 2023-08-25 00:00:00
end: 2023-09-24 00:00:00
period: 2h
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/
// © amysojexson
//@version=3
strategy(title="Pivots strategy", overlay=true)
// Input settings
// Create a pull-down menu for the pivot type
pivotType = input(title="Pivot Type",
options=["Daily", "Intraday", "Weekly"], defval="Daily")
// Make toggles for pivot level options
plotPP = input(title="Plot PP", type=bool, defval=true)
plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true)
plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true)
plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true)
plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true)
// Configure session options
sessRange = input(title="Trading Session", defval="0800-1600")
showSess = input(title="Highlight Session?", type=bool, defval=false)
// Enable or disable pivot labels
showLabels = input(title="Show Labels?", type=bool, defval=false)
// Step 2. Calculate indicator values
// Create a function to fetch daily and weekly data
GetData(res, data) =>
security(syminfo.tickerid, res, data[1],
lookahead=barmerge.lookahead_on)
// Fetch daily and weekly price data
dailyHigh = GetData("D", high)
dailyLow = GetData("D", low)
dailyClose = GetData("D", close)
weeklyHigh = GetData("W", high)
weeklyLow = GetData("W", low)
weeklyClose = GetData("W", close)
// Determine session pivot data
// First see how the price bar relates to
// the session time range
inSession = not na(time(timeframe.period, sessRange)[1])
sessStart = inSession and not inSession[1]
sessEnd = not inSession and inSession[1]
// Determine session price data
sessHigh = 0.0
sessLow = 0.0
sessClose = 0.0
sessHigh := sessStart ? high :
inSession ? max(high, sessHigh[1]) : na
sessLow := sessStart ? low :
inSession ? min(low, sessLow[1]) : na
sessClose := sessEnd ? close[1] : na
// Compute high, low, close from previous intra-day session
highPrevSess = 0.0
lowPrevSess = 0.0
closePrevSess = 0.0
highPrevSess := sessEnd ? fixnan(sessHigh) : highPrevSess[1]
lowPrevSess := sessEnd ? fixnan(sessLow) : lowPrevSess[1]
closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1]
// Now figure out which kind of price data
// to use for the pivot calculation
theHigh = if (pivotType == "Daily")
dailyHigh
else
if (pivotType == "Intraday")
highPrevSess
else
weeklyHigh
theLow = if (pivotType == "Daily")
dailyLow
else
if (pivotType == "Intraday")
lowPrevSess
else
weeklyLow
theClose = if (pivotType == "Daily")
dailyClose
else
if (pivotType == "Intraday")
closePrevSess
else
weeklyClose
// Finally calculate the pivot levels
pp = (theHigh + theLow + theClose) / 3
bc= (theHigh + theLow)/2
tc= (pp-bc)+pp
r1 = pp+(.382*(theHigh-theLow))
s1 = pp-(.382*(theHigh-theLow))
r2 = pp +(.618*(theHigh-theLow))
s2 = pp -(.618*(theHigh-theLow))
r3 = pp +(1*(theHigh-theLow))
s3 = pp -(1*(theHigh-theLow))
// Step 3. Output indicator data
// Plot the various pivot levels
plot(series=plotS3R3 ? r3 : na, title="R3",
style=circles, linewidth=1, color=#0023FF)
plot(series=plotS2R2 ? r2 : na, title="R2",
style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS1R1 ? r1 : na, title="R1",
style=circles, linewidth=1, color=#09E0F3)
plot(series=plotTCBC ? tc : na, title="TC",
style=circles, linewidth=.75, color=#FF00D1)
plot(series=plotPP ? pp : na, title="PP",
style=circles, linewidth=1, color=#000000)
plot(series=plotTCBC ? bc : na, title="BC",
style=circles, linewidth=.75, color=#FF00D1)
plot(series=plotS1R1 ? s1 : na, title="S1",
style=circles, linewidth=1, color=#09E0F3)
plot(series=plotS2R2 ? s2 : na, title="S2",
style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS3R3 ? s3 : na, title="S3",
style=circles, linewidth=1, color=#0023FF)
// Display the pivot names on the chart, if applicable
newPivots = (showLabels == false) ? false :
(pivotType == "Intraday") ? sessEnd :
(pivotType == "Daily") ? dayofmonth != dayofmonth[1] :
dayofweek == monday and dayofmonth != dayofmonth[1]
plotchar(series=newPivots and plotS3R3 ? r3 : na,
char='', text="R3", offset=1,
location=location.absolute,
color=#0023FF, title="R3 label")
plotchar(series=newPivots and plotS2R2 ? r2 : na,
char='', text="R2", offset=1,
location=location.absolute,
color=#1E90FF, title="R2 label")
plotchar(series=newPivots and plotS1R1 ? r1 : na,
char='', text="R1", offset=1,
location=location.absolute,
color=#09E0F3, title="R1 label")
plotchar(series=newPivots and plotTCBC ? r1 : na,
char='', text="TC", offset=1,
location=location.absolute,
color=#FF00D1, title="TC label")
plotchar(series=newPivots and plotTCBC ? r1 : na,
char='', text="BC", offset=1,
location=location.absolute,
color=#FF00D1, title="BC label")
plotchar(series=newPivots and plotS1R1 ? s1 : na,
char='', text="S1", offset=1,
location=location.absolute,
color=#09E0F3, title="S1 label")
plotchar(series=newPivots and plotS2R2 ? s2 : na,
char='', text="S2", offset=1,
location=location.absolute,
color=#1E90FF, title="S2 label")
plotchar(series=newPivots and plotS3R3 ? s3 : na,
char='', text="S3", offset=1,
location=location.absolute,
color=#0023FF, title="S3 label")
// Highlight the intra-day price data session on the chart
bgcolor(color=showSess and inSession and (pivotType == "Intraday") ?
orange : na, transp=95)
// Step 4. Create indicator alerts
alertcondition(condition=cross(close, s3),
title="Pivot S3 Cross",
message="Prices crossed Pivot S3 level")
alertcondition(condition=cross(close, s2),
title="Pivot S2 Cross",
message="Prices crossed Pivot S2 level")
alertcondition(condition=cross(close, s1),
title="Pivot S1 Cross",
message="Prices crossed Pivot S1 level")
alertcondition(condition=cross(close, tc),
title="Pivot TC Cross",
message="Prices crossed Pivot TC level")
alertcondition(condition=cross(close, pp),
title="Pivot PP Cross",
message="Prices crossed the main Pivot Point level")
alertcondition(condition=cross(close, bc),
title="Pivot BC Cross",
message="Prices crossed Pivot BC level")
alertcondition(condition=cross(close, r1),
title="Pivot R1 Cross",
message="Prices crossed Pivot R1 level")
alertcondition(condition=cross(close, r2),
title="Pivot R2 Cross",
message="Prices crossed Pivot R2 level")
alertcondition(condition=cross(close, r3),
title="Pivot R3 Cross",
message="Prices crossed Pivot R3 level")
MA = sma(close, 20)
plot(MA, color=red)
Factor = input(2, type=float)
Pd = input(10, minval=1,maxval = 100)
Up = hl2-(Factor*atr(Pd))
Dn = hl2+(Factor*atr(Pd))
TrendUp = 0.0
TrendUp := close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown = 0.0
TrendDown := close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend = 0.0
Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = Trend==1? TrendUp: TrendDown
plot(Tsl, color=blue)
if close>open
if open<pp
if close>pp
if close>MA
strategy.entry("long", true)
if close<open
if open>pp
if close<pp
if close<MA
strategy.entry("short", false)
strategy.close("long", when = open<Tsl)
strategy.close("short", when = open>Tsl)