Bonjour à tous,
Je travaille actuellement sur un projet d’indicateur dans ProRealTime, et je rencontre une limite technique que je souhaiterais soumettre à vos expertises pour confirmer ou infirmer mes observations. Voici un résumé de la problématique, des tentatives effectuées, et de mes conclusions.
—
### **Ce Que Je Cherche à Faire**
Je souhaite utiliser une période dynamique pour calculer une moyenne mobile simple (SMA) dans ProRealTime. L’idée est que la période de la SMA soit basée sur une variable calculée dynamiquement, appelée BestX. Cette variable est obtenue à partir d’une logique précise qui détecte les niveaux pertinents sur le graphique.
Exemple simplifié :
`prorealtime
IF BestX > 1 THEN
SMAPrice = Average[BestX](Close) // Calculer une SMA avec la période dynamique
ELSE
SMAPrice = 0
ENDIF
RETURN SMAPrice
`
Cependant, cette approche renvoie une erreur car ProRealTime exige que la période soit un entier positif **constant** et non une variable dynamique.
—
### **Tentatives et Expériences**
Voici ce que j’ai testé pour contourner cette limitation :
1. **Arrondi et Quantification de la Période Dynamique** :
– J’ai essayé d’arrondir BestX à l’entier le plus proche et de le limiter à des plages fixes (5, 10, 20, 50).
– Exemple :
`prorealtime
c2 = Average[20](BestX) // Moyenne glissante de BestX
PeriodDynamic = ROUND(c2)
IF PeriodDynamic <= 5 THEN
PeriodDynamic = 5
ELSEIF PeriodDynamic <= 10 THEN
PeriodDynamic = 10
ELSEIF PeriodDynamic <= 20 THEN
PeriodDynamic = 20
ELSE
PeriodDynamic = 50
ENDIF
ResistanceDynamic = Average[PeriodDynamic](Close)
RETURN ResistanceDynamic
`
**Résultat** : Cela fonctionne mais ne renvoie que la valeur de la SMA calculée (le prix moyen) et non la période dynamique elle-même.
2. **Stockage dans un Array** :
– J’ai pré-calculé plusieurs SMA fixes (SMA5, SMA10, etc.) et tenté de choisir dynamiquement celle qui correspond à BestX via un array.
– Exemple :
`prorealtime
$SMA[5] = Average[5](Close)
$SMA[10] = Average[10](Close)
$SMA[20] = Average[20](Close)
$SMA[50] = Average[50](Close)
IF isset($SMA[PeriodDynamic]) THEN
ResistanceDynamic = $SMA[PeriodDynamic]
ELSE
ResistanceDynamic = 0
ENDIF
`
**Résultat** : ProRealTime demande toujours un entier constant pour l’indice de l’array, ce qui bloque l’utilisation de variables dynamiques comme PeriodDynamic.
3. **Conditions Fixes** :
– Plutôt que d’utiliser des arrays, j’ai créé des conditions explicites pour chaque SMA fixe.
– Exemple :
`prorealtime
SMA5 = Average[5](Close)
SMA10 = Average[10](Close)
SMA20 = Average[20](Close)
IF BestX > 1 THEN
IF BestX <= 5 THEN
SMAPrice = SMA5
ELSEIF BestX <= 10 THEN
SMAPrice = SMA10
ELSE
SMAPrice = SMA20
ENDIF
ELSE
SMAPrice = 0
ENDIF
RETURN SMAPrice
`
**Résultat** : Cela fonctionne, mais encore une fois, la valeur retournée est celle de la SMA (le prix) et non la période dynamique utilisée.
—
### **Conclusions**
1. **Blocage Principal :**
– ProRealTime exige une période constante (entier fixe) dans les fonctions comme Average[x](Close).
– Même les valeurs arrondies ou quantifiées ne sont pas acceptées si elles proviennent de variables dynamiques comme BestX.
2. **Ce Qui Fonctionne :**
– Les SMA fixes et leur sélection dynamique par conditions sont exploitables.
– Cependant, elles ne permettent pas de refléter directement une logique totalement dynamique comme celle visée initialement.
3. **Limitation Confirmée (?) :**
– Il semble impossible d’utiliser une variable dynamique comme période pour une SMA dans PRT.
– Avant d’abandonner cette piste, je souhaite valider cela avec vous.
—
### **Questions**
1. **Est-ce Confirmé ?**
– ProRealTime ne permet-il vraiment pas d’utiliser une variable dynamique comme période dans une fonction SMA (même après arrondi ou quantification) ?
2. **Solutions Alternatives :**
– Si vous avez rencontré ce type de problème, auriez-vous des idées ou des contournements qui pourraient fonctionner dans ce cas ?
Merci d’avance pour vos réponses et vos conseils. 😊
Je rajoute le code d’origine que j’utilise pour calculer la variable dynamique Bestx sachant que je veux l’utiliser comme cela : MySMABESTX=Average[Bestx](close)
N = 100 // Maximum Period
CloseTarget = High // Le plus haut de la bougie courante
BestX = 0 // Période de la SMA la plus proche
BestSMAX = 0 // Valeur de la SMA la plus proche
MinDifference = 1000000 // Différence minimale initialisée à une grande valeur
// Parcourir les périodes pour calculer les SMA
FOR x = 2 TO N DO
IF BarIndex >= x THEN // Vérifier qu'il y a assez de données pour calculer la SMA
SMAX = Average[x](Close) // Calculer la SMA pour x périodes
Difference = ABS(SMAX - CloseTarget) // Calculer la différence avec le plus haut
// Si cette SMA est plus proche du plus haut, la sauvegarder
IF Difference < MinDifference THEN
MinDifference = Difference
BestX = x
BestSMAX = SMAX
ENDIF
ENDIF
NEXT
// Afficher les résultats pour la bougie courante
//DrawText("Période SMA", BarIndex, High + 5) COLOURED("blue")
DrawText(BestX, BarIndex, High + 10) COLOURED("green") // Afficher la période
//DrawText("Valeur SMA", BarIndex, High + 15) COLOURED("blue")
//DrawText(BestSMAX, BarIndex, High + 20) COLOURED("green") // Afficher la valeur de la SMA
// Retourner la meilleure SMA trouvée
RETURN BestSMAX