이동평균선 반전을 기반으로 한 단기 거래 전략


생성 날짜: 2023-12-29 11:33:04 마지막으로 수정됨: 2023-12-29 11:33:04
복사: 0 클릭수: 678
avatar of ChaoZhang ChaoZhang
1
집중하다
1623
수행원

이동평균선 반전을 기반으로 한 단기 거래 전략

개요

반전 평균선 전략은 평균선 반전을 기반으로 한 짧은 라인 거래 전략이다. 그것은 부린 밴드, RSI, CCI 등의 여러 지표를 결합하여 금융 시장의 짧은 라인 운동 변화를 포착하여 낮은 가격과 높은 가격의 거래 목표를 달성한다.

이 전략은 주로 주식 지수, 외환, 귀금속과 같은 높은 유동성 품종에 사용된다. 이 전략은 각 단위 수익을 극대화하면서 전체 거래의 위험-수익 비율을 제어한다.

전략 원칙

  1. 브린 띠를 사용하여 가격의 부진 영역을 판단하십시오. 가격이 브린 띠 위쪽으로 접근 할 때 공백을 고려하고 가격이 브린 띠 아래로 접근 할 때 더 많은 것을 고려하십시오.

  2. RSI 지표와 결합하여 과매매를 판단한다. RSI 지표는 과매매를 효과적으로 식별한다.

  3. CCI 지표는 가격 반전 신호를 판단한다. CCI 지표는 특이한 상황에 민감하여 가격 반전 기회를 효과적으로 포착할 수 있다.

  4. 가격이 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 하고, 5일 평균선을 넘어서서 더 많은 것을 한다.

  5. 입력 신호 확인 후, 빠른 평점 포지션 설정으로 수익을 다. 철회 상황에 따라 스톱로스 탈퇴를 설정하여 높은 승률을 달성한다.

전략적 이점

  1. 다중 지표 조합, 신호 정확성 향상

반전 평균선 전략은 동시에 부린 밴드, RSI, CCI 등의 여러 지표를 사용합니다. 이 지표들은 가격 변화에 민감하며, 조합으로 사용하면 신호 정확도를 높이고 잘못된 신호를 줄일 수 있습니다.

  1. 엄격한 출장규칙, 추종을 피하기

전략은 지표 신호와 가격이 동시적으로 나타나기를 요구하며, 단일 지표의 오해를 피한다. 동시에 가격이 명백하게 반전되어 관련 위험을 줄이는 것을 요구한다.

  1. 효율적인 손해 방지 장치, 단독 손실을 제어하는

더 많은 코스피를 해도, 전략은 더 엄격한 스톱로스 라인을 설정한다. 가격이 부정적인 방향으로 스톱로스 라인을 돌파하면, 전략은 빠르게 스톱로스하고, 단일 큰 손실을 피한다.

  1. 이윤을 극대화하기 위한 합리적인 노력

전략은 두 개의 스톱 목표를 설정하여 점진적으로 수익을 얻습니다. 동시에 스톱 후 작은 단계로 스톱 손실을 조정하여 각 수익 공간을 확장합니다.

위험 분석

  1. 이 사건으로 인해 유가격이 급격하게 변동하면서,

가격의 급격한 변동이 있을 때, 스톱 로드 라인이 뚫려서 불필요한 손실이 발생할 수 있다. 이런 상황은 종종 중대한 사건으로 인한 가격의 비정상적인 변동에서 발생합니다.

이러한 위험은 스톱 손실을 확대함으로써 대응할 수 있으며, 동시에 중대한 사건이 발생했을 때 작동하는 것을 피할 수 있다.

  1. 하지만, 그 후로, 그들은 다시 돌아오지 못했습니다.

유동성이 너무 강하면 가격이 너무 빨리 상승하여 시간 내에 되돌릴 수 없습니다. 이 경우 공백을 계속 유지하면 추락의 위험을 감수 할 수 있습니다.

이 경우, 일시적으로 기다려야 할 것이며, 가격 상승 동력이 눈에 띄게 줄어들 때만 개입을 고려해야 한다.

최적화 방향

  1. 지표 매개 변수를 최적화하여 신호 정확도를 향상시킵니다.

다양한 변수 조합 하의 피드백 결과를 테스트하여 최적의 변수를 선택하십시오. 예를 들어 RSI의 변수, CCI의 변수 등이 최적화 될 수 있습니다.

  1. 융합에너지 지표, 현실적 전환 시기를 판단하는 방법

거래량이나 브린 대역폭의 등급을 추가할 수 있다. 이것은 가격이 단지 작은 조정이 있을 때 잘못된 신호를 발생시키는 것을 피할 수 있다.

  1. 단위 수익을 확대하기 위한 스톱 스톱 손실 전략의 최적화

각 단위 수익을 극대화하기 위해 다양한 스톱 스톱 손실을 테스트 할 수 있습니다. 동시에 위험을 균형을 맞추고 스톱 손실이 쉽게 유발되는 것을 피하십시오.

요약하다

반전평균선 전략은 여러 지표 판단력을 종합적으로 사용하여 신호 정밀도, 운영 규범, 위험을 제어할 수 있는 특징이 있다. 그것은 시장 변화에 민감한, 유동성이 강한 품종에 적합하며, 브린 밴드와 핵심평균선 사이의 가격 반전 기회를 포착하여 낮은 가격과 높은 가격의 거래 목표를 달성 할 수 있습니다.

실제 적용에서, 여전히 지표 매개 변수의 최적화에 주의를 기울여야 하며, 양적 인 지표와 결합하여 실제 반전 시점을 판단할 수 있습니다. 또한, 가격의 급격한 변동에 대응하여 위험을 잘 관리합니다. 적절하게 적용되면, 이 전략은 비교적 안정적인 알파 수익을 얻을 수 있습니다.

전략 소스 코드
/*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