Strategi Kombinasi Heiken Ashi dan Super Trend


Tanggal Pembuatan: 2023-12-15 11:11:27 Akhirnya memodifikasi: 2023-12-15 11:11:27
menyalin: 0 Jumlah klik: 1313
1
fokus pada
1621
Pengikut

Strategi Kombinasi Heiken Ashi dan Super Trend

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggabungkan dua indikator Heiken Ashi dan Super Trend. Strategi ini terutama menggunakan Heiken Ashi Smooth K-Line untuk memfilter kebisingan pasar, dan indikator Super Trend untuk menentukan arah tren harga, untuk melakukan pelacakan tren.

Prinsip Strategi

  1. Pengolahan garis K menggunakan indikator Heiken Ashi untuk menyaring sebagian dari kebisingan pasar dan membuat tren lebih jelas
  2. Uptrend dan downtrend berdasarkan ATR dan faktor komputasi supertrend
  3. Ketika harga menembus tren naik untuk sinyal turun, ketika harga menembus tren turun untuk sinyal naik
  4. Semakin besar faktornya, semakin sedikit sinyal supertrend, semakin baik efek pelacakan, namun jumlah entri menurun
  5. Menggabungkan Heiken Ashi dan Super Trend Indicator untuk menilai dan melacak tren

Keunggulan Strategis

  1. Indeks Heiken Ashi secara efektif menyaring sebagian dari kebisingan pasar, membuat grafik lebih jelas
  2. Optimisasi parameter indikator tren super efektif, dapat menyesuaikan frekuensi masuk dengan fleksibel
  3. Kombinasi dua indikator untuk menilai tren harga lebih efektif
  4. Menerapkan pelacakan otomatis terhadap tren kuat

Risiko Strategis

  1. Portfolio indikator tidak dapat sepenuhnya menghindari sinyal kesalahan dalam jangkauan perdagangan
  2. Jarak yang terlalu jauh dapat menyebabkan indikator gagal dan kehilangan sinyal penting.
  3. Faktor tren super yang membuat konvensi kehilangan peluang tren

Solusi: (1) Sesuai menyesuaikan parameter supertrend, menyeimbangkan efek pelacakan dan frekuensi masuk (2) Menambahkan indikator-indikator lain untuk membantu penilaian, menghindari masalah yang diakibatkan oleh lompatan udara

Arah optimasi strategi

  1. Mengatur siklus ATR dan faktor supertrend untuk mengoptimalkan frekuensi masuk
  2. Meningkatkan Stop Loss Indicator dan Mengontrol Kerugian Tunggal
  3. Perhitungan jenis tren, dikombinasikan dengan indikator lain, untuk menghindari perlakuan yang tidak tepat terhadap ritme tren yang bergoyang
  4. Menambahkan algoritma pembelajaran mesin untuk membantu menentukan arah

Meringkaskan

Strategi ini mengintegrasikan keuntungan Heiken Ashi dan supertrend dua indikator, menggunakan indikator untuk menentukan arah tren nilai, untuk melakukan pelacakan otomatis. Dibandingkan dengan menggunakan satu indikator, menilai pergerakan harga lebih efektif, meningkatkan stabilitas strategi. Tentu saja, ada juga ruang untuk perbaikan tertentu, di masa depan dapat dioptimalkan dari frekuensi masuk, stop loss, sehingga strategi mendapatkan keuntungan lebih tinggi, risiko lebih rendah.

Kode Sumber Strategi
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 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/
// © RingsCherrY

//@version=5

strategy("Heiken Ashi & Super Trend", overlay=true,  pyramiding=1,initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.02)

///////////////////////////////////////////////////
////////////////////Function///////////////////////
///////////////////////////////////////////////////


heikinashi_open = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open)
heikinashi_high = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high)
heikinashi_low  = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low)
heikinashi_close= request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)
heikinashi_color = heikinashi_open < heikinashi_close ? #53b987 : #eb4d5c
// plotbar(heikinashi_open, heikinashi_high, heikinashi_low, heikinashi_close, color=heikinashi_color)

x_sma(x, y) =>
    sumx = 0.0
    for i = 0 to y - 1
        sumx := sumx + x[i] / y
    sumx

x_rma(src, length) =>
	alpha = 1/length
	sum = 0.0
	sum := na(sum[1]) ? x_sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1])

