Hammer dan Menembak Bintang Pattern Strategi Dagangan

Penulis:ChaoZhang, Tarikh: 2023-09-28 11:11:35
Tag:

Ringkasan

Strategi perdagangan ini menggunakan corak candlestick untuk meramalkan pergerakan harga masa depan. Hammer dan bintang jatuh adalah corak yang mudah namun kuat yang digunakan secara meluas untuk menangkap pembalikan trend. Strategi ini mengenal pasti kedua-dua corak ini untuk memanfaatkan titik perubahan di pasaran.

Logika Strategi

Strategi ini berdasarkan prinsip-prinsip teras berikut:

  1. Indikator ATR menapis pasaran bukan trend dengan memerlukan saiz lilin berada dalam julat nilai ATR yang ditetapkan.

  2. Tahap retracement Fibonacci 33.3% menandakan titik yang membezakan palu (tutup di atas) dari bintang jatuh (tutup di bawah).

  3. Pengesahan tambahan memerlukan corak untuk melengkapkan (harga penutupan di atas / di bawah terbuka) pada bar yang tidak disahkan.

  4. Tahap Stop Loss dan Take Profit ditetapkan berdasarkan ATR dan nisbah risiko / ganjaran semasa masuk.

Dengan menggabungkan ATR, Fibonacci, dan pengenalan corak, strategi ini mematuhi prinsip-prinsip perdagangan trend yang biasa.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Logik yang mudah menjadikannya mudah difahami dan dilaksanakan.

  2. Perdagangan daripada corak intraday jangka pendek membolehkan tempoh penahan yang fleksibel.

  3. Penapis ATR membantu mengawal risiko di pasaran yang tidak menentu. Parameter boleh dioptimumkan secara berasingan untuk setiap instrumen.

  4. Stop loss pintar dan mengambil mata keuntungan berdasarkan nisbah risiko / ganjaran mengawal risiko dengan berkesan.

  5. Isyarat perdagangan automatik menyederhanakan kemasukan dan pengurusan kedudukan.

  6. Pasaran rentas yang boleh digunakan untuk banyak pasangan mata wang menunjukkan ketahanan.

Analisis Risiko

Terdapat juga beberapa risiko yang perlu dipertimbangkan:

  1. Perdagangan corak mempunyai kebarangkalian isyarat palsu yang tidak boleh dipercayai secara buta.

  2. Kos dagangan seperti komisen tidak diperhitungkan, memakan keuntungan sebenar.

  3. Peningkatan kekerapan dagangan daripada dagangan intraday jangka pendek mungkin menimbulkan lebih banyak kos slippage.

  4. Parameter ATR yang dioptimumkan bergantung pada data sejarah dan mungkin tidak selalu berlaku.

  5. Risiko perdagangan automatik gagal pelaksanaan pesanan dan harus melaksanakan mekanisme percubaan semula.

  6. Tetapan stop loss dan mengambil keuntungan yang buruk boleh menyebabkan terlalu banyak perdagangan atau meninggalkan wang di atas meja.

Peluang Pengoptimuman

Beberapa cara untuk meningkatkan strategi:

  1. Penapis tambahan seperti jumlah untuk meningkatkan keberkesanan corak.

  2. Masukkan komisen dalam penyesuaian berhenti dan sasaran.

  3. Mengoptimumkan parameter ATR secara dinamik untuk menyesuaikan diri dengan keadaan pasaran yang berubah.

  4. Menilai prestasi parameter secara individu untuk setiap pasangan mata wang.

  5. Tambah mekanisme auto-retry untuk mengurangkan risiko pelaksanaan pesanan yang gagal.

  6. Menggunakan model pembelajaran mesin untuk mengenal pasti corak yang sah.

  7. Memperkenalkan mekanisme berhenti untuk mengunci lebih banyak keuntungan.

Kesimpulan

Ringkasnya, strategi perdagangan ini mengintegrasikan penunjuk teknikal yang biasa digunakan dengan logik mudah untuk pelaksanaan yang mudah. Dengan pengoptimuman parameter yang kukuh dan kawalan risiko, ia berpotensi untuk keuntungan yang konsisten. Walau bagaimanapun, peniaga harus tetap waspada terhadap risiko dan menjaga kekerapan perdagangan yang munasabah untuk mengelakkan perdagangan berlebihan. Strategi ini berfungsi sebagai rangka kerja asas untuk inovasi lanjut untuk mencapai tahap prestasi perdagangan yang baru.


