
Chiến lược này sử dụng cơ chế lùi động nhiều khung thời gian để đánh giá xu hướng giá bằng cách so sánh giá cao nhất và giá thấp nhất trong các khoảng thời gian khác nhau, để đạt được mức độ rủi ro thấp.
Chiến lược này lấy giá cao nhất và giá thấp nhất trong các khoảng thời gian khác nhau bằng cách gọi hàm tùy chỉnh f_get_htfHighLow. Cụ thể, dựa trên độ phân giải của khoảng thời gian, nhân số của khoảng thời gian HTFMultiplier, tham số quay ngược lookahead và khoảng cách, và tính toán offset, gọi hàm security để lấy giá cao nhất và giá thấp nhất trong các khoảng thời gian khác nhau.
Ví dụ, khi offset là 0, nhận được giá cao nhất và giá thấp nhất của dòng K hiện tại; khi offset là 1, nhận được giá cao nhất và giá thấp nhất của dòng K trước đó. Bằng cách so sánh sự thay đổi giá giữa hai dòng K, đánh giá hướng xu hướng.
Nếu giá cao nhất tăng và giá thấp nhất tăng, thì được đánh giá là xu hướng lạc quan; Nếu giá cao nhất giảm và giá thấp nhất giảm, thì được đánh giá là xu hướng giảm.
Giải pháp:
Chiến lược này có ý tưởng tổng thể rõ ràng, sử dụng nhiều khung thời gian động lùi để đánh giá xu hướng giá cổ phiếu, giảm thiểu tối đa lỗi đánh giá nhân tạo, là một chiến lược giao dịch theo quy trình điển hình. Bằng cách tối ưu hóa tham số và mở rộng chức năng, có thể tăng cường thêm sự ổn định và lợi nhuận của chiến lược, đáng để nghiên cứu và theo dõi.
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 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("HTF High/Low Repaint Strategy", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true
resolution = input("3M", type=input.resolution)
HTFMultiplier = input(22, minval=1, step=1)
offset = input(0, minval=0, step=1)
lookahead = input(true)
gaps = false
f_secureSecurity_on_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_on)
f_secureSecurity_on_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)
f_secureSecurity_off_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_on)
f_secureSecurity_off_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_off)
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_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)=>
derivedResolution = resolution == ""?f_multiple_resolution(HTFMultiplier):resolution
nhigh_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, high, offset)
nlow_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, low, offset)
nhigh_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, high, offset)
nlow_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, low, offset)
nhigh_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, high, offset)
nlow_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, low, offset)
nhigh_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, high, offset)
nlow_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, low, offset)
nhigh = lookahead and gaps ? nhigh_on_on :
lookahead and not gaps ? nhigh_on_off :
not lookahead and gaps ? nhigh_off_on :
not lookahead and not gaps ? nhigh_off_off : na
nlow = lookahead and gaps ? nlow_on_on :
lookahead and not gaps ? nlow_on_off :
not lookahead and gaps ? nlow_off_on :
not lookahead and not gaps ? nlow_off_off : na
[nhigh, nlow]
[nhigh, nlow] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)
[nhighlast, nlowlast] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset+1)
plot(nhigh , title="HTF High",style=plot.style_circles, color=color.green, linewidth=1)
plot(nlow , title="HTF Low",style=plot.style_circles, color=color.red, linewidth=1)
buyCondition = nhigh > nhighlast and nlow > nlowlast
sellCondition = nhigh < nhighlast and nlow < nlowlast
strategy.entry("Buy", strategy.long, when= buyCondition and inDateRange, oca_name="oca_buy")
strategy.entry("Sell", strategy.short, when= sellCondition and inDateRange, oca_name="oca_sell")