Heiken Ashi dan Strategi Gabungan Super Trend


Tarikh penciptaan: 2023-12-15 11:11:27 Akhirnya diubah suai: 2023-12-15 11:11:27
Salin: 0 Bilangan klik: 1310
1
fokus pada
1621
Pengikut

Heiken Ashi dan Strategi Gabungan Super Trend

Gambaran keseluruhan

Ini adalah strategi perdagangan kuantitatif yang menggabungkan dua petunjuk Heiken Ashi dan Super Trend. Strategi ini menggunakan Heiken Ashi untuk menyaring bunyi pasaran, dan petunjuk Super Trend untuk menentukan arah trend harga, dan untuk mengesan trend.

Prinsip Strategi

  1. Menggunakan Heiken Ashi Indicator untuk memproses K-Line dan menapis sebahagian daripada bunyi pasaran untuk menjadikan trend lebih jelas
  2. Uptrend dan downtrend berdasarkan ATR dan faktor pengiraan super trend
  3. Apabila harga menembusi rantaian, ia akan memberi isyarat penurunan, dan apabila ia menembusi rantaian, ia akan memberi isyarat kenaikan.
  4. Semakin besar faktor, semakin sedikit isyarat super trend, lebih baik kesan pengesanan, tetapi jumlah kemasukan menurun
  5. Gabungan Heiken Ashi dan Super Trend Indicator untuk menilai dan menjejaki trend

Kelebihan Strategik

  1. Indeks Heiken Ashi menapis sebahagian bunyi pasaran dengan berkesan, menjadikan grafik lebih jelas
  2. Pengoptimuman parameter indikator trend super berkesan, boleh menyesuaikan frekuensi masuk dengan fleksibel
  3. Gabungan dua indikator untuk menilai trend harga dengan lebih baik
  4. Meneroka trend yang kuat secara automatik

Risiko Strategik

  1. Portfolio penunjuk tidak dapat sepenuhnya mengelakkan isyarat salah dalam tempoh penyelesaian perdagangan
  2. Pelanggaran yang besar boleh menyebabkan indikator tidak berfungsi dan kehilangan isyarat penting
  3. Faktor-faktor Supertrend yang Menetapkan Persidangan dan Melewatkan Peluang Trend

Penyelesaian: (1) Sesuai menyesuaikan parameter super trend, keseimbangan kesan pengesanan dan kekerapan masuk (2) Menambah petunjuk lain untuk membantu penghakiman, mengelakkan masalah yang disebabkan oleh melompat

Arah pengoptimuman strategi

  1. Menyesuaikan kitaran ATR dan faktor trend super untuk mengoptimumkan frekuensi kemasukan
  2. Meningkatkan parameter stop-loss untuk mengawal kerugian tunggal
  3. Berkongsi dengan petunjuk lain untuk menentukan jenis trend, untuk mengelakkan perlakuan yang tidak betul terhadap pergerakan pergerakan
  4. Menambah algoritma pembelajaran mesin untuk membantu menentukan hala tuju

ringkaskan

Strategi ini mengintegrasikan kelebihan Heiken Ashi dan super trend kedua-dua indikator, menggunakan indikator untuk menentukan arah trend nilai, untuk menjejaki secara automatik. Berbanding dengan menggunakan satu indikator, keputusan pergerakan harga lebih berkesan, meningkatkan kestabilan strategi. Sudah tentu, terdapat ruang untuk penambahbaikan, dan masa depan dapat dioptimumkan dari segi frekuensi masuk, berhenti kehilangan, menjadikan keuntungan strategi lebih tinggi, risiko lebih rendah.

Kod 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)