Identifikasi tahap akumulasi dan strategi perdagangan

Penulis:ChaoZhang, Tanggal: 2024-02-20 11:29:57
Tag:

img

Gambaran umum

Strategi ini menggabungkan rata-rata bergerak, indikator volume dan indikator momentum harga untuk merancang seperangkat aturan kuantitatif untuk mengidentifikasi waktu persediaan memasuki tahap akumulasi.

Prinsip Strategi

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.

Keuntungan

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.

Risiko dan Solusi

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.

Ide-ide Optimasi

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.

Ringkasan

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)


Lebih banyak