
반전 평균선 전략은 평균선 반전을 기반으로 한 짧은 라인 거래 전략이다. 그것은 부린 밴드, RSI, CCI 등의 여러 지표를 결합하여 금융 시장의 짧은 라인 운동 변화를 포착하여 낮은 가격과 높은 가격의 거래 목표를 달성한다.
이 전략은 주로 주식 지수, 외환, 귀금속과 같은 높은 유동성 품종에 사용된다. 이 전략은 각 단위 수익을 극대화하면서 전체 거래의 위험-수익 비율을 제어한다.
브린 띠를 사용하여 가격의 부진 영역을 판단하십시오. 가격이 브린 띠 위쪽으로 접근 할 때 공백을 고려하고 가격이 브린 띠 아래로 접근 할 때 더 많은 것을 고려하십시오.
RSI 지표와 결합하여 과매매를 판단한다. RSI 지표는 과매매를 효과적으로 식별한다.
CCI 지표는 가격 반전 신호를 판단한다. CCI 지표는 특이한 상황에 민감하여 가격 반전 기회를 효과적으로 포착할 수 있다.
가격이 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 한다.
입력 신호 확인 후, 빠른 평점 포지션 설정으로 수익을 다. 철회 상황에 따라 스톱로스 탈퇴를 설정하여 높은 승률을 달성한다.
반전 평균선 전략은 동시에 부린 밴드, RSI, CCI 등의 여러 지표를 사용합니다. 이 지표들은 가격 변화에 민감하며, 조합으로 사용하면 신호 정확도를 높이고 잘못된 신호를 줄일 수 있습니다.
전략은 지표 신호와 가격이 동시적으로 나타나기를 요구하며, 단일 지표의 오해를 피한다. 동시에 가격이 명백하게 반전되어 관련 위험을 줄이는 것을 요구한다.
더 많은 코스피를 해도, 전략은 더 엄격한 스톱로스 라인을 설정한다. 가격이 부정적인 방향으로 스톱로스 라인을 돌파하면, 전략은 빠르게 스톱로스하고, 단일 큰 손실을 피한다.
전략은 두 개의 스톱 목표를 설정하여 점진적으로 수익을 얻습니다. 동시에 스톱 후 작은 단계로 스톱 손실을 조정하여 각 수익 공간을 확장합니다.
가격의 급격한 변동이 있을 때, 스톱 로드 라인이 뚫려서 불필요한 손실이 발생할 수 있다. 이런 상황은 종종 중대한 사건으로 인한 가격의 비정상적인 변동에서 발생합니다.
이러한 위험은 스톱 손실을 확대함으로써 대응할 수 있으며, 동시에 중대한 사건이 발생했을 때 작동하는 것을 피할 수 있다.
유동성이 너무 강하면 가격이 너무 빨리 상승하여 시간 내에 되돌릴 수 없습니다. 이 경우 공백을 계속 유지하면 추락의 위험을 감수 할 수 있습니다.
이 경우, 일시적으로 기다려야 할 것이며, 가격 상승 동력이 눈에 띄게 줄어들 때만 개입을 고려해야 한다.
다양한 변수 조합 하의 피드백 결과를 테스트하여 최적의 변수를 선택하십시오. 예를 들어 RSI의 변수, CCI의 변수 등이 최적화 될 수 있습니다.
거래량이나 브린 대역폭의 등급을 추가할 수 있다. 이것은 가격이 단지 작은 조정이 있을 때 잘못된 신호를 발생시키는 것을 피할 수 있다.
각 단위 수익을 극대화하기 위해 다양한 스톱 스톱 손실을 테스트 할 수 있습니다. 동시에 위험을 균형을 맞추고 스톱 손실이 쉽게 유발되는 것을 피하십시오.
반전평균선 전략은 여러 지표 판단력을 종합적으로 사용하여 신호 정밀도, 운영 규범, 위험을 제어할 수 있는 특징이 있다. 그것은 시장 변화에 민감한, 유동성이 강한 품종에 적합하며, 브린 밴드와 핵심평균선 사이의 가격 반전 기회를 포착하여 낮은 가격과 높은 가격의 거래 목표를 달성 할 수 있습니다.
실제 적용에서, 여전히 지표 매개 변수의 최적화에 주의를 기울여야 하며, 양적 인 지표와 결합하여 실제 반전 시점을 판단할 수 있습니다. 또한, 가격의 급격한 변동에 대응하여 위험을 잘 관리합니다. 적절하게 적용되면, 이 전략은 비교적 안정적인 알파 수익을 얻을 수 있습니다.
/*backtest
start: 2022-12-22 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
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/
// © sg1999
//@version=4
// >>>>>strategy name
strategy(title = "CCI-RSI MR", shorttitle = "CCI-RSI MR", overlay = true)
// >>>>input variables
// 1. risk per trade as % of initial capital
risk_limit = input(title="Risk Limit (%)", type=input.float, minval=0.1, defval=2.0, step=0.1)
// 2. drawdown
Draw_down = input(title="Max Drawdown (x ATR)", type=input.float, minval=0.5, maxval=10, defval=2.0, step=0.1)
// 3. type of stop loss to be used
original_sl_type = input(title="SL Based on", defval="Close Price", options=["Close Price","Last Traded Price"])
// 4. entry signal validity for bollinger strategies
dist_from_signal= input(title="Entry distance from signal", type=input.integer, minval=1, maxval=20, defval=3, step=1)
// 5. multiple exit points
exit_1_pft_pct = input(title="1st exit when reward is", type=input.float, minval=0.5, maxval=100, defval=1.0, step=0.1)
exit_1_qty_pct = input(title="1st exit quantity %", type=input.float, minval=1, maxval=100, defval=100, step=5)
exit_2_pft_pct = input(title="2nd exit when reward is", type=input.float, minval=0.5, maxval=100, defval=1.5, step=0.1)
sl_trail_pct = input(title="Trailing SL compared to original SL", type=input.float, minval=0.5, maxval=100, defval=0.5, step=0.5)
//show signal bool
plotBB = input(title="Show BB", type=input.bool, defval=true)
plotSignals = input(title="Show Signals", type=input.bool, defval=true)
// 6. date range to be used for backtesting
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12)
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31)
fromYear = input(defval = 1990, title = "From Year", type = input.integer, minval = 1970)
thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12)
thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31)
thruYear = input(defval = 2022, title = "Thru Year", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => true
// >>>>>strategy variables
//input variables
current_high = highest(high, 5) // swing high (5 period)
current_low = lowest(low, 5) // swing low (5 period)
current_ma = sma(close, 5) // Simple Moving average (5 period)
atr_length = atr(20) // ATR (20 period)
CCI = cci(close,20) // CCI (20 period)
RSI = rsi(close,14) // RSI (14 period)
RSI_5 = sma (RSI, 5) // Simple moving average of RSI (5 period)
// 1. for current candle
long_entry = false
short_entry = false
risk_reward_ok = false
sl_hit_flag = false
tsl_hit_flag = false
sl_cross = false
// 2. across candles
var RSI_short = false //short signal boolean
var RSI_long = false //long signal boolean
var cci_sell = false //sellsignal crossunder boolean
var cci_buy = false //buy signal crossover boolean
var bar_count_long = 0 // Number of bars after a long signal
var bar_count_short = 0 // Number of bars after a short signal
var candles_on_trade = 0
var entry_price = 0.00
var sl_price = 0.00
var qty = 0
var exit_1_qty = 0
var exit_2_qty = 0
var exit_1_price = 0.0
var exit_2_price = 0.0
var hold_high = 0.0 // variable used to calculate Trailing sl
var hold_low = 0.0 // variable used to calculate Trailing sl
var tsl_size = 0.0 // Trailing Stop loss size(xR)
var sl_size = 0.0 // Stop loss size (R)
var tsl_price = 0.0 //Trailing stoploss price
// >>>>>strategy conditions.
// Bollinger bands (2 std)
[mBB0,uBB0,lBB0] = bb(close,20,2)
uBB0_low= lowest(uBB0,3) // lowest among upper BB of past 3 periods
lBB0_high= highest(lBB0,3) //highest among upper BB of past 3 periods
//RSI and CCI may not necessarily crossunder on the same candle
t_sell_RSI = sum( crossunder(RSI,RSI_5)? 1 : 0, 2) == 1 // checks if crossunder has happened in the last 3 candles (including the current candle)
t_sell_CCI = sum( crossunder(CCI,100)? 1 : 0, 2) == 1 //and (CCI >50)
t_buy_RSI = sum( crossover(RSI,RSI_5)? 1 : 0, 2) == 1 //checks if crossover has happened in the last 3 candles (including the current candle)
t_buy_CCI = sum( crossover(CCI,-100) ? 1 : 0, 2) == 1 //and (CCI<-50)
// CONDITIONS FOR A SELL signal
if t_sell_RSI and t_sell_CCI and (current_high >= uBB0_low)
cci_sell := true
bar_count_short := 0
if cci_sell and strategy.position_size ==0
bar_count_short := bar_count_short + 1
if cci_sell and bar_count_short<= dist_from_signal and close <= current_ma and strategy.position_size ==0
RSI_short := true
//conditions for a BUY signal
if t_buy_RSI and t_buy_CCI and (current_low <= lBB0_high) // or current_low_close <= lBB01_high)
cci_buy := true
bar_count_long := 0
if cci_buy and strategy.position_size ==0
bar_count_long := bar_count_long + 1
if cci_buy and bar_count_long<= dist_from_signal and close >= current_ma and strategy.position_size ==0
RSI_long := true
if RSI_long and RSI_short
RSI_long := false
RSI_short := false
// >>>>>entry and target specifications
if strategy.position_size == 0 and RSI_short
short_entry := true
entry_price := close
sl_price := current_high + syminfo.mintick // (swing high + one tick) is the stop loss
sl_size := abs(entry_price - sl_price)
candles_on_trade := 0
tsl_size := abs(entry_price - sl_price)*sl_trail_pct // Here sl_trail_pct is the multiple of R which is used to calculate TSL size
if strategy.position_size == 0 and RSI_long
long_entry := true
entry_price := close
sl_price := current_low - syminfo.mintick //(swing low - one tick) is the stop loss
candles_on_trade := 0
sl_size := abs(entry_price - sl_price)
tsl_size := abs(entry_price - sl_price)*sl_trail_pct // Here sl_trail_pct is the multiple of R which is used to calculate TSL size
if long_entry and short_entry
long_entry := false
short_entry := false
// >>>>risk evaluation criteria
//>>>>> quantity determination and exit point specifications.
if (long_entry or short_entry) and strategy.position_size == 0 // Based on our risk (R), no.of lots is calculated by considering a risk per trade limit formula
qty := round((strategy.equity) * (risk_limit/100)/(abs(entry_price - sl_price)*syminfo.pointvalue))
exit_1_qty := round(qty * (exit_1_qty_pct/100))
exit_2_qty := qty - (exit_1_qty)
if long_entry
exit_1_price := entry_price + (sl_size * exit_1_pft_pct)
exit_2_price := entry_price + (sl_size * exit_2_pft_pct)
if short_entry
exit_1_price := entry_price - (sl_size * exit_1_pft_pct)
exit_2_price := entry_price - (sl_size * exit_2_pft_pct)
// trail SL after 1st target is hit
if abs(strategy.position_size) == 0
hold_high := 0
hold_low := 0
if strategy.position_size > 0 and high > exit_1_price
if high > hold_high or hold_high == 0
hold_high := high
tsl_price := hold_high - tsl_size
if strategy.position_size < 0 and low < exit_1_price
if low < hold_low or hold_low == 0
hold_low := low
tsl_price := hold_low + tsl_size
//>>>> entry conditons
if long_entry and strategy.position_size == 0
strategy.cancel("BUY", window()) // add another window condition which considers day time (working hours)
strategy.order("BUY", strategy.long, qty, comment="BUY @ "+ tostring(entry_price),when=window())
if short_entry and strategy.position_size == 0
strategy.cancel("SELL", window()) // add another window condition which considers day time (working hours)
strategy.order("SELL", strategy.short, qty, comment="SELL @ "+ tostring(entry_price),when=window())
//>>>> exit conditons
tsl_hit_flag := false
//exit at tsl
if strategy.position_size > 0 and close < tsl_price and abs(strategy.position_size)!=qty
strategy.order("EXIT at TSL", strategy.short, abs(strategy.position_size), comment="EXIT TSL @ "+ tostring(close))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
tsl_hit_flag := true
cci_sell := false
cci_buy := false
strategy.cancel("EXIT 1", true)
strategy.cancel("EXIT 2", true)
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at SL",true)
if strategy.position_size < 0 and close > tsl_price and abs(strategy.position_size)!=qty
strategy.order("EXIT at TSL", strategy.long, abs(strategy.position_size), comment="EXIT TSL @ "+ tostring(close))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
tsl_hit_flag := true
cci_sell := false
cci_buy := false
strategy.cancel("EXIT 1", true)
strategy.cancel("EXIT 2", true)
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at SL",true)
//>>>>exit at sl
if strategy.position_size > 0 and original_sl_type == "Close Price" and close < sl_price and abs(strategy.position_size)==qty
strategy.cancel("EXIT at SL", true)
strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size),stop= sl_price, comment="EXIT SL @ "+ tostring(close))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
sl_hit_flag := true
strategy.cancel("EXIT 1", true)
strategy.cancel("EXIT 2", true)
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at TSL",true)
if strategy.position_size < 0 and original_sl_type == "Close Price" and close > sl_price and abs(strategy.position_size)==qty
strategy.cancel("EXIT at SL", true)
strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop = sl_price, comment="EXIT SL @ "+ tostring(close))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
sl_hit_flag := true
strategy.cancel("EXIT 1", true)
strategy.cancel("EXIT 2", true)
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at TSL",true)
//>>>>>for ltp sl setting
if strategy.position_size > 0 and original_sl_type == "Last Traded Price" and abs(strategy.position_size) ==qty
strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size),stop= sl_price, comment="EXIT SL @ "+ tostring(close))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
strategy.cancel("EXIT 1", true)
strategy.cancel("EXIT 2", true)
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at TSL",true)
if strategy.position_size < 0 and original_sl_type == "Last Traded Price" and abs(strategy.position_size) ==qty
strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop = sl_price, comment="EXIT SL @ "+ tostring(close))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
strategy.cancel("EXIT 1", true)
strategy.cancel("EXIT 2", true)
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at TSL",true)
//>>>>>exit at target
if strategy.position_size > 0 and abs(strategy.position_size) == qty and not tsl_hit_flag
strategy.order("EXIT 1", strategy.short, exit_1_qty, limit=exit_1_price, comment="EXIT TG1 @ "+ tostring(exit_1_price))
strategy.cancel("Exit Drawd",true)
cci_sell := false
cci_buy := false
if strategy.position_size > 0 and abs(strategy.position_size) < qty and abs(strategy.position_size) != qty and not tsl_hit_flag
strategy.order("EXIT 2", strategy.short, exit_2_qty, limit=exit_2_price, comment="EXIT TG2 @ "+ tostring(exit_2_price))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at SL", true)
if strategy.position_size < 0 and abs(strategy.position_size) == qty and not tsl_hit_flag
strategy.order("EXIT 1", strategy.long, exit_1_qty, limit=exit_1_price, comment="EXIT TG1 @ "+ tostring(exit_1_price))
strategy.cancel("Exit Drawd",true)
cci_buy := false
cci_sell := false
if strategy.position_size < 0 and abs(strategy.position_size) < qty and abs(strategy.position_size) != qty
strategy.order("EXIT 2", strategy.long, exit_2_qty, limit=exit_2_price, comment="EXIT TG2 @ "+ tostring(exit_2_price))
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
strategy.cancel("Exit Drawd",true)
strategy.cancel("EXIT at SL", true)
//>>>>>>drawdown execution
if strategy.position_size < 0 and original_sl_type == "Close Price" and not tsl_hit_flag
strategy.cancel("Exit Drawd",true)
strategy.order("Exit Drawd", strategy.long, abs(strategy.position_size), stop= (entry_price + Draw_down*atr_length) ,comment="Drawdown exit S")
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
if strategy.position_size > 0 and original_sl_type == "Close Price" and not tsl_hit_flag and not sl_hit_flag
strategy.cancel("Exit Drawd",true)
strategy.order("Exit Drawd", strategy.short, abs(strategy.position_size), stop= (entry_price - Draw_down*atr_length) ,comment="Drawdown exit B")
RSI_short := false
RSI_long := false
bar_count_long := 0
bar_count_short := 0
cci_buy := false
cci_sell := false
//>>>>to add sl hit sign
if strategy.position_size != 0 and sl_hit_flag //For symbols on chart
sl_cross := true
//>>>>>cancel all pending orders if the trade is booked
strategy.cancel_all(strategy.position_size == 0 and not (long_entry or short_entry))
//>>>>plot indicators
p_mBB = plot(plotBB ? mBB0 : na, color=color.teal)
p_uBB = plot(plotBB ? uBB0 : na, color=color.teal, style=plot.style_stepline)
p_lBB = plot(plotBB ? lBB0 : na, color=color.teal, style=plot.style_stepline)
plot(sma(close,5), color=color.blue, title="MA")
//>>>>plot signals
plotshape(plotSignals and RSI_short, style=shape.triangledown, location=location.abovebar, color=color.red)
plotshape(plotSignals and RSI_long, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(sl_cross, text= "Stoploss Hit",size= size.normal,style=shape.xcross , location=location.belowbar, color=color.red)
//>>>>plot signal high low
if strategy.position_size != 0
candles_on_trade := candles_on_trade + 1
if strategy.position_size != 0 and candles_on_trade == 1
line.new(x1=bar_index[1], y1=high[1], x2=bar_index[0], y2=high[1], color=color.black, width=2)
line.new(x1=bar_index[1], y1=low[1], x2=bar_index[0], y2=low[1], color=color.black, width=2)
//>>>>end of program