La stratégie du scalping intradien en combinaison de deux indicateurs

Auteur:ChaoZhang est là., Date: 2023-12-01 14:47:57 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie combine les signaux d'achat et de vente des indicateurs TMO et AMA de LuxAlgo pour capturer le début d'une tendance lors d'une consolidation en plage. Elle va long ou court lorsque les conditions du signal TMO, des extrémités AMA et de l'augmentation de la taille du corps de la bougie sont remplies. Le stop loss est défini au dernier swing high/low basé sur les barres récentes.

La logique de la stratégie

L'indicateur TMO reflète la dynamique des prix. Il appartient au type d'indicateur d'oscillateur et peut générer des signaux de négociation lorsque la divergence se produit. L'indicateur AMA est une moyenne mobile lissée. Il montre une gamme de fluctuations de prix, indiquant des conditions de surachat / survente lorsque le prix approche la bande supérieure / inférieure.

La logique principale derrière cette stratégie est la suivante: TMO peut détecter la divergence de tendance pour générer des signaux de trading. AMA peut identifier les zones de renversement de prix.

  1. TMO donne un signal d'achat, c'est-à-dire une divergence haussière ET AMA montre son extrême maximal
  2. TMO donne le signal de vente, c'est-à-dire une divergence baissière ET AMA montre son extrémité min.
  3. Il faut aussi que le corps des 3 bougies soit plus grand.

Il s'agit d'une solution au problème des faux signaux d'indicateurs uniques.

Les avantages

Les avantages de cette stratégie sont les suivants:

  1. Le TMO et l'AMA se valident mutuellement pour réduire les faux signaux et améliorer la précision.

  2. La combinaison du signal TMO, des extrémités AMA et de l'augmentation de la taille de la bougie permet à la stratégie d'identifier efficacement l'initiation de la tendance, que les stratégies de scalping poursuivent.

  3. En utilisant les barres récentes prix le plus élevé/le plus bas comme stop loss, il contrôle le risque de chaque transaction tout en évitant le risque de retard du recalcul de l'indicateur.

  4. Avec seulement deux indicateurs, la stratégie a mis en œuvre un système de scalping complet avec une logique claire et simple.

Les risques

Les principaux risques de la stratégie:

  1. Comme la stratégie de scalping vise une courte période de détention, le coût élevé des transactions peut affecter sa rentabilité.

  2. En utilisant les prix extrêmes récents pour le stop loss, il peut être vulnérable au bruit du marché et augmenter les chances de déclencher le stop loss.

  3. Le risque d'optimisation des paramètres est difficile. La stratégie implique plusieurs paramètres. Trouver la combinaison optimale de paramètres peut être difficile.

Optimisation

La stratégie peut être encore optimisée dans les domaines suivants:

  1. Ajouter plus d'indicateurs de filtre comme le volume pour éliminer les faux signaux et améliorer encore la qualité du signal.

  2. Les modifications apportées aux règles d'arrêt des pertes pour les rendre moins agressives, par exemple l'ajout de barres de confirmation avant le déclenchement du stop loss.

  3. Optimiser les paramètres pour trouver la meilleure combinaison de paramètres pour les indicateurs, ce qui peut aider à filtrer plus de bruit et augmenter le taux de victoire.

  4. Test et échange en direct sur différents produits et délais pour déterminer les conditions de marché les plus appropriées à cette logique stratégique.

Conclusion

Cette stratégie combine les signaux de trading de TMO et AMA au cuir chevelu sur les marchés à plage en capturant les premiers mouvements de tendance. Elle présente les avantages d'une grande précision du signal, d'une capture précoce de la tendance et d'un contrôle efficace des risques.


/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
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/
// © Kaspricci

//@version=5
strategy("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)

headlineTMO = "TMO Settings"

tmoLength   = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource   = input.source(close, "TMO Source", group = headlineTMO)

// calculate values
osc         = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)

// determine color of historgram
oscColor    = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na

// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)

// conditon to find highs and lows
up          = ta.highest(tmoSource, tmoLength)
dn          = ta.lowest(tmoSource, tmoLength)

// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)

// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0

// -------------------------------------------------------------------------------------------------------------

headlineAMA = "AMA Settings"

amaSource   = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength   = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)


amaMulti    = input.float(defval = 2.0, title = "Factor", minval = 1)

amaShowCd   = input(defval = true , title = "As Smoothed Candles")
amaShowEx   = input(defval = true,   title = "Show Alternating Extremities")

amaAlpha    = input.float(1.0, "Lag",       minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta     = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')

// -------------------------------------------------------------------------------------------------------------

headlineSL = "Stop Loss Settings"

slLength    = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")

// -------------------------------------------------------------------------------------------------------------

var b       = array.new_float(0)
var float x = na

if barstate.isfirst
    for i = 0 to amaLength - 1
        x := i / (amaLength - 1)
        w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
        array.push(b, w)

// local function to filter the source
filter(series float x) =>
    sum = 0.

    for i = 0 to amaLength - 1
        sum := sum + x[i] * array.get(b,i)
    
    sum / array.sum(b)

// apply filter function on source series

srcFiltered = filter(amaSource)

deviation   = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti

upper       = srcFiltered + deviation
lower       = srcFiltered - deviation

//----
crossHigh   = ta.cross(high, upper)
crossLow    = ta.cross(low, lower)

var os      = 0
os          := crossHigh ? 1 : crossLow ? 0 : os[1]

ext         = os * upper + (1 - os) * lower

//----
os_css = ta.rsi(srcFiltered, amaLength) / 100

extColor    = os == 1 ? #30FF85 : #ff1100

plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)

// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na

if amaShowCd
    h := filter(high)
    l := filter(low)
    c := filter(amaSource)
    body := math.abs(math.avg(c[1], c[2]) - c)

ohlc_os = ta.rsi(c, amaLength) / 100

plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)

// -------------------------------------------------------------------------------------------------------------

plotshape(bull ? ext : na, "Bullish Circle", shape.circle,    location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle,    location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label",  shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label",  shape.labelup,   location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)

// -------------------------------------------------------------------------------------------------------------

candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]

longEntryCond   = os == 1 and bull
shortEntryCond  = os == 0 and bear

longEntry       = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond)  < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry      = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)

longExit        = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit       = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)

recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow  = ta.lowest(low,   slLength) // lowest low of recent candles

bgcolor(longEntry  ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)

slLong          = (close - recentSwingLow) / syminfo.mintick  // stop loss in ticks
slShort         = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks

newOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades)

alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"

if (longEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
    
    strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
    strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)

if(longExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

if (shortEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)

    strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
    strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)

if(shortExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

Plus de