시간당 변동에 따른 거래 전략


생성 날짜: 2023-09-20 16:50:27 마지막으로 수정됨: 2023-09-20 16:50:27
복사: 0 클릭수: 652
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 SPY 시장에 대 한, 시간 수준의 가격 변동을 사용하여 시장 움직임을 판단 하 고, 짧은 라인 반전 거래를 한다.

전략 원칙

  1. 5일과 13일 이동 평균선 교차를 사용하여 시간 레벨 가격의 역전.

  2. RSI 지표가 50보다 높을 때, 이동평균선금포는 구매 신호를 생성한다.

  3. 13일 평균선 아래 5일 평균선을 통과하면 MACD 이차가 신호선을 통과하면 판매 신호가 발생한다.

  4. 스톱로스 및 스톱 라인을 설정하고 목표 수익의 2배에 도달하면 일부 포지션을 평정하십시오.

  5. 이 라운드의 거래가 끝나면 다음 라운드에 진입할지 판단할 수 있다.

  6. 입력 매개 변수는 평균선, 스톱 스톱 비율 등을 사용자 정의할 수 있다.

우위 분석

  1. 시급 가격 변화를 이용해 단선 거래 기회를 잡으세요.

  2. 다중 지표 조합 검증은 신호의 정확성을 향상시킵니다.

  3. 스톱 로즈 스 (Stop Loss Stop) 전략을 세우는 것은 위험을 통제하는 데 도움이 됩니다.

  4. 일부 차단은 수익을 잠금화할 수 있습니다.

  5. 입력 매개 변수는 커스터마이징이 가능하며, 쇼트라인 거래자에게 적합하다.

위험 분석

  1. 시급 가격 변동으로 인해 잘못된 신호가 발생하여 손실이 발생할 수 있습니다.

  2. 스톱 손실 스톱 비율이 잘못 설정되어 너무 일찍 중단되거나 너무 오래 유지될 수 있습니다.

  3. 일부 품종의 매개 변수는 최적화된 조정이 필요하여 좋은 재검토 효과를 얻을 수 있다.

  4. 최적화 시에는 과장 적합성의 위험이 있습니다.

  5. 거래의 빈도가 수수료를 증가시키는 거래 비용.

최적화 방향

  1. 다양한 변수 조합을 테스트하여 최적의 변수를 찾습니다.

  2. 다른 지표들을 평가하여 거래 신호를 확인합니다.

  3. 위험과 수익의 균형을 맞추기 위해 손실을 막는 전략을 최적화하십시오.

  4. 트렌드 필터를 추가하여 역전 거래를 피하십시오.

  5. 수익을 올리는 시간을 연장하기 위한 부분적 휴식 조건의 적절한 완화.

  6. 전략에 적합한 다른 품종을 평가하십시오.

요약하다

이 전략은 SPY의 시간 수준의 단선 거래 기회를 잡으려고 한다. 매개 변수 최적화, 신호 필터링 등의 방법으로 신뢰성을 강화할 수 있어 효과적인 단선 거래 전략으로 만들어진다.

전략 소스 코드
//@version=5
strategy(title="SPY 1 Hour Swing Trader", initial_capital=300000, default_qty_type=strategy.percent_of_equity, default_qty_value=15, pyramiding=0, commission_type=strategy.commission.cash_per_order, commission_value=0, overlay=true, calc_on_every_tick=false, process_orders_on_close=true, max_labels_count=500)

//The purpose of this script is to spot 1 hour pivots that indicate ~5 to 6 trading day swings.
//Results indicate that swings are held approximately 5 to 6 trading days on average, over the last 6 years.
//This indicator spots a go long opportunity when the 5 ema crosses the 13 ema on the 1 hour along with the RSI > 50.
//It also spots uses a couple different means to determine when to exit the trade. Sell condition is 
//primarily when the 13 ema crosses the 5 ema and the MACD line crosses below the signal line and
//the smoothed Stoichastic appears oversold (greater than 60). Stop Losses and Take Profits are configurable
//in Inputs along with ability to include short trades plus other MACD and Stoichastic settings.
//If a stop loss is encountered the trade will close. Also once twice the expected move is encountered
//partial profits will taken and stop losses and take profits will be re-established based on most recent close
//Once long trades are exited, short trades will be initiated if recent conditions appeared oversold and
//input option for short trading is enabled. If trying to use this for something other than SPXL it is best
//to update stop losses and take profit percentages and check backtest results to ensure proper levels have
//been selected and the script gives satisfactory results.

// Initialize variables
var float long_entry_price = na
var float short_entry_price = na
var float stop_loss = na
var float take_profit = na
var float twoxtake_profit = na
var float short_stop_loss = na
var float short_take_profit = na
var float short_twoxtake_profit = na
var int startshort = 0

