Измененная стратегия количественной торговли OBV и MACD

Автор:Чао Чжан, Дата: 2023-11-15 17:58:42
Тэги:

img

Обзор

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

Логика стратегии

  1. Для определения рыночной тенденции вычислить простую скользящую среднюю величину (SMA).

  2. Он изменяет расчет OBV на основе ценовой близости и предыдущей ценовой близости, чтобы сделать OBV более чувствительным.

  3. Расчет MACD на измененной OBV. MACD состоит из быстрой линии, медленной линии и гистограммы для определения изменения импульса объема.

  4. Когда MACD пересекает золото и поднимается, генерируется сигнал покупки.

  5. Когда MACD пересекается и падает, запускается сигнал продажи.

  6. Проверяйте SMA, чтобы избежать ненужных сделок во время без тренда на рынке.

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

  1. Измененная OBV более чувствительна к ранним изменениям объема.

  2. MACD четко показывает изменение динамики объема и ключевые уровни.

  3. Объем и цена сочетания сигналов повышают точность.

  4. SMA фильтрует ложный сигнал, определяя тенденцию рынка.

  5. Ясная логика стратегии и большое пространство для оптимизации.

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

  1. Измененная OBV может генерировать ложные сигналы, нужды фильтруются другими показателями.

  2. Неправильное установление параметров MACD может привести к пропуску сделок или ложным сигналам.

  3. Обратите внимание на особенности акций, чтобы избежать потерь.

  4. Следите за состоянием рынка, так как стратегия может не работать для особых сценариев.

  5. Риск перегрузки с помощью обратного теста может привести к ухудшению результатов торговли в режиме реального времени.

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

  1. Испытать различные комбинации периодов SMA для оптимизации определения тенденции рынка.

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

  3. Добавьте другие индикаторы в качестве фильтра, такие как KDJ, RSI и т.д.

  4. Добавить стоп-лосс к лимиту по сделке.

  5. Оптимизировать управление деньгами для повышения общей прибыльности.

  6. Различия в параметрах испытаний между запасами.

Заключение

Стратегия сочетает в себе измененные OBV и MACD для достижения синтеза объема и цены. Она может зафиксировать изменение импульса объема и генерировать торговые сигналы. По сравнению с использованием OBV или MACD в одиночку, эта стратегия обеспечивает более надежные торговые возможности. Однако существует риск ложных сигналов и необходимы дальнейшие оптимизации показателей и параметров, а также управление деньгами для получения устойчивой прибыли в живой торговле. В целом, стратегия имеет четкую логику и стоит тестировать и оптимизировать для изучения своего потенциала.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
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/
// © stocktechbot

//@version=5
strategy("Altered OBV On MACD", overlay=true, margin_long=100, margin_short=100)

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © stocktechbot
//@version=5
//SMA Tredline
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
outthree = ta.sma(close, 9)
//sma plot
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
plot(out, color=color.blue, title="MA200", offset=offset)
plot(outf, color=color.maroon, title="MA50", offset=offset)
plot(outn, color=color.orange, title="MA90", offset=offset)
plot(outt, color=color.olive, title="MA21", offset=offset)
plot(outthree, color=color.fuchsia, title="MA9", offset=offset)

fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
chng = 0
obv = ta.cum(math.sign(ta.change(close)) * volume)
if close < close[1] and (open < close)
    chng := 1
else if close > close[1]
    chng := 1
else
    chng := -1
obvalt = ta.cum(math.sign(chng) * volume)
//src = input(title="Source", defval=close)
src = obvalt
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//hline(0, "Zero Line", color=color.new(#787B86, 50))
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
//BUY Signal
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
twohunraise = ta.rising(out, 2)
twentyrise = ta.rising(outt, 2)
macdrise = ta.rising(macd,2)
macdlong = ta.crossover(macd, signal)
longCondition=false
if macdlong and macdrise
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
shortmafall = ta.falling(outthree, 1)
macdfall = ta.falling(macd,1)
macdsell = macd < signal
shortCondition = false
if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2)
    shortCondition := true


if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


Больше