Positif Bars Strategi Penembusan Persentase

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

img

Gambaran umum

Positive Bars Percentage Breakout Strategy adalah strategi perdagangan kuantitatif berdasarkan penilaian price action. Strategi ini menghitung persentase lilin uptrend dalam periode tertentu untuk menentukan apakah pasar saat ini berada dalam keadaan uptrend. Ketika persentase lilin uptrend lebih tinggi dari batas atas yang ditentukan pengguna, strategi menilai bahwa pasar saat ini berada dalam tren naik dan pergi panjang. Ketika persentase lebih rendah dari batas bawah yang ditentukan pengguna, strategi menilai bahwa pasar saat ini berada dalam tren turun dan pergi pendek.

Logika Strategi

Indikator inti dari strategi ini adalah persentase lilin uptrend. Lilin uptrend dibuka di bawah level terendah sebelumnya dan ditutup di atas level terbuka, menunjukkan harga naik selama periode tersebut. Strategi menghitung jumlah lilin uptrend dalam periode lookback yang ditentukan pengguna dan menghitung persentase lilin uptrend di antara semua lilin. Ketika persentase lebih tinggi dari batas atas, strategi menilai pasar berada dalam tren naik yang terus-menerus dan pergi panjang. Ketika persentase lebih rendah dari batas bawah, strategi menilai pasar berada dalam tren menurun dan pergi pendek. Stop loss dan take profit order ditetapkan sesuai dengan metode stop loss yang ditentukan oleh pengguna.

Misalnya, jika pengguna menetapkan periode lookback menjadi 20, batas atas menjadi 70, batas bawah menjadi 30, strategi melacak kembali 20 lilin terbaru. Jika 16 dari mereka adalah lilin uptrend, persentase akan menjadi 16/20=80%. Karena 80% lebih tinggi dari batas atas 70%, strategi akan mengeksekusi order panjang. Jika di antara 20 lilin terbaru, hanya 5 adalah lilin uptrend, maka persentase akan menjadi 5/20=25%. Ini lebih rendah dari batas bawah 30%, strategi akan mengeksekusi order pendek.

Analisis Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Logika strategi sederhana dan intuitif, mudah dimengerti;
  2. Ini hanya didasarkan pada satu indikator, mengurangi risiko overfit;
  3. Pengguna dapat menyesuaikan parameter untuk produk yang berbeda;
  4. Ini memiliki built-in stop loss / mengambil keuntungan fungsi untuk mencegah kerugian besar;
  5. Memungkinkan perdagangan terbalik tanpa keluar dari posisi terlebih dahulu, pelacakan tren lebih cepat.

Analisis Risiko

Risiko utama dari strategi ini adalah:

  1. Bergantung hanya pada satu indikator dapat menghasilkan sinyal palsu;
  2. Parameter rentan terhadap overfitting, kinerja hidup dapat sangat berbeda;
  3. Stop loss dapat dipengaruhi oleh perubahan harga yang tidak menentu, yang menyebabkan kerugian;
  4. Perdagangan terbalik dapat memperkuat kerugian;
  5. Kinerja sangat bergantung pada simbol, membutuhkan tes terpisah.

Risiko dapat dikurangi dengan:

  1. Menambahkan filter untuk menghindari sinyal palsu;
  2. Mengoptimalkan logika stop loss untuk membatasi kerugian;
  3. Evaluasi dan pengendalian ukuran kerugian maksimum;
  4. Mencoba pada simbol yang berbeda secara terpisah.

Arahan Optimasi

Arah utama untuk mengoptimalkan strategi ini meliputi:

  1. Menambahkan indikator tambahan seperti volume untuk menghindari sinyal palsu;
  2. Mengoptimalkan metode stop loss, seperti trailing stop loss;
  3. Menambahkan filter entri seperti breakout dari Bollinger Bands;
  4. Pengujian parameter optimal lilin uptrend untuk simbol yang berbeda;
  5. Mengevaluasi penarikan maksimum dan mengontrol ukuran kerugian.

Kesimpulan

Positive Bars Percentage Breakout Strategy memiliki logika yang sederhana dan langsung untuk menangkap tren dengan menilai secara statistik keberlanjutan tren naik/turun. Ini mudah dipahami dan ramah pengguna, cocok untuk pemula.


/*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 banyak