Heiken Ashi Momentum Quant Strategi

Penulis:ChaoZhang
Tag:

img

Ringkasan

Strategi ini berdasarkan lilin harian Heiken Ashi, digabungkan dengan analisis momentum di pelbagai jangka masa, untuk menentukan secara dinamik sokongan asas di sebalik harga semasa dan mengenal pasti titik masuk dan keluar.

Logika Strategi

  1. Mengira harga penutupan lilin Heiken Ashi dalam jangka masa yang berbeza, sebagai asas untuk analisis momentum berikutnya.

  2. Ambil purata turun naik momentum harian dan bulanan masing-masing. Ini menapis beberapa bunyi bising dan memperoleh penanda aras momentum yang lebih stabil.

  3. Apabila harga penutupan melanggar ambang momentum, kedudukan panjang dimulakan setiap bulan.

Analisis Kelebihan

Kelebihan terbesar terletak pada fakta bahawa bukannya hanya mengejar harga, strategi mengira kekuatan sokongan sebenar di sebalik harga untuk masuk dan keluar. Ini berkesan menapis bunyi bising dari pasaran yang berbeza dan membolehkan kita menangkap aliran menaik yang stabil.

Analisis Risiko

Risiko terbesar adalah bahawa pengiraan momentum hanya bergantung pada harga sejarah.Jika asas syarikat atau rejimen pasaran melihat perubahan yang ketara, perwakilan harga sejarah menurun, yang membawa kepada kesilapan dalam mengenal pasti masuk dan keluar.

Juga, strategi ini memanfaatkan jangka masa bulanan dan harian. Ini bermakna prestasi masa nyata tidak terbaik, tidak mempunyai keupayaan untuk bertindak balas dengan cepat terhadap perubahan harga yang drastik. Oleh itu, terdapat risiko keluar tidak mencetuskan pada waktunya apabila harga tiba-tiba bertukar.

Cara yang mungkin untuk mengurangkan termasuk menggabungkan data frekuensi yang lebih tinggi dan maklum balas masa nyata mengenai asas-asas syarikat.

Arahan pengoptimuman

  1. Lebih meningkatkan lilin Heiken Ashi sendiri iaitu mengoptimumkan konfigurasi berat.

  2. Memperkenalkan data frekuensi yang lebih tinggi seperti bar minit untuk meningkatkan masa nyata.

  3. Masukkan amaran keuntungan, khabar angin M&A ke dalam pengiraan momentum untuk menambah asas syarikat.

Kesimpulan


/*backtest
start: 2023-01-12 00:00:00
end: 2024-01-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Scriptâ„¢ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FrancoPassuello

//@version=5
strategy("Heiken Ashi ADM", overlay=true)
haClose = (open + high + low + close) / 4
// prevHaOpen = line.new(na, na, na, na, width = 1)
haOpen = (open[1] + close[1]) / 2
// line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1]))
// line.set_xy2(prevHaOpen, bar_index, haClose[1])


[monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on)
[dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on)


get_rate_of_return(price1, price2) =>
    return_ = (price1/price2 -1)*100
    return_

m0 = get_rate_of_return(monclose, monopen)
m1 = get_rate_of_return(_1monclose, _1monopen)
m2 = get_rate_of_return(monclose, _2monopen)
m3 = get_rate_of_return(_1monclose, _3monopen)
m4 = get_rate_of_return(monclose, _4monopen)
m5 = get_rate_of_return(monclose, _5monopen)
m6 = get_rate_of_return(_1monclose, _6monopen)
MS = (m1 + m3 + m6)/100
CS = (m0 + m2 + m5)/100

d1 = get_rate_of_return(dayclose1, _21dayopen)
d2 = get_rate_of_return(dayclose1, _63dayopen)
d3 = get_rate_of_return(dayclose1, _126dayopen)
DS = (d1 + d2 + d3)/100

//Last (DAILY)
lastd_s_avg1 = DS/3

lastd_Approximate1 = dayclose1*(1-lastd_s_avg1)

last_approx1_d21 = lastd_Approximate1 / _21dayopen-1
last_approx1_d63 = lastd_Approximate1 / _63dayopen-1
last_approx1_d126 = lastd_Approximate1 / _126dayopen-1

lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3
lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2))
lastd_price = lastd_approximate2

//plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")

//Last

last_s_avg1 = MS/3

last_Approximate1 = _1monclose*(1-last_s_avg1)

last_approx1_m1 = last_Approximate1 / _1monopen-1
last_approx1_m3 = last_Approximate1 / _3monopen-1
last_approx1_m6 = last_Approximate1 / _6monopen-1

last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3
last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2))
last_price = last_approximate2
Scoring_price = _1monclose*(1-CS)

plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")
//plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold")

//Long based on month close and being the first trade of the month.

var int lastClosedMonth = -1
limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Long based on day close and being the first trade of the month.
limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Close trade based on day close

DCloseLongCondition = dayclose1<lastd_approximate2

//Old standard Trading rules
longCondition = _1monclose > Scoring_price
MCloseLongCondition = _1monclose<Scoring_price
shortCondition = CS < 0

if (longCondition)
    strategy.entry("Long", strategy.long)


if (strategy.position_size > 0 and MCloseLongCondition)
    strategy.close("Long")
    lastClosedMonth := month(time)

Lebih lanjut