
Strategi ini adalah sistem perdagangan yang lengkap yang menggabungkan beberapa petunjuk teknikal, terutamanya berdasarkan skor Z untuk mengukur jumlah perdagangan dan nilai-nilai anomali saiz entiti K-line, dan menggunakan ATR (Average True Range) untuk menetapkan stop loss dinamik. Sistem ini juga mengintegrasikan RR (Risk-to-Rate) untuk mengoptimumkan sasaran keuntungan, memberikan isyarat perdagangan yang boleh dipercayai melalui analisis teknikal berbilang dimensi.
Logik teras strategi adalah berdasarkan komponen utama berikut:
Strategi ini membina sistem perdagangan yang lengkap dengan menggabungkan analisis skor Z, pengoptimuman stop loss ATR dan nisbah keuntungan risiko. Kelebihan sistem adalah pengiktirafan isyarat berbilang dimensi dan pengurusan risiko yang fleksibel, tetapi masih perlu mengambil kira kesan tetapan parameter dan persekitaran pasaran. Dengan arah pengoptimuman yang disyorkan, strategi dapat meningkatkan kestabilan dan kesesuaian lebih lanjut.
/*backtest
start: 2024-10-01 00:00:00
end: 2025-02-18 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("admbrk | Candle Color & Price Alarm with ATR Stop", overlay=true, initial_capital=50, default_qty_type=strategy.cash, default_qty_value=200, commission_type=strategy.commission.percent, commission_value=0.05, pyramiding=3)
// **Risk/Reward ratio (RR) as input**
rr = input.float(2.0, title="Risk/Reward Ratio (RR)", step=0.1)
// **Z-score calculation function**
f_zscore(src, len) =>
mean = ta.sma(src, len)
std = ta.stdev(src, len)
(src - mean) / std
// **Z-score calculations**
len = input(20, "Z-Score MA Length")
z1 = input.float(1.5, "Threshold z1", step=0.1)
z2 = input.float(2.5, "Threshold z2", step=0.1)
z_volume = f_zscore(volume, len)
z_body = f_zscore(math.abs(close - open), len)
i_src = input.string("Volume", title="Source", options=["Volume", "Body size", "Any", "All"])
float z = na
if i_src == "Volume"
z := z_volume
else if i_src == "Body size"
z := z_body
else if i_src == "Any"
z := math.max(z_volume, z_body)
else if i_src == "All"
z := math.min(z_volume, z_body)
// **Determine trend direction**
green = close >= open
red = close < open
// **Long and Short signals**
longSignal = barstate.isconfirmed and red[1] and low < low[1] and green
shortSignal = barstate.isconfirmed and green[1] and high > high[1] and red
long = longSignal and (z >= z1)
short = shortSignal and (z >= z1)
// **ATR calculation (for ATR Stop)**
atrLength = input.int(14, title="ATR Length")
atrMultiplier = input.float(1.5, title="ATR Stop Multiplier")
atrValue = ta.atr(atrLength)
// **ATR-based stop-loss calculation**
long_atr_stop = close - atrValue * atrMultiplier
short_atr_stop = close + atrValue * atrMultiplier
// **Stop-loss setting (set to the lowest/highest wick of the last two bars)**
long_sl = ta.lowest(low, 2) // Long stop-loss (lowest of the last 2 bars)
short_sl = ta.highest(high, 2) // Short stop-loss (highest of the last 2 bars)
// **Take-profit calculation (with RR)**
long_tp = close + (close - long_sl) * rr
short_tp = close - (short_sl - close) * rr
triggerAlarm(symbol)=>
status = close
var string message = na
alarmMessageJSON = syminfo.ticker + message +"\\n" + "Price: " + str.tostring(status)
if long
// Open Long position
strategy.entry("Long", strategy.long)
strategy.exit("Long Exit", from_entry="Long", stop=math.max(long_sl, long_atr_stop), limit=long_tp)
if short
// Open Short position
strategy.entry("Short", strategy.short)
strategy.exit("Short Exit", from_entry="Short", stop=math.min(short_sl, short_atr_stop), limit=short_tp)
// **Coloring the candles (BUY = Green, SELL = Red)**
barcolor(long ? color.green : short ? color.red : na)
// **Add entry/exit markers on the chart**
plotshape(long, title="BUY Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small, text="BUY")
plotshape(short, title="SELL Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="SELL")
// **Plot TP and SL markers on exits**
exitLong = strategy.position_size < strategy.position_size[1] and strategy.position_size[1] > 0
exitShort = strategy.position_size > strategy.position_size[1] and strategy.position_size[1] < 0
plotshape(exitLong, title="Long Exit", location=location.abovebar, color=color.blue, style=shape.labeldown, size=size.tiny, text="TP/SL")
plotshape(exitShort, title="Short Exit", location=location.belowbar, color=color.orange, style=shape.labelup, size=size.tiny, text="TP/SL")
// **Add alerts**
alertcondition(long, title="Long Signal", message="Long signal triggered!")
alertcondition(short, title="Short Signal", message="Short signal triggered!")