Strategi perdagangan berdasarkan pecahan histogram


Tarikh penciptaan: 2023-11-15 15:25:57 Akhirnya diubah suai: 2023-11-15 15:25:57
Salin: 0 Bilangan klik: 700
1
fokus pada
1617
Pengikut

Strategi perdagangan berdasarkan pecahan histogram

Gambaran keseluruhan

Strategi ini menggunakan prinsip pecah carta lurus, digabungkan dengan penghakiman trend pada purata bergerak, untuk mewujudkan perdagangan yang pecah di arah trend. Apabila harga memecahkan sempadan carta lurus, ia menghasilkan isyarat perdagangan. Pada masa yang sama, dengan menilai hubungan kedudukan rata-rata bergerak cepat dan perlahan untuk menentukan arah trend keseluruhan, untuk mengelakkan isyarat yang salah dalam keseluruhan set.

Prinsip Strategi

  1. Hitung purata bergerak pantas ((20 kitaran) dan purata bergerak perlahan ((50 kitaran)

  2. Berdasarkan garisan K, kira sama ada ia membentuk segi panjang yang naik (close>open) atau yang jatuh (close>open).

  3. Menentukan sama ada panjang lebar telah menembusi harga tertinggi atau harga terendah garis K terdahulu. Jika panjang lebar yang naik dan menembusi harga tertinggi garis K terdahulu, ia akan menghasilkan isyarat penembusan berbilang; jika panjang lebar yang turun dan menembusi harga terendah garis K terdahulu, ia akan menghasilkan isyarat penembusan kosong.

  4. Pada masa yang sama menilai sama ada purata bergerak cepat berada di atas purata bergerak perlahan, jika ya, ia dinilai sebagai trend multihead; sebaliknya, ia dinilai sebagai trend kosong.

  5. Isyarat pecah multicap hanya berkesan apabila garis rata-rata laju lambat dinilai sebagai trend bertopeng; isyarat pecah bertopeng hanya berkesan apabila garis rata-rata laju lambat dinilai sebagai trend kosong. Ini mengelakkan isyarat yang salah dalam penyusunan.

  6. Apabila menghasilkan isyarat pecah kepala berbilang yang berkesan, bukalah banyak tiket mengikut piawaian berhenti dan berhenti tertentu; apabila menghasilkan isyarat pecah kepala kosong yang berkesan, bukalah tiket kosong mengikut piawaian berhenti dan berhenti tertentu.

  7. Jika rata-rata bergerak cepat dan rata-rata bergerak perlahan bercabang, maka kedudukan semasa akan diimbangi.

Analisis kelebihan

  • Menggunakan sempadan garisan lurus sebagai pintu penembusan, yang mewakili isyarat penembusan yang kuat.

  • Pada masa yang sama, pertimbangkan arah trend untuk mengelakkan isyarat yang salah dalam penyusunan dan meningkatkan ketepatan.

  • Mengambil kira trend dan terobosan, menjadikan strategi berfungsi dengan baik dalam keadaan trend.

  • Dengan pengoptimuman parameter, ia boleh disesuaikan dengan pelbagai jenis dan tempoh masa.

Risiko dan Penyelesaian

  • Risiko kegagalan penembusan. Penyelesaian adalah dengan memilih lubang penembusan yang lebih besar, memastikan tenaga penembusan yang lebih kuat.

  • Risiko penilaian trend yang tidak tepat. Penyelesaian adalah dengan menyesuaikan parameter garis rata-rata, dan juga dengan penambahan petunjuk tambahan untuk menilai trend.

  • Penetapan stop yang terlalu kecil membawa kepada risiko stop yang terlalu kerap. Penyelesaian adalah dengan menyesuaikan amplitud stop mengikut dinamika varieti dan kitaran masa.

  • Risiko yang terlalu kecil untuk menetapkan ruang keuntungan. Penyelesaian adalah dengan menetapkan kadar keuntungan dan kerugian yang berbeza mengikut pelbagai jenis dan dinamik kitaran masa.

Arah pengoptimuman

  • Secara keseluruhannya, parameter moving average, parameter breakout, stop loss, dan breakout ratio perlu diuji dan dioptimumkan mengikut pelbagai jenis dan tempoh masa, menjadikan parameter strategi disesuaikan.

  • Anda boleh menguji pelbagai jenis purata bergerak (seperti EMA, SMA dan lain-lain) untuk mencari rata-rata yang lebih sesuai.

  • Indikator penilaian tambahan seperti Momentum dan lain-lain boleh dimasukkan untuk meningkatkan ketepatan penilaian trend.

  • Parameter boleh dioptimumkan secara dinamik melalui kaedah pembelajaran mesin dan sebagainya.

  • Anda boleh belajar statistik untuk kejayaan penembusan, menyesuaikan parameter penembusan.

ringkaskan

Strategi ini mengintegrasikan ciri-ciri trend dan ciri-ciri terobosan, yang secara teori dapat menyaring banyak isyarat yang tidak berkesan. Kuncinya adalah untuk memberi perhatian kepada pengujian dan pengoptimuman parameter, menjadikan strategi disesuaikan untuk pelbagai jenis dan tempoh masa, sehingga mendapat kesan yang lebih baik dalam perdagangan sebenar.

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