
다인자 자기 적응 동력 추적 전략은 여러 기술 지표의 통합을 통해 시장 추세와 핵심 지원 저항 지점을 식별하여 암호화폐와 같은 고 변동성 자산에 대한 자동 거래를 구현합니다. 이 전략은 RSI, MACD, Stochastic과 같은 지표를 종합적으로 사용하여 구매 시기를 판단하며 가격 변화의 비율과 결합하여 더 정확한 형태를 식별합니다.
다인자 자기 적응 동량 추적 전략의 핵심은 여러 가지 기술 지표의 통합 사용에 있다. 이 전략은 주로 다음과 같은 몇 가지 구성 요소를 사용합니다:
RSI 지표는 과매매를 판단한다. 다른 파라미터와 결합하여 일반 RSI 신호 또는 개량된 코너 RSI 신호를 식별하여 반전 기회가 있는지 판단 할 수 있다.
MACD 지표는 트렌드 방향을 판단하는데 도움을 줍니다. MACD가 신호선을 넘거나 넘을 때 구매 및 판매 신호를 생성합니다.
스토카스틱 지표는 오버 바이 오버 셀 영역을 식별한다. K선과 D선의 골드 포크 데드 포크 조합 신호가 반전되는지 판단한다.
가격 변화 비율은 진정한 돌파가 있는지 검사한다. 특정 주기 동안의 최고 가격, 최저 가격, 종결 가격 등의 변화 비율을 계산하여 진정한 돌파가 있는지 판단한다.
EMA 지표는 큰 레벨의 상공을 판단한다. 빠른 선에서 느린 선을 가로질러 보이스 신호를 주고, 아래로 가로질러 보이스 신호를 준다.
이 전략은 시장의 빈 상태에 따라 더 많은 코카이드를 선택하고 입위 후 스톱로스 스톱을 설정하여 위험을 효과적으로 제어한다. 반전 신호가 발생했을 때 평지 포지션을 선택하여 퇴출한다. 전체 의사 결정 과정은 여러 요소의 판단을 충분히 결합하여 더 정확한 판단을 가능하게 한다.
이 전략에는 다음과 같은 장점이 있습니다.
다중 인자 드라이브는 판단의 장점을 가지고 있다. 단일 지표에 비해, 다중 지표 조합은 서로를 검증할 수 있어 결과를 더 정확하고 신뢰할 수 있어 불필요한 거래 비용을 절감한다.
조건은 엄격하게 잘못된 거래를 피한다. 전략은 구매 및 판매 조건에 대한 엄격한 요구 사항을 설정하고, 여러 지표가 동시에 신호를 방출해야 함으로써 많은 소음을 필터링하여 잘못된 거래가 발생하지 않도록합니다.
자기 적응 초변수 (自适应超参数) 는 인적 개입을 줄인다. 정책의 내장 동적으로 지표 변수를 계산하는 능력, 인적 선택 초변수 (超参数) 의 주관성을 피하고, 따라서 정책의 파라미터 (Parameters) 를 더 과학적으로 객관적으로 만든다.
스톱로스 메커니즘 제어 위험. 전략은 포지션을 개시한 후 실시간으로 계산하고 스톱로스 위치를 매핑하여 단일 손실을 효과적으로 제어하고 포지션 폭파의 발생을 방지할 수 있다.
이 전략에는 몇 가지 위험도 있습니다.
지표 오류가 신호를 방출할 확률. 다중 지표 검증은 오류의 비율을 크게 줄일 수 있지만, 여전히 발생할 가능성이 있다. 이것은 불필요한 손실을 초래할 수 있다.
막힘이 뚫릴 위험이 있다. 극단적인 상황에서는 가격이 급격히 떨어질 수 있으며, 원래의 막힘이 쉽게 뚫려 큰 손실을 초래한다.
매개 변수 최적화로 인한 과도한 최적화. 동적 매개 변수는 인위적인 선택으로 인한 주관성을 피하지만, 매개 변수의 과도한 최적화로 인해 일반화 능력을 잃게 할 수 있습니다.
대응방법:
다인자 적응 동량 추적 전략에는 다음과 같은 몇 가지 최적화 가능한 차원이 있습니다.
판단 요소의 수를 늘리십시오. 변동률, 거래량과 같은 다양한 유형의 지표 신호 판단과 결합하여 보조 판단하십시오.
스톱 메커니즘을 최적화하는 알고리즘. 스톱 트래킹, 스톱 진동 등의 더 고급 스톱 알고리즘을 도입하여 스톱이 뚫릴 확률을 더욱 낮출 수 있다.
기계 학습 모델을 도입한다. RNN, LSTM 등의 모델을 사용하여 역사적 데이터를 모델링하여 구매 결정에 도움을 준다.
전략 통합. 여러 가지 세부 전략을 채택하고, 통합 학습 방법을 사용하여 통합하면 더 안정적인 통합 성과를 얻을 수 있습니다.
다인자 자기 적응 동력 추적 전략은 여러 가지 기술 지표를 사용하여 거래 시점을 식별합니다. 단일 지표에 비해 전략 판단은 더 정확하며, 내장 된 매개 변수는 자기 적응 및 스톱 메커니즘이 위험을 제어합니다. 다음 단계는 더 많은 보조 판단 인자, 고급 스톱 알고리즘 및 기계 학습과 같은 방법을 도입하여 전략의 효과를 더욱 강화 할 수 있습니다.
/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-11 00:00:00
period: 3m
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='Ain1 No Label',title='All in One Strategy no RSI Label', 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)
kcolor = color.new(#0094FF, 60)
dcolor = color.new(#FF6A00, 60)
// ----------------- Strategy Inputs -------------------------------------------------------------
//Backtest dates with auto finish date of today
start = input(defval = timestamp("01 April 2021 00:00 -0500"), title = "Start Time", type = input.time)
finish = input(defval = timestamp("31 December 2021 00:00 -0600"), title = "End Time", type = input.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
useXRSI = input(false, "Use RSI crossing back, select only one strategy")
useCRSI = input(false, "Use Tweaked Connors RSI, select only one")
RSIInfo = input(true, "These are the RSI Strategy Inputs, RSI Length applies to MACD, set OB and OS to 45 for using Stoch and EMA strategies.")
length = input(14, "RSI Length", minval=1)
overbought= input(62, "Overbought")
oversold= input(35, "Oversold")
cl1 = input(3, "Connor's MA Length 1", minval=1, step=1)
cl2 = input(20, "Connor's MA Lenght 2", minval=1, step=1)
cl3 = input(50, "Connor's MA Lenght 3", minval=1, step=1)
// MACD and EMA Inputs
useMACD = input(false, "Use MACD Only, select only one strategy")
useEMA = input(false, "Use EMA Only, select only one strategy (EMA uses Stochastic inputs too)")
MACDInfo=input(true, "These are the MACD strategy variables")
fastLength = input(5, minval=1, title="EMA Fast Length")
slowLength = input(10, minval=1, title="EMA Slow Length")
ob_min = input(52, "Overbought Lookback Minimum Value", minval=0, maxval=200)
ob_lb = input(25, "Overbought Lookback Bars", minval=0, maxval=100)
os_min = input(50, "Oversold Lookback Minimum Value", minval=0, maxval=200)
os_lb = input(35, "Oversold Lookback Bars", minval=0, maxval=100)
source = input(title="Source", type=input.source, defval=close)
RSI = rsi(source, length)
// Price Movement Inputs
PriceInfo = input(true, "Price Change Percentage Cross Check Inputs for all Strategies, added logic to avoid early sell")
lkbk = input(5,"Max Lookback Period")
// EMA and SMA Background Inputs
useStoch = input(false, "Use Stochastic Strategy, choose only one")
StochInfo = input(true, "Stochastic Strategy Inputs")
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
k_mode = input("SMA", "K Mode", options=["SMA", "EMA", "WMA"])
high_source = input(high,"High Source")
low_source= input(low,"Low Source")
HTF = input("","Curernt or Higher time frame only", type=input.resolution)
// Selections to show or hide the overlays
showZones = input(true, title="Show Bullish/Bearish Zones")
showStoch = input(true, title="Show Stochastic Overlays")
showRSIBS = input(true, title="Show RSI Buy Sell Zones")
showMACD = input(true, title="Show MACD")
color_bars=input(true, "Color Bars")
// ------------------ Dynamic RSI Calculation ----------------------------------------
AvgHigh(src,cnt,val) =>
total = 0.0
count = 0
for i = 0 to cnt
if src[i] > val
count := count + 1
total := total + src[i]
round(total / count)
RSI_high = AvgHigh(RSI, ob_lb, ob_min)
AvgLow(src,cnt,val) =>
total = 0.0
count = 0
for i = 0 to cnt
if src[i] < val
count := count + 1
total := total + src[i]
round(total / count)
RSI_low = AvgLow(RSI, os_lb, os_min)
// ------------------ Price Percentage Change Calculation -----------------------------------------
perc_change(lkbk) =>
overall_change = ((close[0] - open[lkbk]) / open[lkbk]) * 100
highest_high = 0.0
lowest_low = 0.0
for i = lkbk to 0
highest_high := i == lkbk ? high : high[i] > high[(i + 1)] ? high[i] : highest_high[1]
lowest_low := i == lkbk ? low : low[i] < low[(i + 1)] ? low[i] : lowest_low[1]
start_to_high = ((highest_high - open[lkbk]) / open[lkbk]) * 100
start_to_low = ((lowest_low - open[lkbk]) / open[lkbk]) * 100
previous_to_high = ((highest_high - open[1])/open[1])*100
previous_to_low = ((lowest_low-open[1])/open[1])*100
previous_bar = ((close[1]-open[1])/open[1])*100
[overall_change, start_to_high, start_to_low, previous_to_high, previous_to_low, previous_bar]
// Call the function
[overall, to_high, to_low, last_high, last_low, last_bar] = perc_change(lkbk)
// Plot the function
//plot(overall*50, color=color.white, title='Overall Percentage Change', linewidth=3)
//plot(to_high*50, color=color.green,title='Percentage Change from Start to High', linewidth=2)
//plot(to_low*50, color=color.red, title='Percentage Change from Start to Low', linewidth=2)
//plot(last_high*100, color=color.teal, title="Previous to High", linewidth=2)
//plot(last_low*100, color=color.maroon, title="Previous to Close", linewidth=2)
//plot(last_bar*100, color=color.orange, title="Previous Bar", linewidth=2)
//hline(0, title='Center Line', color=color.orange, linewidth=2)
true_dip = overall < 0 and to_high > 0 and to_low < 0 and last_high > 0 and last_low < 0 and last_bar < 0
true_peak = overall > 0 and to_high > 0 and to_low > 0 and last_high > 0 and last_low < 0 and last_bar > 0
alertcondition(true_dip, title='True Dip', message='Dip')
alertcondition(true_peak, title='True Peak', message='Peak')
// ------------------ Background Colors based on EMA Indicators -----------------------------------
// Uses standard lengths of 9 and 21, if you want control delete the constant definition and uncomment the inputs
haClose(gap) => (open[gap] + high[gap] + low[gap] + close[gap]) / 4
rsi_ema = rsi(haClose(0), length)
v2 = ema(rsi_ema, length)
v3 = 2 * v2 - ema(v2, length)
emaA = ema(rsi_ema, fastLength)
emaFast = 2 * emaA - ema(emaA, fastLength)
emaB = ema(rsi_ema, slowLength)
emaSlow = 2 * emaB - ema(emaB, slowLength)
//plot(rsi_ema, color=color.white, title='RSI EMA', linewidth=3)
//plot(v2, color=color.green,title='v2', linewidth=2)
//plot(v3, color=color.red, title='v3', linewidth=2)
//plot(emaFast, color=color.teal, title="EMA Fast", linewidth=2)
//plot(emaSlow, color=color.maroon, title="EMA Slow", linewidth=2)
EMABuy = crossunder(emaFast, v2) and window()
EMASell = crossover(emaFast, emaSlow) and window()
alertcondition(EMABuy, title='EMA Buy', message='EMA Buy Condition')
alertcondition(EMASell, title='EMA Sell', message='EMA Sell Condition')
// bullish signal rule:
bullishRule =emaFast > emaSlow
// bearish signal rule:
bearishRule =emaFast < emaSlow
// current trading State
ruleState = 0
ruleState := bullishRule ? 1 : bearishRule ? -1 : nz(ruleState[1])
ruleColor = ruleState==1 ? color.new(color.blue, 90) : ruleState == -1 ? color.new(color.red, 90) : ruleState == 0 ? color.new(color.gray, 90) : na
bgcolor(showZones ? ruleColor : na, title="Bullish/Bearish Zones")
// ------------------ Stochastic Indicator Overlay -----------------------------------------------
// Calculation
// Use highest highs and lowest lows
h_high = highest(high_source ,lkbk)
l_low = lowest(low_source ,lkbk)
stoch = stoch(RSI, RSI_high, RSI_low, length)
k =
k_mode=="EMA" ? ema(stoch, smoothK) :
k_mode=="WMA" ? wma(stoch, smoothK) :
sma(stoch, smoothK)
d = sma(k, smoothD)
k_c = change(k)
d_c = change(d)
kd = k - d
// Plot
signalColor = k>oversold and d<overbought and k>d and k_c>0 and d_c>0 ? kcolor :
k<overbought and d>oversold and k<d and k_c<0 and d_c<0 ? dcolor : na
kp = plot(showStoch ? k : na, "K", color=kcolor)
dp = plot(showStoch ? d : na, "D", color=dcolor)
fill(kp, dp, color = signalColor, title="K-D")
signalUp = showStoch ? not na(signalColor) and kd>0 : na
signalDown = showStoch ? not na(signalColor) and kd<0 : na
//plot(signalUp ? kd : na, "Signal Up", color=kcolor, transp=90, style=plot.style_columns)
//plot(signalDown ? (kd+100) : na , "Signal Down", color=dcolor, transp=90, style=plot.style_columns, histbase=100)
//StochBuy = crossover(k, d) and kd>0 and to_low<0 and window()
//StochSell = crossunder(k,d) and kd<0 and to_high>0 and window()
StochBuy = crossover(k, d) and window()
StochSell = crossunder(k, d) and window()
alertcondition(StochBuy, title='Stoch Buy', message='K Crossing D')
alertcondition(StochSell, title='Stoch Sell', message='D Crossing K')
// -------------- Add Price Movement -------------------------
// Calculations
h1 = vwma(high, length)
l1 = vwma(low, length)
hp = h_high[1]
lp = l_low[1]
// Plot
var plot_color=#353535
var sig = 0
if (h1 >hp)
sig:=1
plot_color:=color.lime
else if (l1 <lp)
sig:=-1
plot_color:=color.maroon
//plot(1,title = "Price Movement Bars", style=plot.style_columns,color=plot_color)
//plot(sig,title="Signal 1 or -1",display=display.none)
// --------------------------------------- RSI Plot ----------------------------------------------
// Plot Oversold and Overbought Lines
over = hline(oversold, title="Oversold", color=color.green)
under = hline(overbought, title="Overbought", color=color.red)
fillcolor = color.new(#9915FF, 90)
fill(over, under, fillcolor, title="Band Background")
// Show RSI and EMA crosses with arrows and RSI Color (tweaked Connors RSI)
// Improves strategy setting ease by showing where EMA 5 crosses EMA 10 from above to confirm overbought conditions or trend reversals
// This shows where you should enter shorts or exit longs
// Tweaked Connors RSI Calculation
connor_ob = overbought
connor_os = oversold
ma1 = sma(close,cl1)
ma2 = sma(close, cl2)
ma3 = sma(close, cl3)
// Buy Sell Zones using tweaked Connors RSI (RSI values of 80 and 20 for Crypto as well as ma3, ma20, and ma50 are the tweaks)
RSI_SELL = ma1 > ma2 and open > ma3 and RSI >= connor_ob and true_peak and window()
RSI_BUY = ma2 < ma3 and ma3 > close and RSI <= connor_os and true_dip and window()
alertcondition(RSI_BUY, title='Connors Buy', message='Connors RSI Buy')
alertcondition(RSI_SELL, title='Connors Sell', message='Connors RSI Sell')
// Color Definition
col = useCRSI ? (close > ma2 and close < ma3 and RSI <= connor_os ? color.lime : close < ma2 and close > ma3 and RSI <= connor_ob ? color.red : color.yellow ) : color.yellow
// Plot colored RSI Line
plot(RSI, title="RSI", linewidth=3, color=col)
//------------------- MACD Strategy -------------------------------------------------
[macdLine, signalLine, _] = macd(close, fastLength, slowLength, length)
bartrendcolor = macdLine > signalLine and k > 50 and RSI > 50 ? color.teal : macdLine < signalLine and k < 50 and RSI < 50 ? color.maroon : macdLine < signalLine ? color.yellow : color.gray
barcolor(color = color_bars ? bartrendcolor : na)
MACDBuy = macdLine>signalLine and RSI<RSI_low and overall<0 and window()
MACDSell = macdLine<signalLine and RSI>RSI_high and overall>0 and window()
//plotshape(showMACD ? MACDBuy: na, title = "MACD Buy", style = shape.arrowup, text = "MACD Buy", color=color.green, textcolor=color.green, size=size.small)
//plotshape(showMACD ? MACDSell: na, title = "MACD Sell", style = shape.arrowdown, text = "MACD Sell", color=color.red, textcolor=color.red, size=size.small)
MACColor = MACDBuy ? color.new(color.teal, 50) : MACDSell ? color.new(color.maroon, 50) : na
bgcolor(showMACD ? MACColor : na, title ="MACD Signals")
// -------------------------------- Entry and Exit Logic ------------------------------------
// Entry Logic
XRSI_OB = crossunder(RSI, overbought) and overall<0 and window()
RSI_OB = RSI>overbought and true_peak and window()
XRSI_OS = crossover(RSI, oversold) and overall>0 and window()
RSI_OS = RSI<oversold and true_dip and window()
alertcondition(XRSI_OB, title='Reverse RSI Sell', message='RSI Crossing back under OB')
alertcondition(XRSI_OS, title='Reverse RSI Buy', message='RSI Crossing back over OS')
alertcondition(RSI_OS, title='RSI Buy', message='RSI Crossover OS')
alertcondition(RSI_SELL, title='RSI Sell', message='RSI Crossunder OB')
// Strategy Entry and Exit with built in Risk Management
GoLong = strategy.position_size==0 and strat_val > -1 and rsi_ema > RSI and k < d ? (useXRSI ? XRSI_OS : useMACD ? MACDBuy : useCRSI ? RSI_BUY : useStoch ? StochBuy : RSI_OS) : false
GoShort = strategy.position_size==0 and strat_val < 1 and rsi_ema < RSI and d < k ? (useXRSI ? XRSI_OB : useMACD ? MACDSell : useCRSI ? RSI_SELL : useStoch ? StochSell : RSI_OB) : false
if (GoLong)
strategy.entry("LONG", strategy.long)
if (GoShort)
strategy.entry("SHORT", strategy.short)
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)
//plot(series=(strategy.position_size > 0) ? longTakePrice : na, color=color.green, style=plot.style_circles, linewidth=3, title="Long Take Profit")
//plot(series=(strategy.position_size < 0) ? shortTakePrice : na, color=color.green, style=plot.style_circles, linewidth=3, title="Short Take Profit")
//plot(series=(strategy.position_size > 0) ? longStopPrice : na, color=color.red, style=plot.style_cross, linewidth=2, title="Long Stop Loss")
//plot(series=(strategy.position_size < 0) ? shortStopPrice : na, color=color.red, style=plot.style_cross, linewidth=2, title="Short Stop Loss")
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)
CloseLong = strat_val > -1 and strategy.position_size > 0 and rsi_ema > RSI and d > k ? (useXRSI ? XRSI_OB : useMACD ? MACDSell : useCRSI ? RSI_SELL : RSI_OB) : false
if(CloseLong)
strategy.close("LONG")
CloseShort = strat_val < 1 and strategy.position_size < 0 and rsi_ema < RSI and k > d ? (useXRSI ? XRSI_OS : useMACD ? MACDBuy : useCRSI ? RSI_BUY : RSI_OS) : false
if(CloseShort)
strategy.close("SHORT")