Bonjour tout le monde,
J’essaie depuis des semaines d’implémenter une stratégie de trend following dont la taille des ordres décroit en fonction de l’ordre d’arrivée. Par exemple, le premier ordre est à 2 lots, le suivant à 1 lot, ensuite 0.5 puis 0.
J’ai stocké les différentes tailles dans un tableau et je mets à jour un indice qui m’indique où en est la stratégie en nombre d’ordres passés depuis la première.
Probacktest ne rend aucun résultat si l’ordre d’achat fait référence à un élément du tableau via l’indice variable.
Si je supprime le once devant ix = 0, Probacktest rend un résultat, mais évidemment ix est toujours égal à 0 dans ce cas et le tableau des tailles d’ordres n’est pas parcouru.
Quelqu’un aurait-il une idée ? J’avais déjà remarqué le même genre de problème avec cette fois une taille d’ordre qui était donnée par une fonction d’un indice. J’ai l’impression que le BUY dans le IF n’arrive pas accéder à la valeur de l’indice.
Merci,
Bien à vous,
Rod
$sizes[0] = 2
$sizes[1] = 1.5
$sizes[2] = 1
ema200 = ExponentialAverage[200](close)
ema50 = ExponentialAverage[50](close)
ema5 = ExponentialAverage[5](close)
buysignal = (close > ema200) and (ema5 crosses over ema50)
sellsignal = (close < ema200) and (ema5 crosses under ema50)
once ix = 0
size = $sizes[ix]
// Conditions pour ouvrir une position acheteuse
IF buysignal THEN
// cette ligne ne fonctionne pas, pas de sortie de Probacktest :
BUY size CONTRACTS AT MARKET
// cette ligne fonctionne, mais ce n'est pas le résultat voulu pour les ordres BUY:
// BUY $sizes[0] CONTRACTS AT MARKET
ix = ix + 1
ENDIF
// Conditions pour fermer une position acheteuse
exitlong = low crosses under ema200
If LongOnMarket AND exitlong THEN
SELL AT MARKET
ix = 0
ENDIF
// Conditions pour ouvrir une position en vente à découvert
IF sellsignal THEN
// Cette ligne fonctionne :
SELLSHORT size CONTRACTS AT MARKET
ix = ix + 1
ENDIF
// Conditions pour fermer une position en vente à découvert
covershort = high crosses over ema200
IF ShortOnMarket AND covershort THEN
EXITSHORT AT MARKET
ix = 0
ENDIF
Bonsoir,
ça se fait sans tableau, ce qui évite les erreurs d’indexation ix, erreur de surcroit amplifiée par le mélange du même index ix pour long ou short. On peut tester comme ceci, en prenant soin de séparer comptage long et short:
ema200 = ExponentialAverage[200](close)
ema50 = ExponentialAverage[50](close)
ema5 = ExponentialAverage[5](close)
buysignal = (close > ema200) and (ema5 crosses over ema50)
sellsignal = (close < ema200) and (ema5 crosses under ema50)
once sizeL=2
once sizeS=2
// Conditions pour ouvrir une position acheteuse
IF buysignal and countoflongshares<4.5 THEN
BUY sizeL CONTRACTS AT MARKET
if sizeL=2 then
sizeL=1.5
elsif sizeL=1.5 then
sizeL=1
endif
ENDIF
// Conditions pour fermer une position acheteuse
exitlong = low crosses under ema200
If LongOnMarket AND exitlong THEN
SELL AT MARKET
sizeL=2
ENDIF
// Conditions pour ouvrir une position en vente à découvert
IF sellsignal and countofshortshares<4.5 THEN
SELLSHORT sizeS CONTRACTS AT MARKET
if sizeS=2 then
sizeS=1.5
elsif sizeS=1.5 then
sizeS=1
endif
ENDIF
// Conditions pour fermer une position en vente à découvert
covershort = high crosses over ema200
IF ShortOnMarket AND covershort THEN
EXITSHORT AT MARKET
sizeS=2
ENDIF
graph sizeL as "sizeL"
graph -sizeS as "-sizeS"
C’est faisable avec tableau mais avec une horrible rustine 😉
La ligne qui bugge est “size=$sizes[ix]” … si on la remplace par
FOR i=0 to 2 DO
IF i=ix THEN
size=$sizes[i]
BREAK
ENDIF
NEXT
ça marche … mais bon c’est vraiment horrible de devoir faire ça 🙁
Super, merci beaucoup à vous 2 !
Je ne connaissais pas countoflongshares.
Je vais essayer les 2 solutions, je pensais que les tableaux permettraient plus de souplesse.
Bien à vous
Tous les chemins mènent à Rome en programmation, cependant il y a des façons plus ou moins “élégante” d’arriver à ses fins 🙂
Tous les chemins mènent à Rome en programmation, cependant il y a des façons plus ou moins “élégante” d’arriver à ses fins 🙂
Qui dit manière élégante dis aussi un code optimisé et lecture facile, consommation moindre sur les serveur et Surtout exécution plus rapide