멀티 타임프레임 모멘텀 브레이크업 전략

저자:차오장, 날짜: 2023-12-29 16:56:09
태그:

img

전반적인 설명

이 전략은 트렌드를 식별하고 브레이크아웃 포인트를 캡처하기 위해 RSI, ADX, ATR 및 모멘텀과 같은 여러 기술적 인 지표를 결합합니다. 또한 키 레벨 및 트렌드의 식별을 더욱 향상시키기 위해 피보나치 리트레이싱 및 이동 평균을 사용합니다.

전략 논리

  1. 트렌드 방향과 강도를 결정하기 위해 RSI, ADX, DI+, DI- 등을 사용하십시오. RSI는 과잉 구매 / 과잉 판매 수준을 나타냅니다. ADX는 트렌드 강도를 나타냅니다. DI + / DI-는 상승 / 하락 추세를 나타냅니다. 이러한 지표는 쉬운 참조를 위해 테이블에 표시됩니다.

  2. 트렌드 방향을 결정하기 위해 이동 평균을 사용하십시오. 5 & 9 일 EMA는 단기 트렌드, 21 일 WMA 중장기 트렌드 및 60 일 WMA 장기 트렌드를 정의합니다. 황금 십자 신호 잠재 상승 추세.

  3. 0.5, 0.618 피보나치 리트레이싱 레벨을 식별합니다. 이는 종종 반전을 위한 지원/저항 구역으로 작용합니다.

  4. ATR에 기초한 스톱 로스 및 스톱 로스 %를 설정하여 위험을 제어합니다. ATR에 기초한 수익을 취하고 수익을 취하여 수익을 차단합니다.

  5. RSI 과잉 구매/ 과잉 판매 신호의 반전을 고려하십시오. 부피 증가와 함께 황금 십자가에 대한 승차 추세를 고려하십시오. 중지 손실을 설정하고 진입 후 이익을 취하십시오.

이점 분석

  1. 지표의 조합은 추세와 힘에 대한 결정의 정확성을 향상시킵니다.

  2. ATR에 기반한 스톱 로스 및 수익을 효과적으로 통제합니다.

  3. 피보나키는 전환점의 식별을 향상시킵니다.

  4. 부피 필터는 추세를 따라 fals breakouts를 피합니다.

  5. 이 표는 빠른 결정을 위한 지표 값을 명확하게 보여줍니다.

위험 분석

  1. 부정확한 신호의 가능성은 완전히 피할 수 없으며 잘못된 거래를 유발합니다. 지표의 정확성을 향상시키기 위해 매개 변수를 최적화 할 수 있습니다.

  2. ATR 및 스톱 로스 %는 실제 스톱 로스 가격에 영향을 미칩니다. 부적절한 설정은 위험을 증가시킬 수 있습니다. 세밀한 조정이 필요합니다.

  3. 볼륨 필터는 잘못된 파장을 완전히 피할 수 없습니다. 가격 행동 세부 사항을 확인해야합니다.

  4. 피보나치 레벨은 항상 신뢰할 수 없습니다. 가격은 완전히 돌파 할 수 있습니다.

최적화 방향

  1. 가장 좋은 조합을 찾기 위해 RSI, ADX, ATR 같은 매개 변수를 테스트하고 최적화합니다.

  2. 가장 좋은 트렌드 식별을 위해 다른 이동 평균 조합을 테스트합니다.

  3. 다른 스톱 로스/프로피트 취업 비율을 테스트하여 가장 좋은 리스크/리워드를 얻습니다.

  4. 볼링거 밴드를 추가해 볼륨 확장을 확인해 보세요.

결론

이 전략은 트렌드 분석, 키 레벨 식별, 볼륨 분석 등을 결합한다. 추가 매개 변수 최적화는 정확성과 수익성을 향상시킬 수 있다. 스톱 로스 앤 트레이프 이윤은 위험을 관리하고 보상을 극대화한다. 중장기 트렌드를 측정하고 단기 반전을 포착하는 데 효과적이다. 지속적인 최적화는 전략을 더욱 견고하게 할 수 있다.


