
이 전략은 3일 빠른 이동 평균, 10일 느린 이동 평균 및 16일 신호 평탄한 이동 평균을 사용하여 MACD 지표를 구성하고, RSI 지표와 거래량 특성을 보완하여, 다차원 K 선 특성을 설정하여, 과도한 마찰을 판단하고, 구간 흔들림 경향을 형성하여, 엔트리를 수익으로 되돌립니다.
코드는 주로 3일 빠른 이동 평균과 10일 느린 이동 평균을 사용하여 MACD 지표를 형성하고, 16일 신호 라인을 부드럽게 처리하여 표준 MACD 전략을 형성한다. 동시에 합성 거래량 분석 구매 및 판매량을 결합하여 힘 특성을 판단한다. 또한 RSI 지표를 도입하여 과매 과매매를 판단한다. 여러 지표 복합을 통해 시장 특성을 판단하고, 간격 진동 경향의 변화를 발견하고, 엔트리 신호를 구성한다.
구체적으로, MACD 선과 신호 선의 관계를 관찰하여 기울기의 변화를 판단하고, 상반되는 기회를 찾습니다. 동시에, 거래량의 매매량 변화도 상반되는 힘을 반영합니다. RSI 지표의 변화와 결합하여 과매매 과매매 현상을 판단하고, 이러한 지표를 종합하여, 우리는 상황의 지역 특성을 판단할 수 있습니다.
이 정책은 총 3개의 엔트리 신호를 설정합니다.
거래량이 구매량 이득이 없을 때, RSI가 41보다 낮고 상승할 때, MACD 신호가 명백하게 오차가 없을 때, 더 많이 한다.
거래량이 구매량 우위를 차지할 때, RSI가 45-55 사이로 올라가면, MACD와 신호선이 함께 올라가면, 더 많이 한다.
MACD가 설정된 값보다 높을 때, 공백을 다.
이 세 가지 상황 모두 단기간에 지역적인 흔들림과 한방향의 과도한 확장을 반영하고 있으며, 따라서 반전할 수 있는 좋은 시점으로 판단되어 반전 조치를 취한다.
Exit은 스톱 로즈와 스톱 으로 설정되어 있으며, 컨트롤을 되돌리고 수익을 내기 위해 설정되어 있습니다.
이 전략은 여러 지표와 결합하여 흔들림 영역과 과매매 현상을 판단하여 수익을 창출합니다. 거래량 분석을 더 깊이 적용하여 운영 근거를 증가시킵니다.
특히, 장점은 다음과 같습니다:
MACD는 가격과 거래량의 관계를 판단하는 수량 테스트 지표로서 단일 기술 측면 분석의 주관성을 피합니다.
항공기 수를 판단하고, 엔트리 확인이 추가됩니다.
RSI는 과매매를 판단하여 반전을 찾는데 도움을 줍니다.
손실을 막는 설정은 과도한 손실을 방지하고 수익의 일부를 잠금합니다.
이 전략의 통합적인 다중 지표 사용이 승률을 높이는 데에도 불구하고, 모든 전략에는 반드시 약간의 위험이 있습니다. 주요 문제는 다음과 같습니다:
지표가 잘못된 신호를 내보낼 확률, 예를 들어 반전 후 계속되는 경우;
상쇄금지장치가 잘못 설정되어 있고, 회수량이 너무 커서 수익이 잘 고정되지 않을 수 있습니다.
매개 변수 설정은 평균선 매개 변수 조합, RSI 주기, 스톱 스 배수 등과 같은 추가 테스트 최적화가 필요할 수 있습니다.
이러한 위험은 추가적인 최적화를 통해 감소시킬 수 있다. 구체적인 방법은 다음 부분에서 설명될 것이다.
이 전략에는 더 많은 최적화가 가능하며, 다음과 같은 주요 방향에 초점을 맞추고 있습니다.
다양한 평행선 변수 설정을 테스트하여 최적의 조합을 찾습니다.
RSI 파라미터 설정을 테스트하여 오버 바이 오버 소드를 판단하는 데 더 적합한 주기를 결정합니다.
최대 인출과 수익 잠금 사이의 균형을 맞추기 위해 스톱 로즈 배수를 최적화하십시오.
기계학습 모델을 도입하여 더 많은 데이터를 활용하여 훈련하고, 잘못된 판단의 가능성을 줄이고, 승률을 높입니다.
이러한 최적화 수단은 보다 체계적인 피드백을 통해 실현될 수 있다. 변수 공간 테스트의 확장과 샘플의 증가에 따라 전략의 성공률과 수익 지표도 계속 향상될 것이다.
이 전략은 MACD, RSI, 거래량 3대 부류의 지표를 종합적으로 사용하여 시상구간의 흔들림 특성을 판단하고, 반전점에서 엔트리를 설정하여 반발 증가를 활용하는 것을 목표로 한다. 전략의 아이디어는 명확하고, 추세와 반전을 병행하며, 최적화 후 좋은 수익 공간을 가지고 있다. 매개 변수 조정 및 모델 도입을 통해 효율적이고 안정적인 계량화 전략이 될 수 있을 것으로 예상된다.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("3 1 Oscillator Profile Flagging", shorttitle="3 1 Oscillator Profile Flagging", overlay=false)
signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.7)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=6)
takeProfit = input( title="Take Profit", defval=2)
stopLoss = input( title="Stop Loss", defval=0.7)
fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)
buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
plot(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
plot(macdSlope, color=color.green, title="MACD Slope")
plot(signalSlope, color=color.red, title="Signal Slope")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]
plot(rsiSlope, color=color.black, title="RSI Slope")
getRSISlopeChange(lookBack) =>
j = 0
for i = 0 to lookBack
if ( rsi[i] - rsi[ i + 1 ] ) > -5
j += 1
j
getBuyerVolBias(lookBack) =>
j = 0
for i = 1 to lookBack
if buyVolume[i] > sellVolume[i]
j += 1
j
getSellerVolBias(lookBack) =>
j = 0
for i = 1 to lookBack
if sellVolume[i] > buyVolume[i]
j += 1
j
getVolBias(lookBack) =>
float b = 0.0
float s = 0.0
for i = 1 to lookBack
b += buyVolume[i]
s += sellVolume[i]
b > s
getSignalBuyerBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] > signalBiasValue
j += 1
j
getSignalSellerBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] < ( 0.0 - signalBiasValue )
j += 1
j
getSignalNoBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] < signalBiasValue and signal[i] > ( 0.0 - signalBiasValue )
j += 1
j
getPriceRising(lookBack) =>
j = 0
for i = 1 to lookBack
if close[i] > close[i + 1]
j += 1
j
getPriceFalling(lookBack) =>
j = 0
for i = 1 to lookBack
if close[i] < close[i + 1]
j += 1
j
getRangeNarrowing(lookBack) =>
j = 0
for i = 1 to lookBack
if intrabarRange[i] < intrabarRange[i + 1]
j+= 1
j
getRangeBroadening(lookBack) =>
j = 0
for i = 1 to lookBack
if intrabarRange[i] > intrabarRange[i + 1]
j+= 1
j
bool isNegativeSignalReversal = signalSlope < 0.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0
bool isPositiveSignalReversal = signalSlope > 0.0 and signalSlope[1] < 0.0
bool isPositiveMacdReversal = macdSlope > 0.0 and macdSlope[1] < 0.0
bool hasBearInversion = signalSlope > 0.0 and macdSlope < 0.0
bool hasBullInversion = signalSlope < 0.0 and macdSlope > 0.0
bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0.0 - signalBiasValue )
bool hasSignalBuyerBias = hasSignalBias and signal > 0.0
bool hasSignalSellerBias = hasSignalBias and signal < 0.0
bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.0 - macdBiasValue )
bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)
bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )
// 202.30 Profit 55.29% 5m
if ( ( getVolBias(longLookBack) == false ) and rsi <= 41 and math.abs(rsi - rsi[shortLookBack]) > 1 and hasNoSignalBias and rsiSlope > 1.5 and close > open)
strategy.entry("5C1", strategy.long, qty=1)
strategy.exit("TPS", "5C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)
// 171.70 Profit 50.22% 5m
if ( getVolBias(longLookBack) == true and rsi > 45 and rsi < 55 and macdSlope > 0 and signalSlope > 0)
strategy.entry("5C2", strategy.long, qty=1)
strategy.exit("TPS", "5C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)
// 309.50 Profit 30.8% 5m 2 tp .7 sl 289 trades
if ( macd > macdBiasValue and macdSlope > 0)
strategy.entry("5P1", strategy.short, qty=1)
strategy.exit("TPS", "5P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)