Strategi Dagangan Pinbar Dasar

Penulis:ChaoZhang, Tarikh: 2023-11-15 15:25:57
Tag:

img

Ringkasan

Strategi ini menggunakan corak pinbar dengan penentuan trend dengan menggerakkan purata untuk perdagangan pecah ke arah trend. Ia menghasilkan isyarat perdagangan apabila harga pecah dari tinggi / rendah yang dibentuk oleh lilin pinbar. Di samping itu, ia menggunakan purata bergerak cepat dan perlahan untuk menentukan arah trend keseluruhan, mengelakkan isyarat yang salah semasa tindakan harga yang terikat julat.

Logika Strategi

  1. Mengira purata bergerak pantas (20-period) dan perlahan (50-period).

  2. Mengenali pinbar bullish (close>open) dan bearish (close

  3. Periksa sama ada pinbar tinggi/rendah memecahkan tinggi/rendah lilin sebelumnya. Pinbar bullish memecahkan tinggi sebelumnya memberi isyarat panjang. Pinbar bearish memecahkan rendah sebelumnya memberikan isyarat pendek.

  4. Juga periksa sama ada MA pantas di atas MA perlahan untuk menentukan aliran menaik, dan sebaliknya untuk aliran menurun.

  5. Isyarat panjang hanya sah apabila MA cepat / perlahan menunjukkan trend menaik. Isyarat pendek hanya sah apabila MA cepat / perlahan menunjukkan trend menurun. Ini mengelakkan isyarat yang salah semasa tindakan harga terikat julat.

  6. Pada isyarat panjang yang sah, pergi panjang dengan stoploss dan takeprofit yang telah ditentukan. pada isyarat pendek yang sah, pergi pendek dengan stoploss dan takeprofit yang telah ditentukan.

  7. Jika MA pantas melintasi di bawah MA perlahan, tutup sebarang kedudukan sedia ada.

Kelebihan

  • Menggunakan pinbar tinggi / rendah sebagai tahap pecah mewakili momentum yang kuat.

  • Mempertimbangkan arah trend untuk mengelakkan isyarat yang salah semasa tindakan harga terikat julat, meningkatkan ketepatan.

  • Mencatatkan trend dan breakout, berprestasi baik di pasaran trend.

  • Parameter boleh dioptimumkan untuk produk dan jangka masa yang berbeza.

Risiko dan Pengurangan

  • Risiko kegagalan, boleh dikurangkan dengan menggunakan tahap yang lebih luas dan momentum yang lebih kuat.

  • Risiko pengenalan trend yang tidak tepat. Boleh dikurangkan dengan mengubah parameter MA atau menambah penunjuk trend lain.

  • boleh menyesuaikan secara dinamik stoploss berdasarkan produk dan jangka masa.

  • Dapat menetapkan sasaran keuntungan dan nisbah risiko-balasan secara dinamik.

Peluang Peningkatan

  • Secara keseluruhan, parameter MA, pecah, stoploss dan mengambil keuntungan boleh dioptimumkan di seluruh produk dan jangka masa untuk strategi yang disesuaikan.

  • MAs yang berbeza seperti EMA, SMA dan lain-lain boleh diuji untuk mencari penunjuk yang optimum.

  • Penunjuk tambahan seperti Momentum boleh meningkatkan ketepatan trend.

  • Parameter boleh dioptimumkan secara dinamik menggunakan teknik pembelajaran mesin.

  • Kadar kejayaan breakout boleh ditingkatkan melalui pembelajaran statistik.

Ringkasan

Strategi ini menggabungkan trend dan momentum untuk isyarat yang disaring secara teori. Kuncinya adalah pengoptimuman parameter yang kukuh di seluruh produk dan jangka masa untuk prestasi yang baik. Di samping itu, penunjuk tambahan dan teknik pembelajaran mesin dapat meningkatkan lagi strategi. Dengan peningkatan berterusan, ini boleh menjadi sistem perdagangan trend-breakout yang mantap.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Backtested Time Frame: H1
//Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting.
//Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK.
//Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties.
strategy("Pin Bar Strategy v1", overlay=true)

// User Input
usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false)
atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=1.9,confirm=false)
trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false)
sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false)
sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false)
atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false)
use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false)
slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false)
slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false)
emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,confirm=false)
ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false)

// Create Indicators
fastSMA = sma(close, sma_fast)
slowSMA = sma(close, sma_slow)
bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low)))
bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low)))
atr = atr(atr_valu)

// Specify Trend Conditions
smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4])
smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4])
candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10])
candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10])

// Specify Piercing Conditions
bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA))
bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA))

// MA Slope Function
angle(_source) =>
    rad2degree=180/3.14159265359
    ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu)) 

// Calculate MA Slope
fastSlope=angle(fastSMA)
slowSlope=angle(slowSMA)
slopingUp = fastSlope > slp_long
slopingDn = fastSlope < slp_shrt
    
// Specify Entry Conditions
longEntry = smaUpTrend and bullishPinBar and bullPierce
shortEntry = smaDnTrend and bearishPinBar and bearPierce
longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp
shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn

// Specify Secondary Exit Conditions
longExit = crossunder(fastSMA, slowSMA)
shortExit = crossover(fastSMA, slowSMA)

// Long Entry Function
enterlong() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = low[1] - atr[1] * atr_mult
    entryPrice = high[1]
    units = risk / (entryPrice - stopLoss)
    takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss)
    strategy.entry("long", strategy.long, units, stop=entryPrice)
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
// Short Entry Function
entershort() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = high[1] + atr[1] * atr_mult
    entryPrice = low[1]
    units = risk / (stopLoss - entryPrice)
    takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice)
    strategy.entry("short", strategy.short, units, stop=entryPrice)
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
// Execute Long Entry w/o Slope
if (longEntry and use_slpe == false)
    enterlong()
    
// Execute Long Entry w/ Slope
if (longEntryWithSlope and use_slpe == true)
    enterlong()

// Exit Long Due to Re-Cross
if(longExit and strategy.position_size > 0 and emg_exit)    
    strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size))

// Cancel the Long Entry
strategy.cancel("long", barssince(longEntry) > ent_canc)

// Execute Short Entry w/o Slope
if (shortEntry and use_slpe == false)
    entershort() 
    
// Execute Short Entry w/ Slope
if (shortEntryWithSlope and use_slpe == true)
    entershort() 

// Exit Short Due to Re-Cross
if(shortExit and strategy.position_size < 0 and emg_exit)    
    strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size))

// Cancel the Short Entry
strategy.cancel("short", barssince(shortEntry) > ent_canc)

// Plot Moving Averages to Chart
plot(fastSMA, color=color.red)
plot(slowSMA, color=color.blue)

// Plot Pin Bars to Chart
plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='')
plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')

Lebih lanjut