Эта стратегия рассчитывает различия давления покупки и продажи в объеме транзакций в разных временных окнах в сочетании с сигналами MACD для разработки стратегии обратного тренда.
Основная логика этой стратегии основана на следующих моментах:
Вычислить давление на покупку и давление на продажу объема транзакций в разных временных окнах (короткие и длинные окна).
Используйте значение разницы 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)