
Chiến lược này đã thiết kế một bộ quy tắc định lượng để xác định thời gian khi cổ phiếu đi vào giai đoạn tích lũy bằng cách kết hợp sử dụng đường trung bình di chuyển, chỉ số khối lượng giao dịch và chỉ số động lực giá. Trong giai đoạn này, cổ phiếu thường ở trong trạng thái cân bằng và tích lũy giá, cung cấp cơ hội tốt để giá thấp hơn đi vào.
Chiến lược sử dụng đường trung bình di chuyển đơn giản 50 ngày, 90 ngày và 200 ngày để đánh giá xu hướng giá. Chỉ khi giá cao hơn đường 200 ngày, tín hiệu mua sẽ được tạo ra. Điều này có thể lọc sự không chắc chắn của xu hướng lớn.
Ngoài việc xác định xu hướng lớn, chiến lược cũng xác định xu hướng theo thứ tự đường trung bình ngắn hạn. Cụ thể, xác định đường 50 ngày cao hơn đường 90.
Trên cơ sở xác nhận xu hướng lớn và xu hướng ngắn hạn của đường trung bình di chuyển, chiến lược kết hợp các chỉ số giao dịch PVT và MACD để đánh giá các đặc điểm tích lũy. Chỉ khi PVT đột phá lên, đường MACD cao hơn đường tín hiệu và khối lượng giao dịch tăng lên, tín hiệu mua sẽ được tạo ra.
So với việc sử dụng chỉ một đường trung bình di chuyển, chiến lược này xác nhận xu hướng và kiểm tra các đặc điểm về khối lượng giao dịch. Điều này có thể xác định chính xác hơn thời gian khi cổ phiếu đi vào giai đoạn tích lũy, do đó đảm bảo lợi thế giá vào thị trường.
Bằng cách phân tích nhiều khung thời gian, chiến lược này kết hợp phán đoán xu hướng trung và dài hạn với phán đoán đặc điểm ngắn hạn, và kết hợp khung thời gian có thể giảm bớt sự không chắc chắn do sai sót phán đoán của một khung thời gian duy nhất.
Chiến lược này chủ yếu dựa vào phán đoán đường trung bình, khi giá có biến động mạnh, phán đoán đường trung bình sẽ không có hiệu lực. Trong trường hợp này, bạn nên giảm quy mô vị trí hoặc dừng lỗ trực tiếp.
Ngoài ra, phán đoán trong giai đoạn tích lũy cũng có thể sai, do đó bỏ lỡ cơ hội đảo ngược. Điều này cần phải được xác nhận bằng cách quan sát thêm các chỉ số đặc trưng.
Chiến lược này có thể giới thiệu các thuật toán học máy để thực hiện phán đoán tự động về giai đoạn tích lũy thông qua chiết xuất đặc điểm và đào tạo mô hình. Điều này có thể làm giảm các hạn chế do thiết lập ngưỡng bằng tay.
Ngoài ra, chiến lược này cũng có thể thử nghiệm các tính năng breakpoint, tự động chuyển đổi các tham số khác nhau trong các môi trường thị trường khác nhau, làm cho chiến lược trở nên mạnh mẽ hơn.
Chiến lược này nói chung sử dụng tư duy phù hợp với giá và khối lượng giao dịch để đánh giá tính chất tích lũy cổ phiếu. Trong khi xác nhận định hướng lớn, khai thác cơ hội tích lũy ngắn hạn. Có không gian để nâng cao hiệu quả chiến lược thông qua việc giới thiệu các phương tiện như tối ưu hóa tham số và học máy.
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 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/
// © stocktechbot
//@version=5
strategy("Accumulate", overlay = true)
lookback = input(defval = 21, title = 'Lookback')
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
//SMA Tredline
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
//sma plot
plot(out, color=color.blue, title="MA200", offset=offset)
plot(outf, color=color.maroon, title="MA50", offset=offset)
plot(outn, color=color.orange, title="MA90", offset=offset)
plot(outt, color=color.olive, title="MA21", offset=offset)
//MarketCap Calculation
//MarketCap = 0.0
//TSO = request.financial(syminfo.tickerid, "TOTAL_SHARES_OUTSTANDING", "FQ", ignore_invalid_symbol = true)
//if str.tostring(TSO) != 'na'
// if ta.barssince(TSO != TSO[1] and TSO > TSO[1])==0
// MarketCap := TSO * close
//
// if barstate.islast and MarketCap == 0
// runtime.error("No MarketCap is provided by the data vendor.")
//
//momlen = 100
//msrc = MarketCap
//mom = msrc - msrc[momlen]
//plotmom = if (mom > mom[1])
// true
//else
// false
//OBV with sma on macd
obv = ta.cum(math.sign(ta.change(close)) * volume)
smoothingLength = 5
smoothingLine = ta.sma(obv,5)
[macdLine, signalLine, histLine] = ta.macd(ta.pvt, 12, 26, 9)
sellvolhigh = macdLine < signalLine
buyvolhigh = macdLine > signalLine
//Buy Signal
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
higheshigh = ta.rising(high, 2)
higheslow = ta.rising(low, 2 )
twohunraise = ta.rising(out, 2)
//highvol = ta.crossover(volume, ta.sma(volume, lookback))
highvol = ta.rising(volume,2)
fourlow = ta.lowest(close, lookback)
fourhig = ta.highest(close, lookback)
change = (((fourhig - fourlow) / fourlow) * 100) <= 30
green = close > open
allup = false
lineabove = ta.cross(close, ta.sma(close, input(defval = 21, title = 'Entry Line')))
if matwohun and mafentry and higheshigh and twohunraise and buyvolhigh
//if higheshigh and higheslow and highvol
allup := true
plotshape(allup, style=shape.arrowup,location=location.belowbar, color=color.green, title = "Buy Signal")
barsSinceLastEntry() =>
strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na
//Sell Signal
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
linebreak = ta.sma(close, input(defval = 21, title = 'Exit Line')) > close
lowesthigh = ta.falling(high, 3)
lowestlow = ta.falling(low, 2 )
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
highvole = ta.crossover(volume, ta.sma(volume, 5))
//fourlow = ta.lowest(close, lookback)
//fourhig = ta.highest(close, lookback)
changed = (((fourhig - close) / close) * 100) >= 10
red = close < open
atr = ta.atr(14)
//atrsmalen = int(bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) )
atrsmalen = barsSinceLastEntry()
atrsma = false
atrlen = 5
if str.tostring(atrsmalen) != 'NaN' and atrsmalen > 0
atrlen := atrsmalen
atrsma := atr > ta.sma(atr,50)
alldwn = false
if sellvolhigh and lowestlow and (close < close[1] and close < open)
//if higheshigh and higheslow and highvol
alldwn := true
plotshape(alldwn, style=shape.arrowdown,location=location.abovebar, color=color.red, title = "Sell Signal")
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (allup)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (alldwn)
strategy.entry("My Short Entry Id", strategy.short)