// Inputs
short = input.bool(true, "Include Short Trades!")
option_SL_P = input.float(0.02, "Input Stop Loss Percentage (0.02 = 2%)")
option_TP_P = input.float(0.03, "Input Take Profit Percentage (0.03 = 3%)")
pp = input.int(50, "Partial Profit Percentage in whole numbers (50 is 50%)")
ema5 = input.int(5, "Fast EMA Period", minval=1)
ema13 = input.int(13, "Slow EMA Period", minval=1)
rsi_length = input.int(14, "RSI Length", minval=1)
macd_fast_length = input.int(8, "MACD Fast Length", minval=1)
macd_slow_length = input.int(21, "MACD Slow Length", minval=1)
macd_signal_length = input.int(5, "MACD Signal Length", minval=1)
len = input.int(14, title="ADX Length", minval=1)
length = input.int(14, "Stochastic Length")
smoothK = input.int(3, "Stoicastic Smooth K")
src = input(close, "Stoicastic Source")

// Calculating EMA 
ema_13 = ta.ema(close, ema13)
ema_5 = ta.ema(close, ema5)

// Calculate RSI
rsi = ta.rsi(close, rsi_length)
smooth_rsi = ta.ema(rsi, 5)

// Calculate MACD
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)

// Calculate the True Range
tr = ta.tr(true)

// Calculate slope of MACD line
rsiSlope = (smooth_rsi - smooth_rsi[3]) / (bar_index - bar_index[3])

// Calculate the Directional Movement
up = ta.change(high)
down = -ta.change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)

// Calculate the Smoothed Directional Movement
plusDI = 100 * ta.ema(plusDM, len) / ta.ema(tr, len)
minusDI = 100 * ta.ema(minusDM, len) / ta.ema(tr, len)

// Calculate the Directional Index (DX)
DX = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)

// Calculate the ADX
adx = ta.ema(DX, len)

//Stochastic Calculation
highestHigh = ta.highest(src, length)
lowestLow = ta.lowest(src, length)
k = 100 * ((src - lowestLow) / (highestHigh - lowestLow))
d = ta.sma(k, smoothK)

// Determine current VIX
vixClose = request.security("VIX", timeframe.period, close[3])
//plot(vixClose, title="VIX Close", color=color.red)

// Buy and Sell Conditions
buy_condition = ta.crossover(ema_5 , ema_13) and rsi > 50
sell_condition = ema_13 > ema_5 and macd_line < signal_line and (d > 60)

// Plotting indicators
plot(ema_13, color=color.orange, title="Slow EMA Period")
plot(ema_5, color=color.blue, title="Fast EMA Period")

// Executing trades
if buy_condition and strategy.position_size == 0 and barstate.isconfirmed
    strategy.entry("Pivot Up", strategy.long, alert_message = "Pivoting Up")
    long_entry_price := close
    stop_loss := long_entry_price - (option_SL_P * close)
    take_profit := long_entry_price + (option_TP_P * close)
    twoxtake_profit := long_entry_price + (2 * option_TP_P * close)

if strategy.position_size > 0 and barstate.isconfirmed
    if close < stop_loss and barstate.isconfirmed
        strategy.close("Pivot Up", "Exit Longs Stopped")
        if short == 1 
            startshort := 1
    else if sell_condition and barstate.isconfirmed
        if short == 1
            startshort := 1
        strategy.close("Pivot Up", "Exit Longs Sell Condition Met")
    else if close >= twoxtake_profit and barstate.isconfirmed
        stop_loss := close - (.5*option_TP_P*close)
        take_profit := close + (.5*option_TP_P*close)
        strategy.exit("Exit Partial Longs", "Pivot Up", stop=stop_loss, limit = take_profit, qty_percent = pp)

if startshort == 1
    if (d[6] > 80) and barstate.isconfirmed
        strategy.entry("Pivot Down", strategy.short, alert_message = "Pivoting Down")
        short_entry_price := close
        short_stop_loss := short_entry_price + (option_SL_P * close)
        short_take_profit := short_entry_price - (option_TP_P * close)
        short_twoxtake_profit := short_entry_price - (2 * option_TP_P * close)
        startshort := 0
    else
        startshort := 0

if strategy.position_size < 0 and barstate.isconfirmed
    if close > short_stop_loss and barstate.isconfirmed
        strategy.close("Pivot Down", "Exit Shorts Stopped")
    else if close <= short_twoxtake_profit and barstate.isconfirmed
        short_stop_loss := close + (.5*option_TP_P*close)
        short_take_profit := close - (.5*option_TP_P*close)
        strategy.exit("Exit Partial Shorts", "Pivot Down", stop=short_stop_loss, limit = short_take_profit, qty_percent = pp)