하이켄 아시와 슈퍼 트렌드의 결합 전략


생성 날짜: 2023-12-15 11:11:27 마지막으로 수정됨: 2023-12-15 11:11:27
복사: 0 클릭수: 1313
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

하이켄 아시와 슈퍼 트렌드의 결합 전략

개요

이것은 Heiken Ashi와 슈퍼 트렌드 (Super Trend) 의 두 지표를 결합한 양적 거래 전략이다. 이 전략은 주로 Heiken Ashi 평형 K 선을 사용하여 시장 소음을 필터링하고, 슈퍼 트렌드 지표는 가격 트렌드 방향을 판단하여 트렌드 추적을 구현한다.

전략 원칙

  1. Heiken Ashi 지표를 사용하여 K선으로 처리하여 일부 시장 소음을 필터링하여 트렌드를 더 명확하게합니다.
  2. ATR 및 인수 계산에 기반한 슈퍼 트렌드의 오르락 내리락
  3. 가격이 상승할 때 하향 신호, 하락할 때 상향 신호
  4. 더 큰 인자, 더 적은 슈퍼 트렌드 신호, 더 나은 추적 효과, 그러나 진입 횟수 감소
  5. 하이켄 아시와 슈퍼 트렌드 지표가 결합되어 트렌드를 판단하고 추적합니다.

전략적 이점

  1. Heiken Ashi 지표는 시장의 일부 소음을 효과적으로 필터링하여 그래프를 더 명확하게 만듭니다.
  2. 슈퍼 트렌드 지표 파라미터 최적화 효과가 좋으며, 입점 주파수를 유연하게 조정할 수 있다.
  3. 두 개의 지표가 조합되어 가격 추세를 더 잘 판단할 수 있습니다.
  4. 강력한 트렌드를 자동으로 추적합니다.

전략적 위험

  1. 지표 포트폴리지는 거래의 정렬 간격의 잘못된 신호를 완전히 피할 수 없습니다.
  2. 큰 점프로 인해 지표가 작동하지 않아 중요한 신호를 놓칠 수 있습니다.
  3. 슈퍼 트렌드 요소는 컨퍼런스를 설정하고 트렌드 기회를 놓치고 있습니다.

해결책: (1) 슈퍼 트렌드 매개 변수를 적절히 조정하여 추적 효과와 출입 횟수를 균형 잡습니다. (2) 다른 지표들을 추가하여 판단에 도움을 주고, 도약의 문제를 피하는 것.

전략 최적화 방향

  1. ATR 주기와 슈퍼 트렌드 인자를 조정하여 입시 빈도를 최적화하십시오.
  2. 단편적 손실을 통제하기 위한 스톱로스 지표를 늘리세요.
  3. 다른 지표와 결합하여 트렌드 유형을 판단하여 트렌드 흔들림 리듬을 잘못 처리하는 것을 피하십시오.
  4. 기계 학습 알고리즘을 추가하여 방향을 결정하는 데 도움을 줍니다.

요약하다

이 전략은 Heiken Ashi와 슈퍼 트렌드 이중 지표의 장점을 통합하여 지표를 사용하여 가치 트렌드 방향을 판단하여 자동 추적을 구현한다. 특정 지표를 사용하는 것에 비해 가격 움직임을 판단하는 효과는 더 좋으며 전략의 안정성을 강화한다. 물론, 개선할 여지가 있으며, 향후에는 진입 빈도, 손실 중단 측면에서 최적화하여 전략 수익률이 높고 위험도가 낮아진다.

전략 소스 코드
/*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)