Strategi Penembusan Persentase Bar Positif

Penulis:ChaoZhang, Tarikh: 2024-01-08 10:32:25
Tag:

img

Ringkasan

Strategi Penembusan Peratusan Bar Positif adalah strategi perdagangan kuantitatif berdasarkan penghakiman tindakan harga. Ia mengira peratusan lilin uptrend dalam tempoh tertentu untuk menentukan sama ada pasaran kini berada dalam keadaan uptrend. Apabila peratusan lilin uptrend lebih tinggi daripada had atas yang ditakrifkan oleh pengguna, strategi menilai bahawa pasaran kini berada dalam trend menaik dan pergi panjang. Apabila peratusan lebih rendah daripada had bawah yang ditakrifkan oleh pengguna, strategi menilai bahawa pasaran kini berada dalam trend menurun dan pergi pendek.

Logika Strategi

Indikator utama strategi ini adalah peratusan lilin uptrend. Lilin uptrend dibuka di bawah tahap terendah sebelumnya dan ditutup di atas tahap terbuka, menunjukkan harga meningkat dalam tempoh itu. Strategi ini mengira bilangan lilin uptrend dalam tempoh kemunculan yang ditakrifkan oleh pengguna dan mengira peratusan lilin uptrend di antara semua lilin. Apabila peratusan lebih tinggi daripada had atas, strategi menilai pasaran berada dalam trend up yang berterusan dan pergi panjang. Apabila peratusan lebih rendah daripada had bawah, strategi menilai pasaran berada dalam trend menurun dan pergi pendek. Perintah stop loss dan take profit ditetapkan mengikut kaedah stop loss yang ditakrifkan oleh pengguna.

Sebagai contoh, jika pengguna menetapkan tempoh melihat kembali kepada 20, had atas kepada 70, had bawah kepada 30, strategi mengesan kembali 20 lilin terkini. Jika 16 daripadanya adalah lilin uptrend, peratusan akan menjadi 16/20 = 80%. Oleh kerana 80% lebih tinggi daripada had atas 70%, strategi akan melaksanakan pesanan panjang. Jika di antara 20 lilin terkini, hanya 5 adalah lilin uptrend, maka peratusan akan menjadi 5/20 = 25%. Ini lebih rendah daripada had bawah 30%, strategi akan melaksanakan pesanan pendek.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Logik strategi adalah mudah dan intuitif, mudah difahami;
  2. Ia bergantung kepada satu penunjuk sahaja, mengurangkan risiko pemasangan berlebihan;
  3. Pengguna boleh menyesuaikan parameter untuk produk yang berbeza;
  4. Ia mempunyai fungsi stop loss / mengambil keuntungan terbina dalam untuk mengelakkan kerugian besar;
  5. Membolehkan perdagangan terbalik tanpa keluar dari kedudukan terlebih dahulu, mengesan trend lebih cepat.

Analisis Risiko

Risiko utama strategi ini ialah:

  1. Mengandalkan hanya satu penunjuk boleh menghasilkan isyarat palsu;
  2. Parameter terdedah kepada pemasangan berlebihan, prestasi hidup boleh berbeza-beza;
  3. Stop loss boleh terjejas oleh turun naik harga yang tidak menentu, yang membawa kepada kerugian;
  4. Perdagangan terbalik boleh meningkatkan kerugian;
  5. Prestasi sangat bergantung pada simbol, memerlukan ujian berasingan.

Risiko boleh dikurangkan dengan:

  1. Menambah penapis untuk mengelakkan isyarat palsu;
  2. Mengoptimumkan logik stop loss untuk mengehadkan kerugian;
  3. Penilaian dan kawalan saiz kerugian maksimum;
  4. Ujian pada simbol yang berbeza secara berasingan.

Arahan pengoptimuman

Arah utama untuk mengoptimumkan strategi ini termasuk:

  1. Menambah penunjuk tambahan seperti kelantangan untuk mengelakkan isyarat palsu;
  2. Mengoptimumkan kaedah stop loss, seperti trailing stop loss;
  3. Menambah penapis kemasukan seperti pecah Bollinger Bands;
  4. Ujian parameter optimum lilin trend menaik untuk simbol yang berbeza;
  5. Mengkaji pengeluaran maksimum dan mengawal saiz kerugian.

Kesimpulan

Strategi Penembusan Peratusan Bar Positif mempunyai logik yang mudah dan mudah untuk menangkap trend dengan menilai secara statistik kelangsungan trend naik / turun. Ia mudah difahami dan mesra pengguna, sesuai untuk pemula. Tetapi bergantung pada satu penunjuk dan pengoptimuman parameter memerlukan penambahbaikan lebih lanjut pada kawalan risiko untuk keuntungan yang stabil di pasaran yang berbeza.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-04 00:00:00
period: 1m
basePeriod: 1m
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 
// © TweakerID

// Based on the calculations by ZenAndTheArtOfTrading, I added stop loss, take profit and reverse line codes.
// The Positive Bars % calculates the number of green (positive) bars, relative to a lookback period, defined 
// by the user. If the percentage is low, it means that there was a bigger number of red candles in the 
// lookback period. The strategy goes long when the percentage is high and short when it's low, although
// this logic can be reversed with positive results on different time frames.

//@version=4
strategy("Positive Bars % Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

lookback = input(title="Lookback", type=input.integer, defval=13)
upperLimit = input(title="Upper Limit", type=input.integer, defval=70)
lowerLimit = input(title="Lower Limit", type=input.integer, defval=30)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.6, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//Calculations
positiveBars = 0
for i = (lookback - 1) to 0
    if close[i] > open[i]
        positiveBars := positiveBars + 1
positiveBarsPercent = (positiveBars / lookback) * 100

BUY=positiveBarsPercent >= upperLimit
SELL=positiveBarsPercent <= lowerLimit

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)

Lebih lanjut