bonjour,
j’ai des notions de programmation assez simples sur PROBUILDER
mais pour le coup je suis en panne.
je cherche à acheter 3 jours avant le début de mois (soit à j-3) au cours d’ouverture (par exemple) et vendre 3 jours après le début de mois soit à j+3 au cours de clôture (par exemple)
pouvez vous m’aider svp
merci
Bonjour, voici un code qui achète en fin de mois et revend 3 jours après le début du mois suivant.
La logique repose sur un principe simple : on ne peut pas connaître le futur, donc on utilise le nombre de barres du mois précédent comme proxy pour le mois courant. En pratique les mois boursiers varient peu (20 à 23 jours), donc le total du mois précédent est une très bonne approximation.
Le détail du comptage :
- barsDuMois = 1 → c’est le 1er jour du mois
- barsDuMois = totalMoisPrec – 2 → c’est j-3 avant la fin (ex: si le mois fait 21 jours, ça tire à la barre 19)
- barsDuMois = 4 → c’est le 4ème jour du nouveau mois, soit 3 jours après le 1er
À noter : AT MARKET exécute à l’ouverture de la barre suivante, ce qui correspond bien à “j’achète/vends à l’ouverture du lendemain du signal”.
DEFPARAM CumulateOrders = False
// --- Détection du changement de mois ---
nouveauMois = (Month <> Month[1])
// --- Compteur de barres dans le mois courant ---
// Repart à 1 le 1er jour du mois, s'incrémente ensuite
IF nouveauMois THEN
barsDuMois = 1
ELSE
barsDuMois = barsDuMois[1] + 1
ENDIF
// --- Au changement de mois : on sauvegarde le total de barres du mois qui vient de se terminer ---
// À ce moment, barsDuMois[1] contient le compteur final du mois précédent
IF nouveauMois THEN
totalMoisPrec = barsDuMois[1]
ENDIF
// --- Seuil d'achat : 3 barres avant la fin du mois ---
// barsDuMois commence à 1, donc j-3 = totalMoisPrec - 2
seuilAchat = totalMoisPrec - 2
// --- ORDRES ---
// ACHAT à j-3 avant la fin du mois, au cours d'ouverture de la barre suivante
IF barsDuMois = seuilAchat AND NOT LongOnMarket THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// VENTE à j+3 après le début du nouveau mois
// barsDuMois = 1 → 1er jour, barsDuMois = 4 → 3 jours après le 1er
IF LongOnMarket AND barsDuMois = 4 THEN
SELL 1 CONTRACT AT MARKET
ENDIF