
Strategi pengesanan trend pintar ADX menggunakan indeks trend purata ((ADX) untuk menilai kekuatan trend, menangkap trend ketika trend lemah, dan menjejaki keuntungan dalam trend yang kuat. Strategi ini menilai kekuatan trend sambil menggabungkan terobosan harga untuk menghasilkan isyarat perdagangan, merupakan salah satu strategi pengesanan trend.
Strategi ini adalah berdasarkan purata trend indeks ((ADX) untuk menilai kekuatan trend semasa. ADX menunjukkan kekuatan trend dengan mengira purata nilai DIRECTIONAL INDICATOR yang turun naik dalam harga dalam tempoh tertentu. Apabila nilai ADX berada di bawah paras paras paras yang ditetapkan, kita menganggap bahawa keadaan sedang disusun, dan ketika ini melakukan penghakiman jangkauan kotak, jika harga menembusi kotak kotak dan turun, menghasilkan isyarat perdagangan.
Khususnya, strategi pertama mengira nilai ADX 14 kitaran, di bawah 18 dianggap trend lemah. Kemudian mengira jarak kotak yang terbentuk oleh harga tertinggi dan terendah pada 20 garis K yang lalu. Apabila harga menembusi kotak itu, menghasilkan isyarat beli dan jual. Jarak berhenti adalah 50% dari saiz kotak, jarak berhenti adalah 100% dari saiz kotak.
Strategi ini menggabungkan penghakiman kekuatan trend dan isyarat penembusan, yang dapat ditangkap ketika trend lemah dan masuk ke dalam penyusunan, untuk mengelakkan perdagangan yang kerap dalam keadaan yang tidak teratur. Apabila terdapat trend yang kuat, jangkauan berhenti lebih besar dan dapat memperoleh lebih banyak keuntungan.
Ia boleh dioptimumkan dengan menyesuaikan parameter ADX, parameter kotak, faktor stop loss, dan sebagainya, untuk menjadikannya lebih sesuai untuk pelbagai jenis dan keadaan pasaran. Pengurusan wang yang ketat juga penting, mengawal peratusan stop loss tunggal, untuk mengelakkan kerugian besar tunggal.
Strategi trend pemantauan ADX pintar adalah strategi trend yang lebih stabil secara keseluruhan. Ia menggabungkan penilaian kekuatan trend dan isyarat harga yang pecah, dan ke tahap tertentu mengelakkan masalah mengejar kenaikan dan penurunan dalam strategi trend pemantauan yang biasa.
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Developer: Andrew Palladino.
//Creator: Rob Booker.
//Date: 9/29/2017
//@version=5
//Date: 08/10/2022
//Updated to V5 from V1, default cash settings added and indicators made more easily visible by:
// @ Powerscooter
strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000)
adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings")
adxPeriod = input(14, title="ADX Period", group = "ADX Settings")
adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings")
boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox")
profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss")
stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss")
enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction")
// When the ADX drops below threshold limit, then we consider the pair in consolidation.
// Set Box around highs and lows of the last 20 candles. with upper and lower boundaries.
// When price breaks outside of box, a trade is taken. (on close or on touch?)
// Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips.
// Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3.
dirmov(len) =>
up = ta.change(high)
down = -ta.change(low)
truerange = ta.rma(ta.tr, len)
plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
adxHigh(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
plus
adxLow(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
minus
sig = adx(adxSmoothPeriod, adxPeriod)
//sigHigh = adxHigh(dilen, adxlen)
//sigLow = adxLow(dilen, adxlen)
isADXLow = sig < adxLowerLevel
//boxUpperLevel = ta.highest(high, boxLookBack)[1]
//boxLowerLevel = ta.lowest(low, boxLookBack)[1]
var float boxUpperLevelCarry = 0
var float boxLowerLevelCarry = 0
boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry
boxUpperLevelCarry := boxUpperLevel
boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry
boxLowerLevelCarry := boxLowerLevel
boxWidth = boxUpperLevel - boxLowerLevel
profitTarget = strategy.position_size > 0 ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price - profitTargetMultiple*boxWidth : na
stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na
plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr)
plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr)
bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit")
plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine")
plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine")
isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow
//Long Entry Condition
strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss)
if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0)
strategy.entry("open_long", strategy.long)
isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow
//Short Entry condition
strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss)
if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0)
strategy.entry("open_short", strategy.short)