/*backtest
start: 2022-12-22 00:00:00
end: 2023-12-28 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/
// © amit74sharma135

//@version=5

strategy(" KritikSharma Strategy for NIFTY,BNIFTY,NG,CRUDE,WTICrude,BTC,GOLD,SILVER,COPPER", overlay=true)
plotHVB = input.bool(defval=true, title='Plot HVB')
plotPVT = input.bool(defval=false, title='Plot Pivots')
hvbEMAPeriod = input.int(defval=12, minval=1, title='Volume EMA Period')
hvbMultiplier = input.float(defval=1.5, title='Volume Multiplier')
pivotLookup = input.int(defval=2, minval=1, maxval=15, title='Pivot Lookup')
ShowAvg1 = input(false, title="Show trend line", group="TREND LINE Moving Average", tooltip="Display a trend line based on EMA.")
showLines1 = input.bool(defval=false, title="Draw EMA,WMA Line")
ema200_length= input.int(defval=200, minval=1, maxval=500, title='ema1')
ema300_length= input.int(defval=300, minval=1, maxval=500, title='ema2')
wma60_length= input.int(defval=60, minval=1, maxval=100, title='wma60')
ema5 = ta.ema(close, 5)
ema9 = ta.ema(close, 9)
wma21=ta.wma(close,21)
wma60=ta.wma(close,wma60_length)
len1 = input.int(11, minval=1, maxval=500, title="Length", group="TREND LINE Moving Average", tooltip="Set EMA length.")
ema=ta.ema(close, len1)
rsiLength = input.int(14, title="RSI Length", minval=1, maxval=50, group="Table ADX, RSI, DI values with Red, Green, Yellow Signal")
adxLength = input.int(14, title="ADX Length", minval=1, maxval=50, group="Table ADX, RSI, DI values with Red, Green, Yellow Signal")
adxThreshold = input.int(20, title="ADX Threshold", group="Table ADX, RSI, DI values with Red, Green, Yellow Signal")
diThreshold = input.int(25, title="DI Threshold", group="Table ADX, RSI, DI values with Red, Green, Yellow Signal")
atr = input.int(14, title="ATR values", group="Table ADX, RSI, DI values with Red, Green, Yellow Signal")
////////////////////////////////////////////////

hvbBullColor = color.rgb(181, 37, 225)
hvbBearColor = #ffbb00ad

pvtTopColor = color.new(#154bef, 0)
pvtBottomColor = color.new(#b81657, 0)

//////////////////// Pivots //////////////////// 
hih = ta.pivothigh(high, pivotLookup, pivotLookup)
lol = ta.pivotlow(low , pivotLookup, pivotLookup)
top1 = ta.valuewhen(hih, high[pivotLookup], 0)
bottom1 = ta.valuewhen(lol, low [pivotLookup], 0)
plot(top1, offset=-pivotLookup, linewidth=1, color=(top1 != top1[1] ? na : (plotPVT ? pvtTopColor : na)), title="Pivot Top")
plot(bottom1, offset=-pivotLookup, linewidth=1, color=(bottom1 != bottom1[1] ? na : (plotPVT ? pvtBottomColor : na)), title="Pivot Bottom")

//////////////////////////////////////Functions
isUp(index) =>
    close[index] > open[index]

isDown(index) =>
    close[index] < open[index]

isObUp(index) =>
    isDown(index + 1) and isUp(index) and close[index] > high[index + 1]

isObDown(index) =>
    isUp(index + 1) and isDown(index) and close[index] < low[index + 1]
////////////////// High Volume Bars //////////////////
volEma = ta.ema(volume, hvbEMAPeriod)
isHighVolume = volume > (hvbMultiplier * volEma)
barcolor(plotHVB and isUp(0) and isHighVolume ? hvbBullColor : na, title="Bullish HVB")
barcolor(plotHVB and isDown(0) and isHighVolume ? hvbBearColor : na, title="Bearish HVB")

// Calculate ADX, DI+,  DI-,RSI,ATR
[diplus, diminus, adx] = ta.dmi(adxLength, adxThreshold)
rsi=ta.rsi(close,rsiLength)
atrValue=ta.atr(atr)

// Check for oversold,Overbought condition
oversold_condition = rsi < 20
overbought_condition = rsi > 80

// Plot Trend Line
trendColor = ema5 > ema9 ? color.rgb(22, 203, 28) : ema5 < ema9 ? color.rgb(224, 15, 15) : na
plot(ShowAvg1? ema:na, color=trendColor, linewidth=6, title="Trend Line Upper Ribbon")

/////////////////////////plot ema,wma
plot(showLines1 ? ta.ema(close, ema200_length) : na, color=color.rgb(102, 110, 103), style=plot.style_line, title="ema1",linewidth = 4)
plot(showLines1 ? ta.ema(close, ema300_length) : na, color=color.rgb(18, 20, 18), style=plot.style_line, title="ema2",linewidth = 4)
plot(showLines1 ? ta.wma(close, wma60_length) : na, color=color.rgb(238, 75, 211), style=plot.style_line, title="wma60",linewidth = 3)

// Plot signals with smaller text
plotshape(oversold_condition ? 1 : na, title="RSI Oversold Signal", color=color.rgb(238, 8, 8), style=shape.labelup, location=location.belowbar, text="RSI OS", textcolor=color.rgb(17, 17, 17), size=size.tiny)
plotshape(overbought_condition ? 1 : na, title="RSI Overbought Signal", color=#08f710, style=shape.labeldown, location=location.abovebar, text="RSI OB", textcolor=color.rgb(8, 8, 8), size=size.tiny)
///////////////////////////////////////////////////////////////////////////////////////////////

// Define input options
showTable = input(false, title="Show Table ADX, RSI, DI values with RED, GREEN and YELLOW Signal")
tablePosition = input.string("Top Right", title="Table Position", options=["Top Right", "Top Left", "Top Center", "Bottom Right", "Bottom Left", "Bottom Center"])

// Define colors for the table cells
colorRsi = rsi > 55 ? color.green : rsi < 45 ? color.red : color.yellow
colorDiPlus = diplus > diThreshold ? color.green : color.red
colorDiMinus = diminus > diThreshold ? color.red : color.green
colorAdx = (rsi < 45 and diplus < diThreshold and diminus > diThreshold and adx > adxThreshold) ? color.red : 
           (rsi > 55 and diplus > diThreshold and diminus < diThreshold and adx > adxThreshold) ? color.green : 
           color.yellow

// Create the table
var table testTable = na
if showTable
    var position = tablePosition == "Top Right" ? position.top_right :
                   tablePosition == "Top Left" ? position.top_left :
                   tablePosition == "Top Center" ? position.top_center :
                   tablePosition == "Bottom Right" ? position.bottom_right :
                   tablePosition == "Bottom Left" ? position.bottom_left :
                   position.bottom_center

    testTable := table.new(position, columns = 4, rows = 2, border_width = 1, border_color = color.black, frame_width = 1, frame_color = color.black)

    // Column Headings
    table.cell(table_id = testTable, column = 0, row = 0, text = " DI+ ", bgcolor=color.aqua, text_color = color.white)
    table.cell(table_id = testTable, column = 1, row = 0, text = " DI- ", bgcolor=color.aqua, text_color = color.white)
    table.cell(table_id = testTable, column = 2, row = 0, text = " ADX ", bgcolor=color.aqua, text_color = color.white)
    table.cell(table_id = testTable, column = 3, row = 0, text = " RSI ", bgcolor=color.aqua, text_color = color.white)

    // Column values
    table.cell(table_id = testTable, column = 0, row = 1, text = str.tostring(math.round(diplus, 0)), bgcolor=colorDiPlus, text_color = color.black)
    table.cell(table_id = testTable, column = 1, row = 1, text = str.tostring(math.round(diminus, 0)), bgcolor=colorDiMinus, text_color = color.black)
    table.cell(table_id = testTable, column = 2, row = 1, text = str.tostring(math.round(adx, 0)), bgcolor=colorAdx, text_color = color.black)
    table.cell(table_id = testTable, column = 3, row = 1, text = str.tostring(math.round(rsi, 0)), bgcolor=colorRsi, text_color = color.black)


// Initialize variables to keep track of the previous condition
var bool prev_oversold = na
var bool prev_overbought = na

plotshape(ta.crossover(ema,wma60) and isHighVolume,  style=shape.labelup, location=location.belowbar, color=#1adaf3,size=size.small)
plotshape(ta.crossunder(ema,wma60) and isHighVolume,  style=shape.labeldown, location=location.abovebar, color=#f30aa9, size=size.small)
//////////////////////////////////////////////////   
plotFibRetracement = input.bool(title="Plot Fibonacci Retracement", defval=false)
fibLevel1 = input.float(title="Fibonacci Level", defval=0.5, minval=0, maxval=1, step=0.01)
fibLevel2 = input.float(title="Fibonacci Level", defval=0.618, minval=0, maxval=1, step=0.01)
fibLevel3 = input.float(title="Fibonacci Level", defval=0.368, minval=0, maxval=1, step=0.01) 
// Calculate Fibonacci Levels
highPrice = ta.highest(high, 100)
lowPrice = ta.lowest(low, 100)
priceRange = highPrice - lowPrice
fibonacciLevel1 = lowPrice + priceRange * fibLevel1
fibonacciLevel2 = lowPrice + priceRange * fibLevel2
fibonacciLevel3 = lowPrice + priceRange * fibLevel3

// Plot Fibonacci Levels
if plotFibRetracement
    line.new(x1=bar_index[1], y1=fibonacciLevel1, x2=bar_index, y2=fibonacciLevel1, color=color.blue, width=2)
    line.new(x1=bar_index[1], y1=fibonacciLevel2, x2=bar_index, y2=fibonacciLevel2, color=color.blue, width=2)
    line.new(x1=bar_index[1], y1=fibonacciLevel3, x2=bar_index, y2=fibonacciLevel3, color=color.blue, width=2)
// Draw Trendline
var float trendlineY1 = na
var float trendlineY2 = na

if bar_index % 50 == 0
    trendlineY1 := low
    trendlineY2 := high

// line.new(x1=bar_index, y1=trendlineY1, x2=bar_index - 100, y2=trendlineY2, color=#3708a5, width=2)

////////////////////////////////////////////////entry, exit, profit booking, stoploss///////////////////////
if (rsi > 63 and adx> adxThreshold and diplus>diThreshold)
    strategy.entry("Buy", strategy.long, qty = 1)

if (rsi < 40 and adx> adxThreshold and diminus>diThreshold)
    strategy.entry("Sell", strategy.short, qty = 1)

// Set stop loss and take profit levels
stop_loss = input(1.5, title = "Stop Loss (%)") * atrValue
take_profit = input(4.0, title = "Take Profit (%)") * atrValue
strategy.exit("Take Profit/Stop Loss", from_entry = "Buy", stop = close - stop_loss, limit = close + take_profit)
strategy.exit("Take Profit/Stop Loss", from_entry = "Sell", stop = close + stop_loss, limit = close - take_profit)
////////////////////////

더 많은