ADX Strategi Pengesanan Trend Pintar

Penulis:ChaoZhang, Tarikh: 2023-11-28 14:04:00
Tag:

img

Ringkasan

ADX Intelligent Trend Tracking Strategy menggunakan Indeks Arah Purata (ADX) untuk menilai kekuatan trend dan menangkap trend apabila mereka lemah dan mengikuti trend yang kuat untuk keuntungan.

Prinsip Strategi

Inti strategi ini terutamanya berdasarkan Indeks Arah Purata (ADX) untuk menilai kekuatan trend semasa. ADX mengira nilai purata Indikator Arah fluktuasi harga dalam tempoh tertentu untuk mewakili kekuatan trend. Apabila nilai ADX di bawah ambang yang ditetapkan, kami percaya pasaran sedang mengumpul. Pada masa ini, julat kotak ditentukan. Jika harga memecahkan rel atas dan bawah kotak, isyarat perdagangan dihasilkan.

Secara khusus, strategi ini mula-mula mengira nilai ADX 14 kitaran. Apabila ia lebih rendah daripada 18, ia dianggap bahawa trend itu lebih lemah. Kemudian ia mengira julat kotak yang dibentuk oleh harga tertinggi dan terendah dari 20 K-garis yang lalu. Apabila harga memecahkan kotak ini, isyarat beli dan jual dihasilkan. Jarak stop loss adalah 50% daripada saiz kotak, dan jarak mengambil keuntungan adalah 100% daripada saiz kotak.

Strategi ini menggabungkan penilaian kekuatan trend dan isyarat terobosan untuk menangkap trend apabila mereka lebih lemah dan memasuki penyatuan, mengelakkan perdagangan yang kerap di pasaran yang tidak teratur.

Kelebihan Strategi

  1. Menggabungkan penilaian kekuatan trend boleh mengelakkan perdagangan yang kerap di pasaran yang tidak teratur.
  2. Penembusan kotak meningkatkan penapisan untuk mengelakkan terperangkap dalam pasaran yang tidak menentu.
  3. Dalam pasaran trend, sasaran keuntungan yang lebih tinggi boleh diperoleh.
  4. Parameter ADX yang boleh disesuaikan, parameter kotak, pekali stop loss, dan lain-lain untuk menyesuaikan diri dengan pelbagai jenis.

Risiko Strategi

  1. Tetapan parameter ADX yang tidak betul boleh terlepas trend atau membuat pertimbangan yang salah.
  2. Julat kotak yang terlalu besar atau kecil boleh mempengaruhi hasil.
  3. Kadar stop loss dan mengambil keuntungan yang tidak sesuai boleh menyebabkan stop loss yang tidak mencukupi atau mengambil keuntungan yang terlalu awal.

Parameter seperti ADX, julat kotak, pekali stop loss boleh dioptimumkan untuk menjadikannya lebih sesuai untuk produk dan persekitaran pasaran yang berbeza.

Arahan untuk Pengoptimuman Strategi

  1. Parameter ADX boleh menguji hasil kitaran yang berbeza.
  2. Parameter kotak boleh menguji panjang yang berbeza untuk menentukan saiz julat yang optimum.
  3. Sempurnakan stop loss dan mengambil pekali keuntungan untuk mengoptimumkan nisbah risiko-balasan.
  4. Uji kesan perdagangan panjang/pendek secara sepihak sahaja.
  5. Tambah penunjuk lain untuk combo, seperti penunjuk jumlah.

Ringkasan

ADX Intelligent Trend Tracking Strategy umumnya merupakan strategi pengesanan trend yang agak stabil. Ia menggabungkan penilaian kekuatan trend dan isyarat kejayaan harga untuk mengelakkan isu-isu seperti mengejar tinggi dan membunuh rendah yang biasa berlaku dalam strategi trend berikut. Melalui pengoptimuman parameter dan pengurusan wang yang ketat, strategi dapat memperoleh keuntungan dengan mantap.


/*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)

Lebih lanjut