동적 가격 스윙 오시레이터 전략

저자:차오장, 날짜: 2023-11-23 10:45:02
태그:

img

전반적인 설명

동적 가격 스윙 오시레이터는 가격 추세를 식별하는 전략이다. 동적 진입과 출구를 구현하기 위해 이동 평균, 가격 채널 및 피보나치 리트레이싱을 결합합니다. 이 전략의 장점은 유연한 운영을 위해 가격 추세의 변화를 식별 할 수 있다는 것입니다.

원칙

이 전략은 주로 다음과 같은 원칙에 기반합니다.

  1. 빠른 EMA와 느린 EMA를 사용하여 가격 트렌드의 방향을 결정하여 트렌드에 반하는 거래를 방지합니다.

  2. 파업 신호를 결정하기 위해 가격 상단 및 하단 채널 제한을 사용, 가격이 상단 제한 채널을 통과 할 때 짧게 이동, 하단 제한 채널을 통과 할 때 길게 이동

  3. 이동평균 크로스오버를 판단 신호로 사용하세요. 금색 십자가에 길게, 죽음의 십자가에 짧게 가세요.

  4. 판단 신호로 피보나치 리트레이싱 라인을 사용, 가격이 피보나치 상단선을 넘어서면 짧게, 하단선을 넘어서면 길게

이러한 지표에 기초하여 시장 진출, 스톱 손실 및 수익 출구 메커니즘을 결정한 후 설정됩니다.

이점 분석

이 전략의 가장 큰 장점은 여러 지표를 결합하여 가격 동향의 변화를 식별한다는 것입니다. 주요 장점은 다음과 같습니다.

  1. 주요 트렌드를 결정하기 위해 빠르고 느린 EMA를 사용하면 트렌드에 반대되는 거래를 방지하고 손실을 줄일 수 있습니다.

  2. 가격 채널 판단은 더 큰 수익 잠재력을 가진 가격 유출 기회를 포착 할 수 있습니다.

  3. 이동 평균 크로스오버 판단은 간단하고 실용적이며 실행이 쉽습니다.

  4. 피보나치 리트레이싱은 전략의 3차원성을 높이기 위해 다른 판단 방법을 추가합니다.

위험 분석

이 전략의 몇 가지 위험 요소는 다음과 같습니다.

  1. 빠른 EMA와 느린 EMA에 대한 잘못된 매개 변수 설정은 잘못된 판단으로 이어질 수 있습니다.

  2. 가격 채널의 상부와 하부 경계를 깨는 잘못된 타이밍은 손실 주문으로 이어질 수 있습니다.

  3. 이동평균 십자도 신중하게 선택해야 합니다

  4. 피보나치 리트레이스먼트 대역의 부적절한 너비 설정은 또한 판단 효과에 영향을 미칠 것입니다.

이러한 위험은 매개 변수 최적화를 통해 줄일 수 있습니다.

최적화 방향

이 전략을 위해 최적화 할 수있는 몇 가지 방향이 있습니다:

  1. EMA 사이클, 채널 너비 및 이동 평균 기간과 같은 매개 변수를 테스트하고 최적화하십시오.

  2. RSI 및 볼링거 밴드와 같은 다른 기술 지표에 대한 판단 규칙을 추가합니다.

  3. 거래량 에너지 지표 OBV를 결합하여 브레이크의 신뢰성을 결정합니다.

  4. 기계 학습 및 다른 기술을 사용하여 최적의 매개 변수를 자동으로 찾습니다.

결론

동적 가격 스윙 오시일레이터는 매우 유연하고 적응 가능한 전략이다. 여러 지표 판단을 통해 브레이크아웃을 결정한 후 가격 변화와 거래에 동적으로 적응할 수 있다. 일부 위험이 있지만 전략의 안정성과 수익성을 향상시키기 위해 지속적인 최적화로 감소할 수 있다. 전략은 심도 있는 연구에 가치가 있다.


