Strategi ini menggabungkan rata-rata bergerak, indikator volume dan indikator momentum harga untuk merancang seperangkat aturan kuantitatif untuk mengidentifikasi waktu persediaan memasuki tahap akumulasi.
Strategi ini menggunakan rata-rata bergerak sederhana 50 hari, 90 hari dan 200 hari untuk menentukan tren harga. Sinyal beli hanya dihasilkan ketika harga berada di atas garis 200 hari. Ini menyaring ketidakpastian tren penurunan utama.
Selain menilai tren utama, strategi ini juga menilai urutan rata-rata bergerak jangka pendek untuk mengkonfirmasi tren. Secara khusus, strategi ini menilai apakah garis 50 hari berada di atas garis 90 hari.
Berdasarkan bahwa moving average mengkonfirmasi tren utama dan jangka pendek, strategi menggabungkan indikator volume PVT dan indikator MACD untuk menilai karakteristik akumulasi.
Dibandingkan dengan menggunakan rata-rata bergerak saja, strategi ini juga memeriksa karakteristik volume sambil mengkonfirmasi tren. Hal ini dapat lebih akurat menentukan waktu persediaan memasuki tahap akumulasi, sehingga memastikan harga awal yang lebih baik.
Dengan menganalisis beberapa kerangka waktu, strategi ini menggabungkan penilaian tren jangka menengah dan panjang dan penilaian fitur jangka pendek untuk mencocokkan kerangka waktu, yang dapat mengurangi ketidakpastian dari menilai kerangka waktu tunggal dengan salah.
Strategi ini terutama bergantung pada penilaian rata-rata bergerak. Ketika harga berfluktuasi dengan keras, penilaian rata-rata bergerak akan gagal. Pada titik ini, ukuran posisi harus dikurangi atau stop loss exit harus dipicu.
Selain itu, penilaian yang salah pada tahap akumulasi mungkin terjadi, sehingga kehilangan kesempatan untuk membalikkan.
Algoritma pembelajaran mesin dapat diperkenalkan ke dalam strategi ini dengan mengekstrak fitur dan pelatihan model untuk mencapai penilaian otomatis tahap akumulasi.
Selain itu, strategi ini juga dapat mencoba fungsi breakpoint untuk secara otomatis mengubah parameter di lingkungan pasar yang berbeda, membuat strategi lebih kuat.
Secara keseluruhan, strategi ini umumnya mengadopsi gagasan pencocokan harga dan volume untuk menilai karakteristik tahap akumulasi stok. Sementara mengkonfirmasi arah utama, ia menggali peluang akumulasi jangka pendek. Masih ada ruang untuk peningkatan kinerja strategi lebih lanjut dengan memperkenalkan optimasi parameter dan pembelajaran mesin.
/*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)