Stratégie de trading à double voie d'Ouma et d'Apollo


Date de création: 2023-11-02 17:09:35 Dernière modification: 2023-11-02 17:09:35
Copier: 3 Nombre de clics: 678
1
Suivre
1617
Abonnés

Stratégie de trading à double voie d’Ouma et d’Apollo

Aperçu

Cette stratégie, qui combine les deux indicateurs technologiques traditionnels de l’indice d’Orma et de l’indice d’Apollo, permet d’effectuer des transactions à deux voies. L’idée de base est de rechercher des opportunités de reprise des cours courts lorsque la tendance de la ligne moyenne longue est jugée à la hausse.

Principe de stratégie

La stratégie utilise deux moyennes mobiles de 50 et 200 jours pour juger de la tendance de la ligne moyenne longue, la ligne 50 étant au-dessus de la ligne 200 pour indiquer une tendance à plusieurs têtes, et vice versa, une tendance à la tête vide.

Ensuite, la stratégie utilise l’OMR pour localiser les opportunités de reprise des cours de la courte ligne. L’OMR, composé respectivement de la ligne %K et de la ligne %D, est le résultat de l’indicateur RSI, qui a été traité avec un simple lissage de la moyenne mobile.

En outre, pour filtrer davantage les occasions de fausses informations, la stratégie a également introduit l’indicateur Apollo. L’indicateur Apollo affiche des informations sur les points extrêmes des valeurs de la ligne K% D. Lorsque la ligne % K forme de nouveaux points bas, cela signifie une faible résilience; lorsque de nouveaux points hauts se forment, cela signifie une forte résilience. Combiné avec le signal de l’indicateur Oma, cela peut améliorer encore la précision de l’entrée en jeu.

Plus précisément, dans une tendance à plusieurs têtes, la stratégie vérifie les nouvelles informations sur les points hauts pour confirmer la force d’un rebond lorsque l’indicateur OMAR affiche des opportunités de formation de points hauts sous la zone de survente; dans une tendance à la tête vide, la stratégie vérifie les nouvelles informations sur les points bas pour confirmer la faiblesse de la force de rebond lorsque l’indicateur OMAR affiche des opportunités de formation de points hauts sur la zone de survente.

Grâce au processus décrit ci-dessus, la stratégie exploite pleinement les avantages du jugement de tendance de la ligne moyenne longue et de l’indicateur de retournement de la ligne courte pour construire un système de négociation stable à deux voies.

Avantages stratégiques

  1. Cette stratégie, combinant le jugement de la tendance et les indicateurs de revers, combine les avantages de la négociation tendancielle et de la négociation contre-courante pour former un cadre de négociation mixte stable.

  2. Le filtre à double indice permet de réduire le taux de faux signaux et d’améliorer la fiabilité du signal.

  3. Les paramètres de la stratégie sont simples, faciles à comprendre et à optimiser, adaptés à la quantification des transactions.

  4. La stratégie fonctionne bien, avec de meilleurs taux de victoires et de meilleures performances.

  5. La méthode de la double voie multifonction permet d’obtenir des opportunités de négociation en permanence et ne se limite pas à une seule direction.

Risque stratégique

  1. En tant que stratégie inversée, une série de pertes consécutives peut être générée lorsque la tendance change.

  2. La stratégie exige un contrôle émotionnel élevé des traders et nécessite un certain taux de rétractation.

  3. Certains paramètres, tels que la périodicité des moyennes mobiles, présentent une certaine subjectivité et doivent être déterminés par l’optimisation de la rétroaction.

  4. L’indicateur Omega et l’indicateur Apollo sont sensibles aux fluctuations anormales et peuvent être défaillants dans des situations extrêmes.

  5. Cette stratégie est mieux adaptée aux conditions de marché volatiles et peut être moins efficace en cas de tendance évidente.

Il est possible d’éviter les risques en introduisant des filtres de tendance et en ajoutant une stratégie de stop-loss. Lorsque le marché entre dans une tendance évidente, il est possible d’envisager de suspendre la stratégie et d’éviter de négocier dans cet environnement.

Orientation de l’optimisation de la stratégie

  1. Tester différentes combinaisons de paramètres pour obtenir de meilleurs paramètres. Par exemple, vous pouvez essayer d’utiliser des indicateurs tels que les moyennes mobiles lisses EWMA.

  2. L’ajout d’indicateurs tels que le volume ou le BV pour juger de la déviation permet de vérifier davantage la fiabilité du signal.

  3. L’ajout d’indices de panique tels que VIX comme indicateur de surveillance pour réduire les positions en cas de panique sur le marché.

  4. Optimiser les stratégies de stop loss, par exemple en utilisant des stop loss dynamiques comme le stop ATR.

  5. L’introduction d’algorithmes d’apprentissage automatique pour optimiser dynamiquement les paramètres du réglage.

  6. Ajout d’un modèle multifacteur pour améliorer la qualité du signal.

Résumer

Cette stratégie est globalement une stratégie de trading quantitative stable et efficace. Elle combine le jugement de la tendance et l’indicateur de renversement. Elle utilise l’indicateur d’Omar et l’indicateur d’Apollo en double vérification pour détecter efficacement les opportunités de revers de prix de la courte ligne.

