
Strategi penembusan ke atas adalah strategi perdagangan kuantitatif berdasarkan penilaian pergerakan harga. Strategi ini menilai sama ada pasaran kini berada dalam keadaan kenaikan yang berterusan dengan mengira peratusan garis K ke arah kanan dalam tempoh yang ditetapkan. Apabila peratusan garis K ke arah kanan lebih tinggi daripada had atas yang ditetapkan oleh pengguna, strategi menilai kini berada dalam keadaan kenaikan, dan melakukan lebih banyak; Apabila peratusan garis K ke arah kanan adalah lebih rendah daripada had bawah yang ditetapkan oleh pengguna, strategi menilai kini berada dalam keadaan penurunan, dan melakukan ruang kosong.
Kaedah ini menunjukkan kenaikan harga dalam kitaran ini. Strategi ini menggunakan kitaran masa lalu yang ditentukan oleh pengguna statistik untuk menentukan peratusan jumlah garis K yang berlawanan dengan garis K. Apabila peratusan itu lebih besar daripada had atas, maka ia akan terus naik, dan apabila peratusan itu lebih kecil daripada had bawah, maka ia akan terus turun.
Contoh: Pengguna menetapkan jumlah kitaran 20, had atas 70, had bawah 30. Strategi mengulangi 20 baris K yang paling baru, jika 16 daripadanya adalah garis K yang lurus, perbandingan 16⁄20 = 80%. Pada masa ini lebih tinggi daripada batas atas 70 yang ditetapkan oleh pengguna, lakukan beberapa operasi. Jika hanya 5 dari 20 baris K yang paling baru, perbandingan 5⁄20 = 25%. Di bawah had bawah yang ditetapkan oleh pengguna, 30, lakukan operasi kosong.
Strategi ini mempunyai kelebihan berikut:
Strategi ini mempunyai beberapa risiko:
Untuk mengurangkan risiko, anda boleh mengoptimumkan dalam beberapa aspek berikut:
Strategi ini boleh dioptimumkan dalam beberapa arah:
Strategi penembusan ke atas yang disesuaikan dengan konsep keseluruhan yang jelas dan mudah, menilai kenaikan atau penurunan yang berterusan melalui perbandingan statistik ke arah garis K, menangkap trend dengan menggunakan penunjuk yang mudah. Strategi ini mudah difahami, mesra pengguna, sesuai untuk amalan pemula perdagangan kuantitatif. Tetapi ada beberapa turun naik keuntungan yang bergantung kepada satu-satunya penunjuk dan parameter, strategi ini perlu terus dioptimumkan untuk risiko, supaya ia dapat memperoleh keuntungan yang stabil di lebih banyak pasaran.
/*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)