Chiến lược này kết hợp các đường trung bình động, chỉ số khối lượng và chỉ số động lực giá để thiết kế một bộ quy tắc định lượng để xác định thời gian dự trữ bước vào giai đoạn tích lũy.
Chiến lược này sử dụng trung bình di chuyển đơn giản 50 ngày, 90 ngày và 200 ngày để xác định xu hướng giá. Các tín hiệu mua chỉ được tạo ra khi giá vượt quá đường 200 ngày. Điều này lọc sự không chắc chắn của xu hướng giảm lớn.
Ngoài việc đánh giá xu hướng chính, chiến lược cũng đánh giá thứ tự của các đường trung bình động ngắn hạn để xác nhận xu hướng.
Trên cơ sở rằng đường trung bình động xác nhận các xu hướng chính và ngắn hạn, chiến lược kết hợp chỉ số khối lượng PVT và chỉ số MACD để đánh giá các đặc điểm tích lũy.
So với sử dụng chỉ trung bình động, chiến lược này cũng kiểm tra các đặc điểm về khối lượng trong khi xác nhận xu hướ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 các đánh giá xu hướng trung và dài hạn và các đánh giá tính năng ngắn hạn để phù hợp với các khung thời gian, có thể làm giảm sự không chắc chắn từ việc đánh giá một khung thời gian duy nhất không chính xác.
Chiến lược này chủ yếu dựa trên các phán đoán trung bình động. Khi giá dao động mạnh mẽ, các phán đoán trung bình động sẽ thất bại. Tại thời điểm này, kích thước vị trí nên được giảm hoặc một lệnh dừng lỗ phải được kích hoạt.
Ngoài ra, đánh giá sai ở giai đoạn tích lũy có thể xảy ra, do đó bỏ lỡ cơ hội đảo ngược.
Các thuật toán học máy có thể được đưa vào chiến lược này bằng cách chiết xuất các tính năng và đào tạo mô hình để đạt được đánh giá tự động về giai đoạn tích lũy.
Ngoài ra, chiến lược này cũng có thể thử chức năng điểm ngắt để tự động chuyển đổi các tham số trong môi trường thị trường khác nhau, làm cho chiến lược mạnh mẽ hơn.
Tóm lại, chiến lược này thường áp dụng ý tưởng khớp giá và khối lượng để đánh giá các đặc điểm của các giai đoạn tích lũy cổ phiếu. Trong khi xác nhận hướng chính, nó đào cơ hội tích lũy ngắn hạn.
/*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)