Répondre

SL et PT avec atr pour MultiCharts

2 réponses

paix à l'est

Client, bbp_participant, community, sq-ultimate, 305 réponses.

Visiter le profil

Il y a 4 ans #254805

Bonjour, Mark,

Bien que ce problème ait été clôturé avec un statut corrigé, je souhaite discuter à nouveau des SL et PT avec ATR pour Multicharts. Je voudrais rediscuter des SL et PT avec ATR pour Multicharts.

https://roadmap.strategyquant.com/tasks/sq4_5100

Le code de MC est maintenant comme ça.

———-
if(MarketPosition > 0) then begin
LongSLPlaced = false ;
Si BarsSinceEntry = 0 alors begin
IntLongSL = 0 ;
IntLongTS = 0 ;
fin ;
// StopLoss
IntLongSL = Round2Fraction(EntryPrice - (StopLossCoef * SQ_ATR(20)[1])) ;
IntLongSL = SQ_CorrectMinMaxSLPT(IntLongSL, MinimumSL, MaximumSL, true) ;
….
————-

Dans le code actuel, la valeur de l'ATR change à chaque barre après l'entrée. Les ratios SL, PT et RR changeront également, bien que ce changement ne soit pas trop important. Mais il est également nuisible.

Dans l'hypothèse d'une position longue, si la volatilité diminue et que le marché baisse lentement, le stop loss sera élargi.

 

La plupart des stratégies de MC fonctionnent par barre, et mettent à jour les signaux et les actions après la fermeture de la barre. Ainsi, lorsque l'ordre d'entrée stop est déclenché, il utilise la valeur ATR précédente (barre de signal), et non celle de la barre actuelle (barre d'entrée).

Ce n'est donc pas un problème pour le calcul de MM. Il peut et doit utiliser la valeur fixe de l'ATR. Dans le code de Mc, cela ressemble à ceci,

if(MarketPosition > 0) then begin
LongSLPlaced = false ;
Si BarsSinceEntry = 0 alors begin
IntLongSL = prix d'entrée - AtrSLmulti * valeur ATR[1] ;
IntLongPT = prix d'entrée + AtrPTmulti * valeur ATR[1] ;
fin ;

 

Cela sera tout à fait cohérent avec la valeur ATR utilisée par le calcul MM lorsque la condition d'entrée est vraie.
Cela n'a rien à voir avec les variables globales. Cela fonctionne bien dans MC. Et je trouve que le code généré par d'autres logiciels, définit également le SL dans le bloc de code if (BarsSinceEntry = 0)

 

Merci de reconsidérer cette approche.

0

tomas262

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 4 ans #254893

Bonjour,

Actuellement, il doit en être ainsi. Cela signifie que le SL doit être modifié en fonction de la valeur de l'ATR. A l'avenir, nous pourrions modifier cela, mais pour l'instant, en ce qui concerne le fonctionnement de TS, nous préférons le laisser fonctionner de cette manière.

0

paix à l'est

Client, bbp_participant, community, sq-ultimate, 305 réponses.

Visiter le profil

Il y a 4 ans #254939

Une autre raison explique la nécessité d'ajuster la mise en œuvre du stop loss et du profit initiaux.

La stratégie utilise des niveaux d'indicateurs comme stop loss. Le stop loss initial devient un stop loss suiveur ou la condition de sortie de l'indicateur.

Cela affaiblira l'effet des règles de sortie (indicateurs conditionnant la sortie) ou de la méthode du stop suiveur, ou entraînera une confusion logique.

 

//--------
// Ordres de sortie (SL, PT, Trailing) pour la règle : Entrée longue
//--------
if(MarketPosition > 0) then begin
LongSLPlaced = false ;
Si BarsSinceEntry = 0 alors begin
IntLongSL = 0 ;
IntLongTS = 0 ;
fin ;
// StopLoss
IntLongSL = Round2Fraction(SQ_EMA(High, EMAPeriod2)[3]) ;
IntLongSL = SQ_CorrectMinMaxSLPT(IntLongSL, MinimumSL, MaximumSL, true) ;
Sell("LongSL") next bar at IntLongSL stop ;
LongSLPlaced = true ;

...

 

Comme le montre la figure, si le stop loss initial suit la bonne logique, le stop loss intermédiaire ne devrait pas se produire.

 

Lorsque je modifie les codes dans MC. La stratégie fonctionne logiquement. Le module trailing stop jouera le rôle qu'il doit jouer.

 

if(MarketPosition > 0) then begin

LongSLPlaced = false ;

Si BarsSinceEntry = 0 alors begin
//IntLongSL = 0 ;
IntLongSL = Round2Fraction(SQ_EMA(High, EMAPeriod2)[3]) ;
IntLongSL = SQ_CorrectMinMaxSLPT(IntLongSL, MinimumSL, MaximumSL, true) ;

IntLongTS = 0 ;
fin ;

// StopLoss
//IntLongSL = Round2Fraction(SQ_EMA(High, EMAPeriod2)[3]) ;
//IntLongSL = SQ_CorrectMinMaxSLPT(IntLongSL, MinimumSL, MaximumSL, true) ;

Sell("LongSL") next bar at IntLongSL stop ;
LongSLPlaced = true ;

 

 

Pièces jointes :
Vous devez être connecté pour visualiser les fichiers joints.

0

Affichage de 2 réponses de 1 à 2 (sur un total de 2)