
이 전략은 트렌드 반전 거래 전략을 설계합니다. 이 전략은 트렌드 반전의 신호로 트렌드 양의 변동을 주로 이용합니다. 트렌드 반전의 신호를 판단하고 MACD의 다공간 신호를 통해 검증하여 반전 기회를 잡습니다.
이 전략의 핵심 논리는 다음과 같습니다.
서로 다른 시간 창 (long/short window) 의 거래량 구매 압력과 판매 압력을 계산한다. 구매/판매 압력의 차이로 미래 트렌드 방향을 판단한다.
MACD의 차이를 이용하여 ((MACD선과 신호선의 격차) 다공간 상태를 판단한다. 교류량을 합성해 거래 압력 신호를 통해 트렌드 반전을 검증한다.
거래량 구매 압력 역동성이 커지고 MACD 라인이 통과되면, 시장이 공백으로 전환되는 경향이 나타날 수 있다고 생각된다.
거래량이 압력 변동이 증가하고 MACD 라인이 통과되면, 거래가 다중 회전으로 인한 추세 반전이 발생할 수 있다고 생각합니다.
역전 신호에 도달한 후, 스톱 스톱 손실 전략을 사용하여 위험을 제어하십시오.
이 전략에는 다음과 같은 장점이 있습니다.
거래량의 다공간 차이를 사용하여 트렌드 반전점을 판단하고, 단순히 평평선과 같은 트렌드 판단 지표에 의존하여 거래량의 역할을 무시하는 것을 피한다.
MACD 지표의 다공영 신호 검증 반전과 결합하여 판단의 정확도를 높일 수 있다.
긴 짧은 시간 창을 사용하여 트랜지션량의 이진 방향을 판단하여 역전 신호를 더 신뢰할 수 있다.
반전 전략의 평균 수익률이 높습니다.
이 전략에는 다음과 같은 위험도 있습니다.
거래량과 MACD 신호는 모두 잘못된 신호를 발산할 수 있으며, 이는 역으로 판단 오류의 위험을 초래한다.
반전 신호가 발신된 후, 시장이 다시 조정될 수 있으며, 직접적으로 반전할 수 없는 위험이 있다.
정지지점은 잘못 설정되어 손실이 커질 위험이 있습니다.
철수율이 높기 때문에 안정적인 수익을 추구하는 투자자에게는 적합하지 않습니다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
더 짧은 시간 창의 간격을 최적화하여 회전 판단을 더 정확하게 합니다.
MACD 변수를 최적화하여 다공이 판단의 정확성을 향상시킨다.
스탠드 스탠드 손실 알고리즘을 최적화하여 손실 위험을 낮추십시오.
더 많은 비동기적 판단 지표를 추가하고, 역전 성공률을 높여라.
포지션 제어 및 자금 관리 모듈을 추가합니다.
이 전략은 전반적으로 전형적인 트렌드 역전 알고리즘 거래 전략이다. 그것은 주로 거래량 이진동이 MACD 신호와 확증되는 것을 의존하고, 판단하고 가격의 다목에서 공목으로 이동하거나 공목에서 다목으로 이동하는 역전 기회를 포착한다. 이 전략은 판단 정확도가 높고 수익률이 좋은 장점이 있지만, 또한 위험이 있다. 매개 변수 최적화 및 기능 확장으로 이 전략의 성능을 더욱 우수하게 만들 수 있다.
/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("3 10 Oscillator Profile Flagging", shorttitle="3 10 Oscillator Profile Flagging", overlay=false)
signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)
takeProfit = input( title="Take Profit", defval=0.75)
stopLoss = input( title="Stop Loss", defval=0.5)
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")
intrabarRange = high - low
getLookBackSlope(lookBack) => signal - signal[lookBack]
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
float s = 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 - signalBiasValue )
j += 1
j
getSignalNoBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] < signalBiasValue and signal[i] > ( 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 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0
bool isPositiveSignalReversal = signalSlope > 0 and signalSlope[1] < 0
bool isPositiveMacdReversal = macdSlope > 0 and macdSlope[1] < 0
bool hasBearInversion = signalSlope > 0 and macdSlope < 0
bool hasBullInversion = signalSlope < 0 and macdSlope > 0
bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0 - signalBiasValue )
bool hasSignalBuyerBias = hasSignalBias and signal > 0
bool hasSignalSellerBias = hasSignalBias and signal < 0
bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 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 )
// 7.48 Profit 52.5%
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
strategy.entry("Short1", strategy.short, qty=10)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)
// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
strategy.entry("Long1", strategy.long, qty=10)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)