Stratégie de trading lorsque le prix dépasse la moyenne mobile


Date de création: 2023-12-15 16:28:12 Dernière modification: 2023-12-15 16:28:12
Copier: 0 Nombre de clics: 345
1
Suivre
1166
Abonnés

Stratégie de trading lorsque le prix dépasse la moyenne mobile

Aperçu

La stratégie de négociation en deux directions est une stratégie de négociation quantitative qui utilise la rupture de la moyenne des prix pour déterminer le moment de l’achat et de la vente. La stratégie utilise la comparaison des prix avec les moyennes mobiles d’une période donnée pour générer des transactions en fonction de la hausse ou de la baisse des prix.

Principe de stratégie

La logique de cette stratégie est la suivante:

  1. Utilisez la fonction EMA pour calculer une moyenne mobile sur une période donnée (par exemple, 200 jours).

  2. Comparez la relation entre la taille du prix de clôture et celle de l’EMA pour déterminer si le prix a franchi l’EMA. Plus précisément, le prix est considéré comme ayant franchi l’EMA lorsque le prix de clôture est supérieur à l’EMA le jour même; le prix est considéré comme ayant franchi l’EMA lorsque le prix de clôture est inférieur à l’EMA le jour même.

  3. Le moment d’achat ou de vente est déterminé en fonction de la hausse ou de la baisse de l’EMA. Lorsque le prix est au-dessus de l’EMA, un signal d’achat est généré; lorsque le prix est en dessous de l’EMA, un signal de vente est généré.

  4. Au moment de la génération du signal, placez des ordres à un certain pourcentage (par exemple, le plein stock) et définissez un prix stop-loss et un prix stop-stop.

  5. Lorsque le prix atteint le seuil de stop loss ou de stop loss, il est nécessaire de lever la position.

  6. Le prix de l’électricité est le prix de l’électricité et de l’électricité est le prix de l’électricité.

La stratégie est simple, directe, facile à comprendre et à mettre en œuvre. La meilleure rapidité est obtenue en capturant des signaux de rupture sur des lignes courtes. Mais il existe également un certain retard et un risque de plusieurs secousses.

Avantages stratégiques

  • La logique de la stratégie est simple et claire, facile à comprendre et à vérifier.
  • Il est possible de suivre les tendances en utilisant les caractéristiques de la ligne moyenne.
  • Le nombre de transactions est élevé et convient aux opérations de courte durée.
  • Les prix des produits de base ont augmenté de façon spectaculaire depuis le début de l’année, et les prix des produits de base ont augmenté de façon spectaculaire.

Risque stratégique

  • Il y a un certain retard qui pourrait faire échouer la première percée.
  • Le problème de la fréquence des transactions peut survenir lorsque les secousses se produisent à plusieurs reprises.
  • Les pertes de l’arrêt peuvent être couvertes lors d’un grand renversement.

Il est possible d’optimiser le risque en ajustant les paramètres, par exemple en ajustant les paramètres de la moyenne, en utilisant des indicateurs de jugement plus efficaces, en réduisant la fréquence des transactions, etc. Il est également possible de contrôler le risque par des moyens tels que la mise en place d’un stop-loss adaptatif ou l’introduction de conditions de filtrage.

Orientation de l’optimisation de la stratégie

  • Essayez différents types et paramètres d’indicateurs de la moyenne pour trouver la meilleure solution. Par exemple, EMA, SMA, LWMA, etc.
  • Augmentation des conditions de filtrage pour éviter de multiples transactions de choc. Des jugements auxiliaires tels que l’introduction de la quantité de transaction, de la ligne de Brin, de l’ATR, etc.
  • Optimiser et tester les stratégies de prévention des pertes afin de réduire les risques.
  • Le système de négociation intégrée est basé sur la combinaison de plusieurs stratégies, telles que la tendance et le renversement.
  • L’ajout d’une configuration paramétrable pour une plus grande polyvalence des stratégies.

Résumer

L’idée centrale de cette stratégie est de suivre la courbe de la moyenne pour capturer les breaks de prix à court terme. Les avantages sont la réactivité et la facilité de mise en œuvre; les inconvénients sont le retard et la lenteur.

Code source de la stratégie
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-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/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='RF - B&S Signals', initial_capital=1000, currency=currency.GBP, default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, overlay=true)


i_startTime = input(defval=timestamp('01 Jan 2020 12:00 +0000'), title='Backtest Start')
i_endTime = input(defval=timestamp('01 Jan 2024 12:00 +0000'), title='Backtest End')

inDateRange     = true
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

    // Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC
    rng_size

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close,emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)

if  inDateRange and close>ema
    strategy.entry("Long", strategy.long, when=longCondition)
    
if   inDateRange and close<ema
    strategy.entry("Short", strategy.short, when=shortCondition)


plot(ema)




//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')

if strategy.position_size > 0
    strategy.exit(id='Long', stop=longStopPrice, limit=longTakePrice)

if strategy.position_size < 0
    strategy.exit(id='Short', stop=shortStopPrice, limit=shortTakePrice)