Chiến lược này tính toán các điểm pivot trên các khung thời gian khác nhau như mức giá chính và sử dụng nguyên tắc tỷ lệ vàng để xác định hướng xu hướng để thực hiện chiến lược giao dịch mua cao bán thấp.
Tính toán các điểm pivot bao gồm các pivot cổ điển và pivot Fibonacci bằng cách sử dụng giá đóng, giá cao nhất và giá thấp nhất trong các khung thời gian khác nhau.
Xác định vùng giá mà giá hiện tại dựa trên các dải trên và dưới. Có 5 vùng mua và 5 vùng bán.
Tạo tín hiệu mua khi giá ở vùng mua và bán tín hiệu khi giá ở vùng bán để thực hiện chiến lược mua cao bán thấp.
Sử dụng phân tích nhiều khung thời gian để xác định xu hướng tránh bị đánh lừa bởi tiếng ồn thị trường.
Kết hợp các pivot cổ điển và pivot Fibonacci cải thiện độ tin cậy của các điểm pivot.
Xác định thị trường dựa trên các vùng giá tối đa hóa việc tránh rủi ro.
Theo các quy tắc giao dịch theo xu hướng bằng cách mua cao và bán thấp tránh giao dịch chống lại xu hướng.
Các điểm trung tâm có thể thất bại, vì vậy những bước đột phá cần phải được theo dõi.
Tránh làm xấu thêm tổn thất từ lệnh dừng lỗ đặt sai.
Phí giao dịch cũng có thể ảnh hưởng đến lợi nhuận cuối cùng.
Kiểm tra các thông số khác nhau như khung thời gian, hướng giao dịch vv để tối ưu hóa chiến lược.
Bao gồm các chỉ số khác để xác nhận xu hướng để tránh sự đột phá sai.
Thêm các cơ chế dừng lỗ để kiểm soát số tiền lỗ giao dịch duy nhất.
Chiến lược này tích hợp phân tích kỹ thuật cổ điển và giao dịch xu hướng bằng cách sử dụng các vùng điểm pivot để nhập thời gian và mua cao và bán thấp để quản lý hiệu quả rủi ro thương mại.
/*backtest start: 2022-12-22 00:00:00 end: 2023-12-28 00:00:00 period: 1d basePeriod: 1h 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/ // © HeWhoMustNotBeNamed //@version=4 strategy("BuyHighSellLow - Pivot points", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true) Source = input(close) resolution = input("4D", type=input.resolution) HTFMultiplier = input(4, title="Higher Timeframe multiplier (Used when resolution is set to Same as Symbol)", minval=2, step=1) //ppType = input(title="Pivot points type", defval="classic", options=["classic", "fib"]) ppType = "fib" tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short]) backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30) backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"]) hideBands = input(true) f_multiple_resolution(HTFMultiplier) => target_Res_In_Min = timeframe.multiplier * HTFMultiplier * ( timeframe.isseconds ? 1. / 60. : timeframe.isminutes ? 1. : timeframe.isdaily ? 1440. : timeframe.isweekly ? 7. * 24. * 60. : timeframe.ismonthly ? 30.417 * 24. * 60. : na) target_Res_In_Min <= 0.0417 ? "1S" : target_Res_In_Min <= 0.167 ? "5S" : target_Res_In_Min <= 0.376 ? "15S" : target_Res_In_Min <= 0.751 ? "30S" : target_Res_In_Min <= 1440 ? tostring(round(target_Res_In_Min)) : tostring(round(min(target_Res_In_Min / 1440, 365))) + "D" f_getBackTestTimeFrom(backtestFrom, backtestBars)=> byDate = backtestFrom == "days" byMonth = backtestFrom == "months" byYear = backtestFrom == "years" date = dayofmonth(timenow) mth = month(timenow) yr = year(timenow) leapYearDaysInMonth = array.new_int(12,0) array.set(leapYearDaysInMonth,0,31) array.set(leapYearDaysInMonth,1,29) nonleapYearDaysInMonth = array.new_int(12,0) array.set(leapYearDaysInMonth,0,31) array.set(leapYearDaysInMonth,1,28) restMonths = array.new_int(10,0) array.set(leapYearDaysInMonth,0,31) array.set(leapYearDaysInMonth,1,30) array.set(leapYearDaysInMonth,2,31) array.set(leapYearDaysInMonth,3,30) array.set(leapYearDaysInMonth,4,31) array.set(leapYearDaysInMonth,5,31) array.set(leapYearDaysInMonth,6,30) array.set(leapYearDaysInMonth,7,31) array.set(leapYearDaysInMonth,8,30) array.set(leapYearDaysInMonth,9,31) array.concat(leapYearDaysInMonth,restMonths) array.concat(nonleapYearDaysInMonth,restMonths) isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0) numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2) if(byDate) mth := (date - backtestBars) < 0 ? mth - 1 : mth yr := mth < 1 ? yr - 1 : yr mth := mth < 1 ? 1 : mth date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1 if(byMonth) date := 1 yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12) mth := mth - (backtestBars%12) + 1 if(byYear) date := 1 mth := 1 yr := yr - backtestBars [date, mth, yr] f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on) f_getClassicPivots(HIGHprev, LOWprev, CLOSEprev)=> PP = (HIGHprev + LOWprev + CLOSEprev) / 3 R1 = PP * 2 - LOWprev S1 = PP * 2 - HIGHprev R2 = PP + (HIGHprev - LOWprev) S2 = PP - (HIGHprev - LOWprev) R3 = PP * 2 + (HIGHprev - 2 * LOWprev) S3 = PP * 2 - (2 * HIGHprev - LOWprev) R4 = PP * 3 + (HIGHprev - 3 * LOWprev) S4 = PP * 3 - (3 * HIGHprev - LOWprev) R5 = PP * 4 + (HIGHprev - 4 * LOWprev) S5 = PP * 4 - (4 * HIGHprev - LOWprev) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] f_getFibPivots(HIGHprev, LOWprev, CLOSEprev)=> PP = (HIGHprev + LOWprev + CLOSEprev) / 3 R1 = PP + 0.382 * (HIGHprev - LOWprev) S1 = PP - 0.382 * (HIGHprev - LOWprev) R2 = PP + 0.618 * (HIGHprev - LOWprev) S2 = PP - 0.618 * (HIGHprev - LOWprev) R3 = PP + (HIGHprev - LOWprev) S3 = PP - (HIGHprev - LOWprev) R4 = PP + 1.41 * (HIGHprev - LOWprev) S4 = PP - 1.41 * (HIGHprev - LOWprev) R5 = PP + 1.65 * (HIGHprev - LOWprev) S5 = PP - 1.65 * (HIGHprev - LOWprev) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] f_getPivotPoints(HTFMultiplier, resolution, ppType)=> derivedResolution = resolution == ""? f_multiple_resolution(HTFMultiplier) : resolution HIGHprev = f_secureSecurity(syminfo.tickerid, derivedResolution, high) LOWprev = f_secureSecurity(syminfo.tickerid, derivedResolution, low) CLOSEprev = f_secureSecurity(syminfo.tickerid, derivedResolution, close) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] = f_getClassicPivots(HIGHprev, LOWprev, CLOSEprev) [Rf5, Rf4, Rf3, Rf2, Rf1, PPf, Sf1, Sf2, Sf3, Sf4, Sf5] = f_getFibPivots(HIGHprev, LOWprev, CLOSEprev) [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] f_getState(Source, R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5)=> state = Source > R5 ? 5 : Source > R4 ? 4 : Source > R3 ? 3 : Source > R2 ? 2 : Source > R1 ? 1 : Source > PP ? 0 : Source > S1 ? -1 : Source > S2 ? -2 : Source > S3 ? -3 : Source > S4 ? -4 : Source > S5 ? -5 : -6 state [R5, R4, R3, R2, R1, PP, S1, S2, S3, S4, S5] = f_getPivotPoints(HTFMultiplier, resolution, ppType) [date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars) inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0) BBU5 = plot(not hideBands ? R5: na, title="R5", color=color.orange, linewidth=1, transp=50, style=plot.style_linebr) BBU4 = plot(not hideBands ? R4: na, title="R4", color=color.yellow, linewidth=1, transp=50, style=plot.style_linebr) BBU3 = plot(not hideBands ? R3: na, title="R3", color=color.navy, linewidth=1, transp=50, style=plot.style_linebr) BBU2 = plot(not hideBands ? R2: na, title="R2", color=color.olive, linewidth=1, transp=50, style=plot.style_linebr) BBU1 = plot(not hideBands ? R1: na, title="R1", color=color.lime, linewidth=1, transp=50, style=plot.style_linebr) BBM4 = plot(not hideBands ? PP:na, title="PP", color=color.black, linewidth=2, style=plot.style_linebr) BBL1 = plot(not hideBands ? S1: na, title="S1", color=color.lime, linewidth=1, transp=50, style=plot.style_linebr) BBL2 = plot(not hideBands ? S2: na, title="S2", color=color.olive, linewidth=1, transp=50, style=plot.style_linebr) BBL3 = plot(not hideBands ? S3: na, title="S3", color=color.navy, linewidth=1, transp=50, style=plot.style_linebr) BBL4 = plot(not hideBands ? S4: na, title="S4", color=color.yellow, linewidth=1, transp=50, style=plot.style_linebr) BBL5 = plot(not hideBands ? S5: na, title="S5", color=color.orange, linewidth=1, transp=50, style=plot.style_linebr) fill(BBU5, BBU4, title="RZ5", color=color.green, transp=90) fill(BBU4, BBU3, title="RZ4", color=color.lime, transp=90) fill(BBU3, BBU2, title="RZ3", color=color.olive, transp=90) fill(BBU2, BBU1, title="RZ2", color=color.navy, transp=90) fill(BBU1, BBM4, title="RZ1", color=color.yellow, transp=90) fill(BBM4, BBL1, title="SZ1", color=color.orange, transp=90) fill(BBL1, BBL2, title="SZ2", color=color.red, transp=90) fill(BBL2, BBL3, title="SZ3", color=color.maroon, transp=90) fill(BBL3, BBL4, title="SZ4", color=color.maroon, transp=90) fill(BBL4, BBL5, title="SZ5", color=color.maroon, transp=90) strategy.risk.allow_entry_in(tradeDirection) longCondition = crossover(Source[1],R1) and inDateRange shortCondition = crossunder(Source[1], S2) and inDateRange strategy.entry("Buy", strategy.long, when=longCondition, oca_name="oca") strategy.entry("Sell", strategy.short, when=shortCondition, oca_name="oca")