/*backtest
start: 2023-11-15 00:00:00
end: 2023-11-22 00:00:00
period: 1m
basePeriod: 1m
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/
//@version=4

// ██████╗██████╗ ███████╗ █████╗ ████████╗███████╗██████╗     ██████╗ ██╗   ██╗    
//██╔════╝██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██╔════╝██╔══██╗    ██╔══██╗╚██╗ ██╔╝                       
//██║     ██████╔╝█████╗  ███████║   ██║   █████╗  ██║  ██║    ██████╔╝ ╚████╔╝                        
//██║     ██╔══██╗██╔══╝  ██╔══██║   ██║   ██╔══╝  ██║  ██║    ██╔══██╗  ╚██╔╝                         
//╚██████╗██║  ██║███████╗██║  ██║   ██║   ███████╗██████╔╝    ██████╔╝   ██║                          
// ╚═════╝╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝   ╚═╝   ╚══════╝╚═════╝     ╚═════╝    ╚═╝                          
                                                                                                     
//███████╗ ██████╗ ██╗     ██╗   ██╗████████╗██╗ ██████╗ ███╗   ██╗███████╗ ██╗ █████╗ ███████╗ █████╗ 
//██╔════╝██╔═══██╗██║     ██║   ██║╚══██╔══╝██║██╔═══██╗████╗  ██║██╔════╝███║██╔══██╗╚════██║██╔══██╗
//███████╗██║   ██║██║     ██║   ██║   ██║   ██║██║   ██║██╔██╗ ██║███████╗╚██║╚██████║    ██╔╝╚█████╔╝
//╚════██║██║   ██║██║     ██║   ██║   ██║   ██║██║   ██║██║╚██╗██║╚════██║ ██║ ╚═══██║   ██╔╝ ██╔══██╗
//███████║╚██████╔╝███████╗╚██████╔╝   ██║   ██║╚██████╔╝██║ ╚████║███████║ ██║ █████╔╝   ██║  ╚█████╔╝
//╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝    ╚═╝   ╚═╝ ╚═════╝ ╚═╝  ╚═══╝╚══════╝ ╚═╝ ╚════╝    ╚═╝   ╚════╝ 
                                                                                                     

strategy(shorttitle='DPS',title='Dynamic Price Swing', overlay=true, scale=scale.left, initial_capital = 1000, process_orders_on_close=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type=strategy.commission.percent, commission_value=0.18, calc_on_every_tick=true)


// -----------------  Strategy Inputs -------------------------------------------------------------
//Backtest dates with auto finish date of today
start = input(defval = timestamp("22 June 2021 00:00 -0500"), title = "Start Time")
finish = input(defval = timestamp("31 December 2021 00:00 -0600"), title = "End Time")
window()  => true       // create function "within window of time"

// Strategy Selection - Long, Short, or Both
stratinfo = input(true, "Long/Short for Mixed Market, Long for Bull, Short for Bear")
strat = input(title="Trade Types", defval="Long/Short", options=["Long Only", "Long/Short", "Short Only"])
strat_val = strat == "Long Only" ? 1 : strat == "Long/Short" ? 0 : -1

// Risk Management Inputs
sl= input(10.0, "Stop Loss %", minval = 0, maxval = 100, step = 0.01)
stoploss = sl/100
tp = input(20.0, "Target Profit %", minval = 0, maxval = 100, step = 0.01)
TargetProfit = tp/100
ld = input(2, "Stop Trading After This Many Losing Days", type=input.integer, minval=0, maxval=100, step=1)
// strategy.risk.max_cons_loss_days(count=ld)
ml = input(10, "Maximum % of Equity Lost to Halt Trading", type=input.integer, minval=1, maxval=100, step=1)
// strategy.risk.max_drawdown(value=ml, type=strategy.percent_of_equity)

// Price Movement Inputs
PriceInfo = input(true, "Number of bars to look back on to calculate price swings.")
lkbk = input(5,"Max Lookback Period")
high_source = input(high,"High Source")
low_source= input(low,"Low Source")

// Trend Inputs
TrendInfo = input(true, "Trend uses Fast and Slow EMA to prevent going the wrong direction")
length = input(14, "RSI Length", minval=1)
fastLength = input(12, minval=1, title="EMA Fast Length")
slowLength = input(26, minval=1, title="EMA Slow Length")

// Trigger Selection
usePrice = input(true, "Use Average Price Channel Only")
useMA = input(false, "Use Price Moving Average Only")
useFib = input(false, "Use Price Fibonacci Average Only")


// Trend Direction Calculation
rsi_ema = ema(rsi(close, length), length)
emaA = ema(rsi_ema, fastLength)                                     
emaFast = 2 * emaA - ema(emaA, fastLength)
emaB = ema(rsi_ema, slowLength)                                     
emaSlow = 2 * emaB - ema(emaB, slowLength) 


bullishRule =emaFast > emaSlow and rsi_ema >=rsi_ema[1]
bearishRule =emaFast < emaSlow and rsi_ema <= rsi_ema[1]


// Price Channel

lasthigh = highest(high_source, lkbk)
lastlow = lowest(low_source, lkbk)


// Fibonacci and Moving Average
MA1 = sma(close,5),HA1 = sma(high,5),LA1 = sma(low,5),
MA2 = sma(close,8),HA2 = sma(high,8),LA2 = sma(low,8),
MA3 = sma(close,13),HA3 = sma(high,13),LA3 = sma(low,13),
MA4 = sma(close,21),HA4 = sma(high,21),LA4 = sma(low,21),
MA5 = sma(close,34),HA5 = sma(high,34),LA5 = sma(low,34),
MA6 = sma(close,55),HA6 = sma(high,55),LA6 = sma(low,55),
MA7 = sma(close,89),HA7 = sma(high,89),LA7 = sma(low,89),

CMA = (MA1+MA2+MA3+MA4+MA5+MA6+MA7)/7,
HMA = (HA1+HA2+HA3+HA4+HA5+HA6+HA7)/7,
HMA2 = CMA + (atr(lkbk)*1.618)

LMA = (LA1+LA2+LA3+LA4+LA5+LA6+LA7)/7,
LMA2 = CMA - (atr(lkbk)*1.618)


plot(CMA, title="CMA", color=color.new(#00ffaa, 70), linewidth=2)
plot(HMA, title="HMA", color=color.maroon, linewidth=2)
plot(HMA2, title="HMA Fib", color=color.red, linewidth=3)
plot(LMA, title="LMA", color=color.green, linewidth=2)
plot(LMA2, title="LMA Fib", color=color.teal, linewidth=3)

    

// -------------------------------- Entry and Exit Logic ------------------------------------

// Entry Logic

Channel_Sell = close >= lasthigh[1] and bearishRule and window()
Channel_Buy =  close <= lastlow[1] and bullishRule and window()

MA_Sell = high>HMA and window()
MA_Buy = low<LMA and window()

Fib_Sell = high>HMA2 and window()
Fib_Buy = low<LMA2 and window()

qty = strategy.equity/close


// Strategy Entry and Exit with built in Risk Management
if(strategy.opentrades==0 and strat_val>-1)
    GoLong = usePrice ? Channel_Buy : useMA ? MA_Buy : useFib ? Fib_Buy : false
    if (GoLong)
        strategy.entry("LONG", strategy.long, qty)

if(strategy.opentrades==0 and strat_val<1)
    GoShort = usePrice ? Channel_Sell : useMA ? MA_Sell : useFib ? Fib_Sell : false
    if (GoShort) 
        strategy.entry("SHORT", strategy.short, qty)


longStopPrice  = strategy.position_avg_price * (1 - stoploss)
longTakePrice  = strategy.position_avg_price * (1 + TargetProfit)
shortStopPrice = strategy.position_avg_price * (1 + stoploss)
shortTakePrice = strategy.position_avg_price * (1 - TargetProfit)

if (strategy.position_size > 0)
    strategy.exit(id="Exit Long", from_entry = "LONG", stop = longStopPrice, limit = longTakePrice)
    
if (strategy.position_size < 0)
    strategy.exit(id="Exit Short", from_entry = "SHORT", stop = shortStopPrice, limit = shortTakePrice)

CloseShort= usePrice ? Channel_Buy : useMA ? MA_Buy : useFib ? Fib_Buy : false
CloseLong = usePrice ? Channel_Sell : useMA ? MA_Sell : useFib ? Fib_Sell : false

if(CloseLong and strategy.position_size > 0)
    strategy.close("LONG")
        

if(CloseShort and strategy.position_size < 0)
    strategy.close("SHORT")


더 많은