В процессе загрузки ресурсов... загрузка...

Обратная тенденция с использованием стратегии торговли волатильностью внутрилопа

Автор:Чао Чжан, Дата: 2024-02-26 17:15:54
Тэги:

img

Обзор

Эта стратегия рассчитывает различия давления покупки и продажи в объеме транзакций в разных временных окнах в сочетании с сигналами MACD для разработки стратегии обратного тренда.

Принципы стратегии

Основная логика этой стратегии основана на следующих моментах:

  1. Вычислить давление на покупку и давление на продажу объема транзакций в разных временных окнах (короткие и длинные окна).

  2. Используйте значение разницы MACD (разница между линией MACD и линией сигнала) для определения длинного и короткого состояния.

  3. Когда аномалия покупательного давления объема транзакций усиливается и линия MACD пересекается, определяется, что на рынке может произойти изменение тренда от продажи к покупке.

  4. Когда аномалия продажного давления объема транзакций усиливается и линия MACD пересекается, определяется, что на рынке может произойти изменение тренда от покупки к продаже.

  5. После ввода сигнала отмены, используйте стратегии получения прибыли и остановки убытков для контроля рисков.

Анализ преимуществ

Преимущества этой стратегии включают:

  1. Использование длинных/коротких различий в объеме транзакций для определения точек переворота тенденции позволяет избежать полагаться исключительно на индикаторы определения тенденции, такие как скользящие средние, пренебрегая ролью объема транзакций.

  2. Комбинирование сигналов MACD для проверки обратных движений может улучшить точность суждения.

  3. Использование длинных и коротких временных окон для определения аномалий в объеме транзакций делает обратные сигналы более надежными.

  4. Стратегии реверсии, как правило, имеют более высокие средние показатели прибыли.

Анализ рисков

Риски этой стратегии включают:

  1. Объем транзакций и сигналы MACD могут давать ложные сигналы, что приводит к ошибочным суждениям об обратном движении.

  2. После того, как сигналы об обратном движении запускаются, рынок может снова приспособиться и не сразу же напрямую измениться.

  3. Неправильное установление сбора прибыли и стоп-лосса может привести к увеличению потерь.

  4. Более высокие доходы, не подходят для инвесторов, стремящихся к стабильной доходности.

Руководство по оптимизации

Оптимизация этой стратегии включает:

  1. Оптимизируйте длинные и короткие временные окна, чтобы сделать более точные суждения об изменении.

  2. Оптимизировать параметры MACD для улучшения точности длинного / короткого.

  3. Оптимизировать алгоритмы получения прибыли и остановки убытков для снижения рисков потерь.

  4. Добавьте больше показателей аномальной оценки, чтобы улучшить уровень успеха.

  5. Добавить модули размещения позиций и управления деньгами.

Заключение

В целом, это типичная алгоритмическая стратегия торговли с изменением тренда. Она в основном опирается на усиления аномалий объема транзакций и проверки сигналов 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)

Больше