Les ressources ont été chargées... Je charge...

Stratégie intelligente d'arrêt de traînée basée sur SMA avec reconnaissance de modèles intradiens

Auteur:ChaoZhang est là., Date: 2025-01-17 16:04:09 Je suis désolé
Les étiquettes:SMALe MA18ATR

 SMA-Based Intelligent Trailing Stop Strategy with Intraday Pattern Recognition

Résumé

Il s'agit d'une stratégie basée sur la moyenne mobile simple de 18 jours (SMA18), combinant la reconnaissance de modèles intraday et des mécanismes d'arrêt de trail intelligents. La stratégie observe principalement la relation de prix avec la SMA18, ainsi que les positions hautes et basses intraday, pour exécuter des entrées longues aux moments optimaux.

Principes de stratégie

La logique de base comprend plusieurs éléments clés: 1. Conditions d'entrée basées sur la position des prix par rapport à la moyenne mobile sur 18 jours, avec options pour des entrées de rupture ou au-dessus de la ligne 2. Analyse des modèles de bougies intraday, en mettant particulièrement l'accent sur les modèles Inside Bar pour améliorer la précision des entrées 3. Opérations sélectives basées sur les caractéristiques du jour de la semaine 4. Fixation du prix d'entrée à l'aide d'ordres limites avec un petit décalage vers le haut par rapport aux bas pour améliorer la probabilité de remplissage 5. Mécanismes de double stop-loss: stop fixes basés sur le prix d'entrée ou trailing stop basés sur les bas de deux jours

Les avantages de la stratégie

  1. Combine des indicateurs techniques et des schémas de prix pour des signaux d'entrée plus fiables
  2. Mécanisme de sélection flexible des délais de négociation pour l'optimisation spécifique au marché
  3. Système de stop-loss intelligent qui protège les bénéfices et permet un mouvement de prix adéquat
  4. Paramètres hautement réglables pour différents environnements de marché
  5. Réduction efficace du faux signal grâce au filtrage des motifs de la barre intérieure

Risques stratégiques

  1. Les arrêts fixes peuvent déclencher des sorties anticipées sur les marchés volatils
  2. Les arrêts de trailing peuvent engendrer des bénéfices minimes lors d'inversions rapides
  3. Les " Inside Bars " fréquents au cours de la consolidation peuvent entraîner une survente Mesures d'atténuation:
  • Réglage dynamique du stop-loss basé sur la volatilité du marché
  • Ajout d'indicateurs de confirmation de tendance
  • Mise en œuvre d'objectifs de bénéfice minimum pour filtrer les transactions de mauvaise qualité

Directions d'optimisation

  1. L'indicateur de volatilité doit être intégré (comme ATR) pour l'ajustement dynamique du stop-loss.
  2. Ajouter une dimension d'analyse du volume pour améliorer la fiabilité du signal
  3. Développer des algorithmes de sélection de dates plus intelligents basés sur les performances historiques
  4. Mettre en œuvre des filtres de force de tendance pour éviter de négocier dans des tendances faibles
  5. Améliorer les algorithmes de reconnaissance de la barre intérieure pour une meilleure identification des modèles

Résumé

Cette stratégie construit un système de trading complet en combinant plusieurs dimensions analytiques. Ses principales forces résident dans des paramètres flexibles et des mécanismes de stop-loss intelligents, permettant l'adaptation à divers environnements de marché.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent

strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')


insideBar() =>  //and high <= high[1] and low >= low[1] ? 1 : 0
    open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0

inside() =>
    high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]

inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
    enterIndex := bar_index
    enterIndex



//if strategy.position_size <= 0 

//    strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")


//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0 

//    strategy.exit("Long", stop=low[0]-belowlow,comment="exit")

//    enterIndex := na

T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])

W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])

//longStopPrice  = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)

//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)

showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')

isMon() =>
    dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
    dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
    dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
    dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
    dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
    dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
    dayofweek(time('D')) == dayofweek.sunday and showSun


clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or  isWed() 
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]

if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1])  //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
    if tradeabove == false
        strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
    if tradeabove == true and (xing == false or clprior < entryline)  // and high<high[1] 
        strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')


//if time>timestamp(2020,12,0,0,0) and isSat()  
//    strategy.entry("Long", strategy.long, limit=0, comment="long")


//strategy.exit("Long", stop=low-400*syminfo.mintick)

//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")

if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
    strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
    strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo
    strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')




Relationnée

Plus de