Strategi ramalan morfologi


Tarikh penciptaan: 2023-09-28 11:11:35 Akhirnya diubah suai: 2023-09-28 11:11:35
Salin: 0 Bilangan klik: 785
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ramalan corak menggunakan corak corak corak untuk menentukan pergerakan harga masa depan, digunakan secara meluas dalam dunia perdagangan. Strategi ini menangkap peluang untuk membalikkan trend dengan mengenal pasti dua corak mudah, garis kurung dan bintang menembak.

Prinsip Strategi

Strategi ini berdasarkan kepada prinsip-prinsip berikut:

  1. Menggunakan indikator ATR untuk mengenal pasti trend yang kuat dan lemah, untuk menyaring pasaran yang bergolak. Perdagangan hanya dipertimbangkan apabila nilai ATR kurang dari nilai set minimum atau lebih besar daripada nilai set maksimum.

  2. Hitung 33.3% Fibonacci Retracement Line dari garis K semasa. Jika harga penutupan lebih tinggi daripada garis ini dianggap sebagai garis kelinci, jika harga penutupan di bawah garis ini dianggap sebagai bintang menembak.

  3. Pengesahan tambahan untuk bentuk yang dikenal pasti, meminta bentuk selesai ((bahagian entiti lebih tinggi atau lebih rendah daripada harga bukaan), dan untuk K-garis yang tidak diiktiraf.

  4. Tetapkan stop loss dan stop loss selepas masuk, stop loss adalah kelipatan tertentu ATR, dan stop loss adalah kelipatan pulangan risiko dari stop loss.

Strategi ini menggunakan indikator ATR dan teknik Fibonacci untuk mengenal pasti garis kurung dan bentuk bintang menembak, sambil menetapkan indikator kawalan risiko, sesuai dengan prinsip umum perdagangan trend.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Ia adalah asas yang jelas dan mudah difahami.

  2. Mengambil kesempatan daripada bentuk jangka pendek dalam sehari, tidak perlu menunggu lama untuk memegang kedudukan, fleksibiliti yang kuat.

  3. Tetapan parameter ATR mengawal risiko terlalu besar. Parameter boleh dioptimumkan untuk pelbagai jenis.

  4. Risiko boleh dikawal dengan menetapkan titik hentian dan kerugian yang munasabah, bersama dengan nisbah ganjaran risiko.

  5. Isyarat perdagangan automatik disambungkan secara langsung ke kedudukan terhad, mudah untuk dikendalikan.

  6. Ia boleh digunakan untuk pelbagai jenis dan mempunyai kepelbagaian.

Analisis risiko

Strategi ini mempunyai beberapa risiko:

  1. Terdapat beberapa kesilapan dalam transaksi bentuk dan ia tidak boleh diandalkan sepenuhnya.

  2. Tidak mengambil kira yuran urus niaga, ruang untuk keuntungan sebenarnya lebih kecil.

  3. Dagangan dalam talian pendek boleh meningkatkan frekuensi dagangan dan kos slip.

  4. Pengoptimuman parameter ATR bergantung pada data sejarah, dan tidak boleh menjamin parameter berlaku selamanya.

  5. Pesanan automatik ada risiko kegagalan penghantaran, mekanisme percubaan semula harus disediakan.

  6. Tetapan stop loss yang tidak betul boleh menyebabkan terlalu banyak atau terlalu sedikit penebusan.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa arah:

  1. Menambah syarat penapisan lain, seperti jumlah urus niaga, untuk meningkatkan kecekapan bentuk.

  2. Pertimbangkan tetapan yuran dan optimumkan titik hentian.

  3. Dinamika mengoptimumkan parameter ATR agar sesuai dengan kitaran keadaan yang berbeza.

  4. Menilai parameter untuk setiap pasangan perdagangan dan menetapkan parameter peribadi.

  5. Meningkatkan mekanisme ujian semula automatik dan mengurangkan risiko tunggal.

  6. Menggunakan pembelajaran mesin untuk meningkatkan ketepatan pengenalan bentuk.

  7. Tambah pelacakan hentian kerugian untuk mengunci lebih banyak keuntungan.

ringkaskan

Secara keseluruhannya, strategi perdagangan ini menggabungkan petunjuk teknikal yang biasa digunakan, prinsipnya mudah difahami dan dilaksanakan. Di bawah keadaan pengoptimuman parameter dan kawalan risiko, keuntungan yang stabil dijangka. Tetapi pedagang masih perlu berhati-hati terhadap risiko, mengekalkan jumlah perdagangan yang sederhana, dan mengelakkan terlalu radikal.

Kod sumber strategi
/*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")