Code source de la stratégie
/*backtest
start: 2023-10-25 00:00:00
end: 2023-10-28 00:00:00
period: 5m
basePeriod: 1m
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/
// © PtGambler

//@version=5
strategy("2 EMA + Stoch RSI + ATR [Pt]", shorttitle = "2EMA+Stoch+ATR", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)

// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)

// ******************************************************************************************

group_ema = "EMA"
group_stoch = "Stochastic RSI"
group_atr = "ATR Stoploss Finder"

// ----------------------------------------- 2 EMA -------------------------------------

ema1_len = input.int(50, "EMA Length 1", group = group_ema)
ema2_len = input.int(200, "EMA Length 2", group = group_ema)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)

plot(ema1, "ema1", color.white, linewidth = 2)
plot(ema2, "ema2", color.orange, linewidth = 2)

ema_bull = ema1 > ema2
ema_bear = ema1 < ema2


// -------------------------------------- Stochastic RSI -----------------------------

smoothK = input.int(3, "K", minval=1, group = group_stoch)
smoothD = input.int(3, "D", minval=1, group = group_stoch)
lengthRSI = input.int(14, "RSI Length", minval=1, group = group_stoch)
lengthStoch = input.int(14, "Stochastic Length", minval=1, group = group_stoch)
src = close
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

var trigger_stoch_OB = k > 80
var trigger_stoch_OS = k < 20

stoch_crossdown = ta.crossunder(k, d)
stoch_crossup = ta.crossover(k, d)

P_hi = ta.pivothigh(k,1,1)
P_lo = ta.pivotlow(k,1,1)

previous_high = ta.valuewhen(P_hi, k, 1)
previous_low = ta.valuewhen(P_lo, k, 1)
recent_high = ta.valuewhen(P_hi, k, 0)
recent_low = ta.valuewhen(P_lo, k, 0)

// --------------------------------------- ATR stop loss finder ------------------------

length = input.int(title='Length', defval=14, minval=1, group = group_atr)
smoothing = input.string(title='Smoothing', defval='EMA', options=['RMA', 'SMA', 'EMA', 'WMA'], group = group_atr)
m = input.float(0.7, 'Multiplier', step = 0.1, group = group_atr)
src1 = input(high, "Source for upper band", group = group_atr)
src2 = input(low, "Source for lower band", group = group_atr)

showatr = input.bool(true, 'Show ATR Bands', group = group_atr)
collong = input.color(color.purple, 'Long ATR SL', inline='1', group = group_atr)
colshort = input.color(color.purple, 'Short ATR SL', inline='2', group = group_atr)

ma_function(source, length) =>
    if smoothing == 'RMA'
        ta.rma(source, length)
    else
        if smoothing == 'SMA'
            ta.sma(source, length)
        else
            if smoothing == 'EMA'
                ta.ema(source, length)
            else
                ta.wma(source, length)

a = ma_function(ta.tr(true), length) * m
up = ma_function(ta.tr(true), length) * m + src1
down = src2 - ma_function(ta.tr(true), length) * m

p1 = plot(showatr ? up : na, title='ATR Short Stop Loss', color=colshort)
p2 = plot(showatr ? down : na, title='ATR Long Stop Loss', color=collong)

// ******************************* Profit Target / Stop Loss *********************************************

RR = input.float(2.0, "Reward to Risk ratio (X times SL)", step = 0.1, group = "Profit Target")

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

BSLE = ta.barssince(strategy.opentrades.entry_bar_index(0) == bar_index)

if strategy.position_size > 0 and BSLE == 1
    L_PT := close + (close-down)*RR
    L_SL := L_SL[1]
    S_PT := close - (up - close)*RR
    S_SL := up
else if strategy.position_size < 0 and BSLE == 1
    S_PT := close - (up - close)*RR
    S_SL := S_SL[1]
    L_PT := close + (close-down)*RR
    L_SL := down
else if strategy.position_size != 0
    L_PT := L_PT[1] 
    S_PT := S_PT[1]
else
    L_PT := close + (close-down)*RR
    L_SL := down
    S_PT := close - (up - close)*RR
    S_SL := up

entry_line = plot(strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- strategy setup ------------------------------------------------------

var L_entry_trigger1 = false
var S_entry_trigger1 = false

L_entry_trigger1 := ema_bull and close < ema1 and k < 20 and strategy.position_size == 0
S_entry_trigger1 := ema_bear and close > ema1 and k > 80 and strategy.position_size == 0

L_entry1 = L_entry_trigger1[1] and stoch_crossup and recent_low > previous_low
S_entry1 = S_entry_trigger1[1] and stoch_crossdown and recent_high < previous_high

//debugging
plot(L_entry_trigger1[1]?1:0, "L Entry Trigger")
plot(stoch_crossup?1:0, "Stoch Cross Up")
plot(recent_low > previous_low?1:0, "Higher low")

plot(S_entry_trigger1[1]?1:0, "S Entry Trigger")
plot(stoch_crossdown?1:0, "Stoch Cross down")
plot(recent_high < previous_high?1:0, "Lower high")

if L_entry1
    strategy.entry("Long", strategy.long)

if S_entry1
    strategy.entry("Short", strategy.short)

strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")

//resetting triggers
L_entry_trigger1 := L_entry_trigger1[1] ? L_entry1 or ema_bear or S_entry1 ? false : true : L_entry_trigger1
S_entry_trigger1 := S_entry_trigger1[1] ? S_entry1 or ema_bull or L_entry1 ? false : true : S_entry_trigger1

//Trigger zones
bgcolor(L_entry_trigger1 ? color.new(color.green ,90) : na)
bgcolor(S_entry_trigger1 ? color.new(color.red,90) : na)