Stratégie de négociation quantitative modifiée en OBV et MACD

Auteur:ChaoZhang est là., Date: 2023-11-15 17:58:42 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie utilise le volume sur le solde modifié (OBV) et le MACD pour générer des signaux de trading.

La logique de la stratégie

  1. Calculer la moyenne mobile simple (SMA) pour déterminer la tendance du marché.

  2. Il modifie le calcul de l'OBV basé sur le prix de clôture et la relation de prix de clôture précédente pour rendre l'OBV plus sensible.

  3. Calculer le MACD sur OBV modifié. Le MACD se compose d'une ligne rapide, d'une ligne lente et d'un histogramme pour identifier le changement de momentum du volume.

  4. Lorsque le MACD croise l'or et monte, un signal d'achat est généré.

  5. Lorsque le MACD est à la baisse, un signal de vente est déclenché.

  6. Vérifiez les SMA pour éviter les transactions inutiles pendant les marchés sans tendance.

Analyse des avantages

  1. Les OBV modifiés sont plus sensibles pour détecter les changements de volume précoces.

  2. Le MACD indique clairement la variation de la dynamique du volume et les niveaux clés.

  3. Le signal combiné de volume et de prix améliore la précision.

  4. La SMA filtre le faux signal en déterminant la tendance du marché.

  5. Une logique stratégique claire et un grand espace d'optimisation.

Analyse des risques

  1. Les OBV modifiés peuvent générer de faux signaux, les besoins filtrés par d'autres indicateurs.

  2. Un mauvais réglage des paramètres MACD peut faire échouer les transactions ou provoquer de faux signaux.

  3. Faites attention aux spécificités des stocks pour éviter les pertes.

  4. Surveiller l'état du marché car la stratégie peut ne pas fonctionner pour des scénarios particuliers.

  5. Le risque d'excès d'efficacité des tests de retour peut entraîner une détérioration des performances dans le trading en direct.

Directions d'optimisation

  1. Tester différentes combinaisons de périodes SMA pour optimiser la détermination de la tendance du marché.

  2. Testez les paramètres MACD pour mieux identifier la variation de l'élan du volume.

  3. Ajouter d'autres indicateurs comme filtre, tels que KDJ, RSI, etc.

  4. Ajouter le stop loss à la perte limite par transaction.

  5. Optimiser la gestion de l'argent pour améliorer la rentabilité globale.

  6. Différences de paramètres d'essai entre les stocks

Conclusion

La stratégie combine OBV et MACD modifiés pour obtenir une synthèse du volume et des prix. Elle peut capturer les changements de momentum du volume tôt et générer des signaux de trading. Par rapport à l'utilisation d'OBV ou MACD seul, cette stratégie offre des opportunités de trading plus fiables. Cependant, des risques de faux signaux existent et d'autres optimisations sur les indicateurs et les paramètres, ainsi que la gestion de l'argent sont nécessaires pour obtenir des profits stables dans le trading en direct.


/*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)


Plus de