x_atr(length) =>
    trueRange = na(heikinashi_high[1])? heikinashi_high-heikinashi_low : math.max(math.max(heikinashi_high - heikinashi_low, math.abs(heikinashi_high - heikinashi_close[1])), math.abs(heikinashi_low - heikinashi_close[1]))
    //true range can be also calculated with ta.tr(true)
    x_rma(trueRange, length)

x_supertrend(factor, atrPeriod) =>
	src = (heikinashi_high+heikinashi_low)/2
	atr = x_atr(atrPeriod)
	upperBand = src + factor * atr
	lowerBand = src - factor * atr
	prevLowerBand = nz(lowerBand[1])
	prevUpperBand = nz(upperBand[1])

	lowerBand := lowerBand > prevLowerBand or heikinashi_close[1] < prevLowerBand ? lowerBand : prevLowerBand
	upperBand := upperBand < prevUpperBand or heikinashi_close[1] > prevUpperBand ? upperBand : prevUpperBand
	int direction = na
	float superTrend = na
	prevSuperTrend = superTrend[1]
	if na(atr[1])
		direction := 1
	else if prevSuperTrend == prevUpperBand
		direction := heikinashi_close > upperBand ? -1 : 1
	else
		direction := heikinashi_close < lowerBand ? 1 : -1
	superTrend := direction == -1 ? lowerBand : upperBand
	[superTrend, direction]
	

///////////////////////////////////////////////////
////////////////////Indicators/////////////////////
///////////////////////////////////////////////////

atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)

[supertrend, direction] = x_supertrend(factor, atrPeriod)

bodyMiddle = plot((heikinashi_open + heikinashi_close) / 2, display=display.none)
upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(direction < 0? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr)

fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false)

///////////////////////////////////////////////////
////////////////////Strategy///////////////////////
///////////////////////////////////////////////////

var bool longCond                    = na, var bool shortCond                   = na, longCond := nz(longCond[1]), shortCond := nz(shortCond[1])
var int CondIni_long                 = 0, var int CondIni_short                 = 0, CondIni_long := nz(CondIni_long[1]), CondIni_short := nz(CondIni_short[1])
var float open_longCondition         = na, var float open_shortCondition   = na


long  = ta.change(direction) < 0
short = ta.change(direction) > 0


longCond        :=                                                              long
shortCond       :=                                                              short

CondIni_long    :=                                                              longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_long[1])
CondIni_short   :=                                                              longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_short[1])
longCondition   =                                                               (longCond[1] and nz(CondIni_long[1]) == -1)
shortCondition  =                                                               (shortCond[1] and nz(CondIni_short[1]) == 1)


open_longCondition             :=                                          long ? close[1] :                                                      nz(open_longCondition[1])
open_shortCondition            :=                                          short ? close[1] :                                                     nz(open_shortCondition[1])


//TP
tp                    = input.float(1.1  , "TP [%]",                      step = 0.1) 

//BACKTESTING inputs --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

testStartYear       =                   input.int(2000,                             title="start year",                                         minval = 1997, maxval = 3000,                                                   group= "BACKTEST") 
testStartMonth      =                   input.int(01,                               title="start month",                                        minval = 1, maxval = 12,                                                        group= "BACKTEST")
testStartDay        =                   input.int(01,                               title="start day",                                          minval = 1, maxval = 31,                                                        group= "BACKTEST")
testPeriodStart     =                   timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear        =                   input.int(3333,                             title="stop year",                                          minval=1980, maxval = 3333,                                                     group= "BACKTEST")
testStopMonth       =                   input.int(12,                               title="stop month",                                         minval=1, maxval=12,                                                            group= "BACKTEST")
testStopDay         =                   input.int(31,                               title="stop day",                                           minval=1, maxval=31,                                                            group= "BACKTEST")
testPeriodStop      =                   timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod          =                   true

// Backtest  ==================================================================================================================================================================================================================================================================================================================================


if longCond
    strategy.entry("L", strategy.long, when=testPeriod)

if shortCond
    strategy.entry("S", strategy.short, when=testPeriod)
    

strategy.exit("TP_L", "L", profit =((open_longCondition   *       (1+(tp/100))) - open_longCondition)/syminfo.mintick)

strategy.exit("TP_S", "S", profit =((open_shortCondition  *       (1+(tp/100))) - open_shortCondition)/syminfo.mintick)