この戦略は,枢軸分析に基づいた高度な取引システムで,市場の重要な転換点を特定して,潜在的なトレンドの逆転を予測する.この戦略は,革新的な”枢軸の枢軸”のアプローチを採用し,波動率指標ATRと組み合わせてポジション管理を行い,完全な取引システムを形成する.この戦略は,複数の市場に適用され,異なる市場の特性に応じてパラメータを最適化することができる.
戦略の核心は,市場逆転の機会を2層の枢軸分析で識別することです. 一層の枢軸は,基本的な高低点であり,二層の枢軸は,一層の枢軸から選択された顕著な転換点です. 価格がこれらの重要なレベルを突破すると,システムは取引信号を生成します. 同時に,戦略は,市場波動性を測定するためにATR指標を使用し,ストップ・ロストの位置とポジションの大きさを決定します.
これは,よく設計されたトレンド反転取引戦略であり,二重軸点分析とATR変動率管理により,安定した取引システムを構築している.この戦略の優点は,その適応性が強く,リスク管理が完璧であることにあるが,依然として,トレーダーが利子を慎重に使用し,パラメータを継続的に最適化する必要がある.推奨された最適化方向によって,戦略は,向上する余地がある.この戦略は,安定したタイプのトレーダーに適しており,深入の研究と実践に値する取引システムである.
/*backtest
start: 2024-11-04 00:00:00
end: 2024-12-04 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Pivot of Pivot Reversal Strategy [MAD]", shorttitle="PoP Reversal Strategy", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3)
// Inputs with Tooltips
leftBars = input.int(4, minval=1, title='PP Left Bars', tooltip='Number of bars to the left of the pivot point. Increasing this value makes the pivot more significant.')
rightBars = input.int(2, minval=1, title='PP Right Bars', tooltip='Number of bars to the right of the pivot point. Increasing this value delays the pivot detection but may reduce false signals.')
atr_length = input.int(14, minval=1, title='ATR Length', tooltip='Length for ATR calculation. ATR is used to assess market volatility.')
atr_mult = input.float(0.1, minval=0.0, step=0.1, title='ATR Multiplier', tooltip='Multiplier applied to ATR for pivot significance. Higher values require greater price movement for pivots.')
allowLongs = input.bool(true, title='Allow Long Positions', tooltip='Enable or disable long positions.')
allowShorts = input.bool(true, title='Allow Short Positions', tooltip='Enable or disable short positions.')
margin_amount = input.float(1.0, minval=1.0, maxval=100.0, step=1.0, title='Margin Amount (Leverage)', tooltip='Set the leverage multiplier (e.g., 3x, 5x, 10x). Note: Adjust leverage in strategy properties for accurate results.')
risk_reward_enabled = input.bool(false, title='Enable Risk/Reward Ratio', tooltip='Enable or disable the use of a fixed risk/reward ratio for trades.')
risk_reward_ratio = input.float(1.0, minval=0.1, step=0.1, title='Risk/Reward Ratio', tooltip='Set the desired risk/reward ratio (e.g., 1.0 for 1:1).')
risk_percent = input.float(1.0, minval=0.1, step=0.1, title='Risk Percentage per Trade (%)', tooltip='Percentage of entry price to risk per trade.')
trail_stop_enabled = input.bool(false, title='Enable Trailing Stop Loss', tooltip='Enable or disable the trailing stop loss.')
trail_percent = input.float(0.5, minval=0.0, step=0.1, title='Trailing Stop Loss (%)', tooltip='Percentage for trailing stop loss.')
start_year = input.int(2018, title='Start Year', tooltip='Backtest start year.')
start_month = input.int(1, title='Start Month', tooltip='Backtest start month.')
start_day = input.int(1, title='Start Day', tooltip='Backtest start day.')
end_year = input.int(2100, title='End Year', tooltip='Backtest end year.')
end_month = input.int(1, title='End Month', tooltip='Backtest end month.')
end_day = input.int(1, title='End Day', tooltip='Backtest end day.')
date_start = timestamp(start_year, start_month, start_day, 00, 00)
date_end = timestamp(end_year, end_month, end_day, 00, 00)
time_cond = time >= date_start and time <= date_end
// Pivot High Significant Function
pivotHighSig(left, right) =>
pp_ok = true
atr = ta.atr(atr_length)
for i = 1 to left
if high[right] < high[right + i] + atr * atr_mult
pp_ok := false
for i = 0 to right - 1
if high[right] < high[i] + atr * atr_mult
pp_ok := false
pp_ok ? high[right] : na
// Pivot Low Significant Function
pivotLowSig(left, right) =>
pp_ok = true
atr = ta.atr(atr_length)
for i = 1 to left
if low[right] > low[right + i] - atr * atr_mult
pp_ok := false
for i = 0 to right - 1
if low[right] > low[i] - atr * atr_mult
pp_ok := false
pp_ok ? low[right] : na
swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig(leftBars, rightBars)
swh_cond = not na(swh)
var float hprice = 0.0
hprice := swh_cond ? swh : nz(hprice[1])
le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
swl_cond = not na(swl)
var float lprice = 0.0
lprice := swl_cond ? swl : nz(lprice[1])
se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
// Pivots of pivots
var float ph1 = 0.0
var float ph2 = 0.0
var float ph3 = 0.0
var float pl1 = 0.0
var float pl2 = 0.0
var float pl3 = 0.0
var float pphprice = 0.0
var float pplprice = 0.0
ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1])
ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1])
ph1 := swh_cond ? hprice : nz(ph1[1])
pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1])
pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1])
pl1 := swl_cond ? lprice : nz(pl1[1])
pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1])
pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1])
// Entry and Exit Logic
if time_cond
// Calculate order quantity based on margin amount
float order_qty = na
if margin_amount > 0
order_qty := (strategy.equity * margin_amount) / close
// Long Position
if allowLongs and le and not na(pphprice) and pphprice != 0
float entry_price_long = pphprice + syminfo.mintick
strategy.entry("PivRevLE", strategy.long, qty=order_qty, comment="PivRevLE", stop=entry_price_long)
if risk_reward_enabled or (trail_stop_enabled and trail_percent > 0.0)
float stop_loss_price = na
float take_profit_price = na
float trail_offset_long = na
float trail_points_long = na
if risk_reward_enabled
float risk_amount = entry_price_long * (risk_percent / 100)
stop_loss_price := entry_price_long - risk_amount
float profit_target = risk_amount * risk_reward_ratio
take_profit_price := entry_price_long + profit_target
if trail_stop_enabled and trail_percent > 0.0
trail_offset_long := (trail_percent / 100.0) * entry_price_long
trail_points_long := trail_offset_long / syminfo.pointvalue
strategy.exit("PivRevLE Exit", from_entry="PivRevLE",
stop=stop_loss_price, limit=take_profit_price,
trail_points=trail_points_long, trail_offset=trail_points_long)
// Short Position
if allowShorts and se and not na(pplprice) and pplprice != 0
float entry_price_short = pplprice - syminfo.mintick
strategy.entry("PivRevSE", strategy.short, qty=order_qty, comment="PivRevSE", stop=entry_price_short)
if risk_reward_enabled or (trail_stop_enabled and trail_percent > 0.0)
float stop_loss_price = na
float take_profit_price = na
float trail_offset_short = na
float trail_points_short = na
if risk_reward_enabled
float risk_amount = entry_price_short * (risk_percent / 100)
stop_loss_price := entry_price_short + risk_amount
float profit_target = risk_amount * risk_reward_ratio
take_profit_price := entry_price_short - profit_target
if trail_stop_enabled and trail_percent > 0.0
trail_offset_short := (trail_percent / 100.0) * entry_price_short
trail_points_short := trail_offset_short / syminfo.pointvalue
strategy.exit("PivRevSE Exit", from_entry="PivRevSE",
stop=stop_loss_price, limit=take_profit_price,
trail_points=trail_points_short, trail_offset=trail_points_short)
// Plotting
plot(lprice, color=color.new(color.red, 55), title='Low Price')
plot(hprice, color=color.new(color.green, 55), title='High Price')
plot(pplprice, color=color.new(color.red, 0), linewidth=2, title='Pivot Low Price')
plot(pphprice, color=color.new(color.green, 0), linewidth=2, title='Pivot High Price')