
이 전략은 지표 다공간 인자에 기초하여 반전 거래를 취하고, 동시에 목표 수익을 설정한다. 다공간 인자의 핵심은 거래량에 기초한 확장 형태를 범용지원/저항 이며, 거래량이 높고 변동성이 있는 지표에 적용된다. 전략의 장점은 큰 중장기 경향 반전 기회를 포착하여 신속하게 이익을 얻는 데 있습니다. 그러나 포착 위험이 있습니다.
거래량에 기반한 범용의 지지/저항 의 다공이 인자를 식별
K선 형태를 사용하여 고전적인 지지/저항을 식별하고, 더 큰 거래량을 필터링하여 가짜 브레이크를 만듭니다.
일반식 지원/저항은 고전적인 형태보다 더 나은 포용성을 가지고 있다.
브레이크 범용 지원은 다인자 신호, 브레이크 범용 저항은 공인자 신호
반전 거래
인자 신호가 발사된 후, 역작업을 한다.
포지션이 있는 경우, 포지션을 역으로 하락하거나 포지션을 역으로 개시합니다.
수익 목표를 설정하세요
ATR에 따라 설정된 중지
1R/2R/3R와 같은 다중 목표 설정의 장점
다른 수익 목표에 도달한 후 수중 감축
지원 저항의 뚫림은 강한 경향 반전 신호를 나타냅니다. 그것은 약간의 신뢰성을 가지고 있으며, 단기간에 큰 반전을 포착 할 수 있습니다.
스톱로스 및 다단계 수익 목표 설정으로 빠른 수익을 달성하고 개별 주식 회수를 제한할 수 있습니다.
이 전략은 거래량 지표에 의존하며, 충분한 기관 자금이 흐르는 경향이 필요합니다. 또한 수익을 창출하기 위해 약간의 변동이 필요합니다.
거래가 흔들릴 때, 스톱로스 탈퇴 및 역입입의 동작은 자주 피하는 결과를 초래할 수 있다.
일반적인 지지 저항은 절대적으로 신뢰할 수 없으며, 실패 테스트의 역전 가능성이 있다.
트렌드 추적을 고려하지 않고 순전히 역전하는 전략으로, 더 큰 방향성 기회를 놓칠 수 있습니다.
풍력 조절
역전 거래의 요소 조건이 적절히 완화 될 수 있으며, 모든 돌파구가 역전 될 필요는 없습니다.
다른 지표 필터와 결합할 수 있습니다.
“지속이 계속되는 경우”
일반적 지지 저항의 파라미터를 최적화하여 더 신뢰할 수 있는 인자를 식별한다
더 많은 단계의 수익 목표를 추가할 수 있고, 고정되지 않은 수익 목표를 사용할 수도 있습니다.
ATR 파라미터를 조정하거나 istiska를 사용하여 불필요한 급격한 손실로 인한 거래 비용을 줄이십시오.
평균선과 같은 추세 판단을 도입할 수 있으며, 추세와 심각한 대립을 피할 수 있습니다. 또한 다른 보조 요소를 도입할 수 있습니다.
이 전략의 핵심은 반전 거래를 사용하여 단기간에 큰 변동성을 포착하는 것입니다. 전략 아이디어는 간단하고 직접적이며, 파라미터를 조정하여 좋은 실적 효과를 얻을 수 있습니다. 그러나 반전 전략은 더 급진적입니다.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1h
basePeriod: 15m
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/
// © DojiEmoji
//@version=5
strategy("Fractal Strat [KL] ", overlay=true, pyramiding=1, initial_capital=1000000000)
var string ENUM_LONG = "Long"
var string GROUP_ENTRY = "Entry"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"
var string GROUP_ORDER = "Order size and Profit taking"
// backtest_timeframe_start = input.time(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true
// TSL: calculate the stop loss price. {
_multiple = input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
ATR_TSL = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL, tooltip="Initial risk amount = atr(this length) x multiplier")) * _multiple
TSL_source = low
TSL_line_color = color.green
TSL_transp = 100
var stop_loss_price = float(0)
var float initial_entry_p = float(0)
var float risk_amt = float(0)
var float initial_order_size = float(0)
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block
// Order size and profit taking {
pcnt_alloc = input.int(5, title="Allocation (%) of portfolio into this security", tooltip="Size of positions is based on this % of undrawn capital. This is fixed throughout the backtest period.", minval=0, maxval=100, group=GROUP_ORDER) / 100
// Taking profits at user defined target levels relative to risked amount (i.e 1R, 2R, 3R)
var bool tp_mode = input(true, title="Take profit and different levels", group=GROUP_ORDER)
var float FIRST_LVL_PROFIT = input.float(1, title="First level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking first level profit at 1R means taking profits at $11", group=GROUP_ORDER)
var float SECOND_LVL_PROFIT = input.float(2, title="Second level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking second level profit at 2R means taking profits at $12", group=GROUP_ORDER)
var float THIRD_LVL_PROFIT = input.float(3, title="Third level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking third level profit at 3R means taking profits at $13", group=GROUP_ORDER)
// }
// Fractals {
// Modified from synapticEx's implementation: https://www.tradingview.com/script/cDCNneRP-Fractal-Support-Resistance-Fixed-Volume-2/
rel_vol_len = 6 // Relative volume is used; the middle candle has to have volume above the average (say sma over prior 6 bars)
rel_vol = ta.sma(volume, rel_vol_len)
_up = high[3]>high[4] and high[4]>high[5] and high[2]<high[3] and high[1]<high[2] and volume[3]>rel_vol[3]
_down = low[3]<low[4] and low[4]<low[5] and low[2]>low[3] and low[1]>low[2] and volume[3]>rel_vol[3]
fractal_resistance = high[3], fractal_support = low[3] // initialize
fractal_resistance := _up ? high[3] : fractal_resistance[1]
fractal_support := _down ? low[3] : fractal_support[1]
plot(fractal_resistance, "fractal_resistance", color=color.new(color.red,50), linewidth=2, style=plot.style_cross, offset =-3, join=false)
plot(fractal_support, "fractal_support", color=color.new(color.lime,50), linewidth=2, style=plot.style_cross, offset=-3, join=false)
// }
// ATR diversion test {
// Hypothesis testing (2-tailed):
//
// Null hypothesis (H0) and Alternative hypothesis (Ha):
// H0 : atr_fast equals atr_slow
// Ha : atr_fast not equals to atr_slow; implies atr_fast is either too low or too high
len_fast = input(5,title="Length of ATR (fast) for diversion test", group=GROUP_ENTRY)
atr_fast = ta.atr(len_fast)
atr_slow = ta.atr(input(50,title="Length of ATR (slow) for diversion test", group=GROUP_ENTRY, tooltip="This needs to be larger than Fast"))
// Calculate test statistic (test_stat)
std_error = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5)
test_stat = (atr_fast - atr_slow) / std_error
// Compare test_stat against critical value defined by user in settings
//critical_value = input.float(1.645,title="Critical value", tooltip="Strategy uses 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- this critical value, then H0 will be rejected.", group=GROUP_ENTRY)
conf_interval = input.string(title="Confidence Interval", defval="95%", options=["90%","95%","99%"], tooltip="Critical values of 1.645, 1.96, 2.58, for CI=90%/95%/99%, respectively; Under 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- critical value, then H0 will be rejected.")
critical_value = conf_interval == "90%" ? 1.645 : conf_interval == "95%" ? 1.96 : 2.58
reject_H0_lefttail = test_stat < -critical_value
reject_H0_righttail = test_stat > critical_value
// } end of "ATR diversion test" block
// Entry Signals
entry_signal_long = close >= fractal_support and reject_H0_lefttail
// MAIN {
// Update the stop limit if strategy holds a position.
if strategy.position_size > 0
strategy.exit(ENUM_LONG, comment="SL", stop=stop_loss_price)
// Entry
if within_timeframe and entry_signal_long and strategy.position_size == 0
initial_entry_p := close
risk_amt := ATR_TSL
initial_order_size := math.floor(pcnt_alloc * strategy.equity / close)
strategy.entry(ENUM_LONG, strategy.long, qty=initial_order_size)
var int TP_taken_count = 0
if tp_mode and close > strategy.position_avg_price
if close >= initial_entry_p + THIRD_LVL_PROFIT * risk_amt and TP_taken_count == 2
strategy.close(ENUM_LONG, comment="TP Lvl3", qty=math.floor(initial_order_size / 3))
TP_taken_count := TP_taken_count + 1
else if close >= initial_entry_p + SECOND_LVL_PROFIT * risk_amt and TP_taken_count == 1
strategy.close(ENUM_LONG, comment="TP Lvl2", qty=math.floor(initial_order_size / 3))
TP_taken_count := TP_taken_count + 1
else if close >= initial_entry_p + FIRST_LVL_PROFIT * risk_amt and TP_taken_count == 0
strategy.close(ENUM_LONG, comment="TP Lvl1", qty=math.floor(initial_order_size / 3))
TP_taken_count := TP_taken_count + 1
// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)
if strategy.position_size > 0 and ta.change(strategy.position_size)
if strategy.position_size > strategy.position_size[1]
alert_helper("BUY")
else if strategy.position_size < strategy.position_size[1]
alert_helper("SELL")
// Clean up - set the variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
TP_taken_count := 0
initial_entry_p := float(0)
risk_amt := float(0)
initial_order_size := float(0)
stop_loss_price := float(0)
// } end of MAIN block