/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
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/
// © ZenAndTheArtOfTrading / PineScriptMastery
// Last Updated: 28th April, 2021
// @version=4
strategy("Hammers & Stars Strategy [v1.0]", shorttitle="HSS[v1.0]", overlay=true)

// Get user input
atrMinFilterSize = input(title=">= ATR Filter", type=input.float, defval=0.0, minval=0.0, tooltip="Minimum size of entry candle compared to ATR", group="Strategy Settings")
atrMaxFilterSize = input(title="<= ATR Filter", type=input.float, defval=3.0, minval=0.0, tooltip="Maximum size of entry candle compared to ATR", group="Strategy Settings")
stopMultiplier   = input(title="Stop Loss ATR", type=input.float, defval=1.0, tooltip="Stop loss multiplier (x ATR)", group="Strategy Settings")
rr               = input(title="R:R", type=input.float, defval=1.0, tooltip="Risk:Reward profile", group="Strategy Settings")
fibLevel         = input(title="Fib Level", type=input.float, defval=0.333, tooltip="Used to calculate upper/lower third of candle. (For example, setting it to 0.5 will mean hammers must close >= 50% mark of the total candle size)", group="Strategy Settings")
i_startTime      = input(title="Start Date Filter", defval=timestamp("01 Jan 2000 13:30 +0000"), type=input.time, tooltip="Date & time to begin trading from", group="Strategy Settings")
i_endTime        = input(title="End Date Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), type=input.time, tooltip="Date & time to stop trading", group="Strategy Settings")
oandaDemo        = input(title="Use Oanda Demo?", type=input.bool, defval=false, tooltip="If turned on then oandapractice broker prefix will be used for AutoView alerts (demo account). If turned off then live account will be used", group="AutoView Oanda Settings")
limitOrder       = input(title="Use Limit Order?", type=input.bool, defval=true, tooltip="If turned on then AutoView will use limit orders. If turned off then market orders will be used", group="AutoView Oanda Settings")
gtdOrder         = input(title="Days To Leave Limit Order", type=input.integer, minval=0, defval=2, tooltip="This is your GTD setting (good til day)", group="AutoView Oanda Settings")
accountBalance   = input(title="Account Balance", type=input.float, defval=1000.0, step=100, tooltip="Your account balance (used for calculating position size)", group="AutoView Oanda Settings")
accountCurrency  = input(title="Account Currency", type=input.string, defval="USD", options=["AUD", "CAD", "CHF", "EUR", "GBP", "JPY", "NZD", "USD"], tooltip="Your account balance currency (used for calculating position size)", group="AutoView Oanda Settings")
riskPerTrade     = input(title="Risk Per Trade %", type=input.float, defval=2.0, step=0.5, tooltip="Your risk per trade as a % of your account balance", group="AutoView Oanda Settings")

// Set up AutoView broker prefix
var broker = oandaDemo ? "oandapractice" : "oanda"

// See if this bar's time happened within date filter
dateFilter = true

// Get ATR
atr = atr(14)

// Check ATR filter
atrMinFilter = abs(high - low) >= (atrMinFilterSize * atr) or atrMinFilterSize == 0.0
atrMaxFilter = abs(high - low) <= (atrMaxFilterSize * atr) or atrMaxFilterSize == 0.0
atrFilter = atrMinFilter and atrMaxFilter

// Calculate 33.3% fibonacci level for current candle
bullFib = (low - high) * fibLevel + high
bearFib = (high - low) * fibLevel + low

// Determine which price source closes or opens highest/lowest
lowestBody = close < open ? close : open
highestBody = close > open ? close : open

// Determine if we have a valid setup
validHammer = lowestBody >= bullFib and atrFilter and close != open and not na(atr)
validStar = highestBody <= bearFib and atrFilter and close != open and not na(atr)

// Check if we have confirmation for our setup
validLong = validHammer and strategy.position_size == 0 and dateFilter and barstate.isconfirmed
validShort = validStar and strategy.position_size == 0 and dateFilter and barstate.isconfirmed

//------------- DETERMINE POSITION SIZE -------------//
// Get account inputs
var tradePositionSize = 0.0
var pair = syminfo.basecurrency + "/" + syminfo.currency

// Check if our account currency is the same as the base or quote currency (for risk $ conversion purposes)
accountSameAsCounterCurrency = accountCurrency == syminfo.currency
accountSameAsBaseCurrency = accountCurrency == syminfo.basecurrency

// Check if our account currency is neither the base or quote currency (for risk $ conversion purposes)
accountNeitherCurrency = not accountSameAsCounterCurrency and not accountSameAsBaseCurrency

// Get currency conversion rates if applicable
conversionCurrencyPair = accountSameAsCounterCurrency ? syminfo.tickerid : accountNeitherCurrency ? accountCurrency + syminfo.currency : accountCurrency + syminfo.currency
conversionCurrencyRate = security(symbol=syminfo.type == "forex" ? "BTC_USDT:swap" : "BTC_USDT:swap", resolution="D", expression=close)

// Calculate position size
getPositionSize(stopLossSizePoints) =>
    riskAmount = (accountBalance * (riskPerTrade / 100)) * (accountSameAsBaseCurrency or accountNeitherCurrency ? conversionCurrencyRate : 1.0)
    riskPerPoint = (stopLossSizePoints * syminfo.pointvalue)
    positionSize = (riskAmount / riskPerPoint) / syminfo.mintick
    round(positionSize)
    
// Custom function to convert pips into whole numbers
toWhole(number) =>
    return = atr(14) < 1.0 ? (number / syminfo.mintick) / (10 / syminfo.pointvalue) : number
    return := atr(14) >= 1.0 and atr(14) < 100.0 and syminfo.currency == "JPY" ? return * 100 : return
//------------- END POSITION SIZE CODE -------------//

// Calculate our stop distance & size for the current bar
stopSize = atr * stopMultiplier
longStopPrice = low < low[1] ? low - stopSize : low[1] - stopSize
longStopDistance = close - longStopPrice
longTargetPrice = close + (longStopDistance * rr)
shortStopPrice = high > high[1] ? high + stopSize : high[1] + stopSize
shortStopDistance = shortStopPrice - close
shortTargetPrice = close - (shortStopDistance * rr)

// Save trade stop & target & position size if a valid setup is detected
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0

// Set up our GTD (good-til-day) order info
gtdTime = time + (gtdOrder * 1440 * 60 * 1000) // 86,400,000ms per day
gtdYear = year(gtdTime)
gtdMonth = month(gtdTime)
gtdDay = dayofmonth(gtdTime)
gtdString = " dt=" + tostring(gtdYear) + "-" + tostring(gtdMonth) + "-" + tostring(gtdDay)

// Detect valid long setups & trigger alert
if validLong
    tradeStopPrice := longStopPrice
    tradeTargetPrice := longTargetPrice
    tradePositionSize := getPositionSize(toWhole(longStopDistance) * 10)
    // Trigger AutoView long alert
    alert(message="e=" + broker + " b=long q="
     + tostring(tradePositionSize) 
     + " s=" + pair
     + " t=" + (limitOrder ? "limit fp=" + tostring(close) : "market")
     + " fsl=" + tostring(tradeStopPrice)
     + " ftp=" + tostring(tradeTargetPrice)
     + (gtdOrder != 0 and limitOrder ? gtdString : ""), 
     freq=alert.freq_once_per_bar_close)
   
// Detect valid short setups & trigger alert
if validShort
    tradeStopPrice := shortStopPrice
    tradeTargetPrice := shortTargetPrice
    tradePositionSize := getPositionSize(toWhole(shortStopDistance) * 10)
    // Trigger AutoView short alert
    alert(message="e=" + broker + " b=short q="
     + tostring(tradePositionSize)
     + " s=" + pair
     + " t=" + (limitOrder ? "limit fp=" + tostring(close) : "market")
     + " fsl=" + tostring(tradeStopPrice)
     + " ftp=" + tostring(tradeTargetPrice)
     + (gtdOrder != 0 and limitOrder ? gtdString : ""),
     freq=alert.freq_once_per_bar_close)

// Enter trades whenever a valid setup is detected
strategy.entry(id="Long", long=strategy.long, when=validLong)
strategy.entry(id="Short", long=strategy.short, when=validShort)

// Exit trades whenever our stop or target is hit
strategy.exit(id="Long Exit", from_entry="Long", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0)
strategy.exit(id="Short Exit", from_entry="Short", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size < 0)

// Draw trade data
plot(strategy.position_size != 0 or validLong or validShort ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0 or validLong or validShort ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0 or validLong or validShort ? tradePositionSize : na, color=color.purple, transp=100, title="AutoView Position Size")

// Draw price action setup arrows
plotshape(validLong ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(validShort ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")

Lebih lanjut