Rejoignez-nous
ProBacktest/probacktest · proorder

TRADEINDEX

TRADEINDEX(N) renvoie l'index de la barre où un trade passé a été exécuté dans ProBacktest et ProOrder, permettant aux stratégies de compter les barres depuis la Nième entrée la plus récente.

Syntaxe

probuilder
TRADEINDEX(N)

Paramètres

NomTypePar défautDescription
Nentier1Numéro du trade compté à rebours dans le temps. 1 est le trade le plus récent, 2 celui d'avant, et ainsi de suite.

Comment ça marche

Chaque ordre exécuté est enregistré avec l'indice de la bar sur laquelle il a été exécuté. TRADEINDEX(N) recherche cet index pour le N-ième trade le plus récent. La valeur est un index de barre absolu, la même numérotation que BARINDEX utilise pour le bar actuel, pas un décompte de bars écoulés.

La question du temps écoulé se résout donc par une soustraction : BARINDEX - TRADEINDEX(1) est le nombre de bars depuis la dernière exécution. Cela permet une gestion des trades fondée sur le temps, par exemple sortir d'une position qui stagne après un nombre fixe de bars, imposer un délai entre deux entrées, ou n'autoriser le pyramidage qu'une fois la dernière exécution suffisamment ancienne.

Avec DEFPARAM CumulateOrders = true, chaque entrée partielle compte comme son propre trade, donc TRADEINDEX(1) fait référence au dernier ajout, pas à l'entrée initiale de la position cumulée. TRADEPRICE(N) suit la même numérotation et renvoie le prix d'exécution au lieu de l'indice de bar ; les deux sont souvent utilisés ensemble.

Exemples

Exemple 1, Stop temporel après cinq barres dans le trade (ProOrder)

probuilder
// Close everything once 5 bars have passed since the last execution
IF onmarket AND BARINDEX - TRADEINDEX(1) >= 5 THEN
  SELL AT MARKET
  EXITSHORT AT MARKET
ENDIF

Quelle que soit la direction de la position, elle est clôturée une fois que cinq barres se sont écoulées depuis la dernière exécution. C'est l'exemple de référence pour cette instruction.

Exemple 2, Pyramidage conditionné par le nombre de barres et la progression du prix (ProBacktest)

probuilder
DEFPARAM CumulateOrders = true
myMACD = MACD[12,26,9](close)
long = myMACD crosses over 0
exit = myMACD crosses under 0

// Initial entry
IF NOT LongOnMarket AND long THEN
  BUY 1 CONTRACTS AT MARKET
ENDIF

IF LongOnMarket AND exit THEN
  SELL AT MARKET
ENDIF

// Add only if 5 bars have passed and price is 10 points beyond the last fill
IF BARINDEX - TRADEINDEX(1) > 5 AND Close - TRADEPRICE(1) > 10 AND LongOnMarket THEN
  BUY 1 CONTRACTS AT MARKET
ENDIF

// One trailing stop protects the whole accumulated position
SET STOP %TRAILING 1.5

Des contrats supplémentaires ne sont achetés que si la dernière exécution date d'au moins cinq bars et que le prix a progressé de dix points au-delà, un filtre de pyramidage standard combinant TRADEINDEX avec TRADEPRICE.

Exemple 3, Délai d'attente entre entrées consécutives (ProOrder)

probuilder
// No new trade within 20 bars of the previous execution
signal = close crosses over average[20](close)
coolingDown = BARINDEX - TRADEINDEX(1) < 20

IF NOT onmarket AND signal AND NOT coolingDown THEN
  BUY 1 CONTRACT AT MARKET
  SET STOP LOSS 25
ENDIF

Après toute exécution, la stratégie refuse les nouvelles entrées pendant 20 barres, ce qui évite les réentrées rapides à répétition dans des conditions erratiques.

Erreurs et pièges courants

  • Index, pas ancienneté. TRADEINDEX(1) renvoie un indice de bar, non le nombre de bars depuis le trade. Le comparer directement à une petite constante n'a pas de sens, soustrayez-le toujours de BARINDEX.
  • Numérotation inversée. N se compte à rebours, 1 est le dernier trade. Supposer que 1 désigne le premier trade de la séance inverse la logique silencieusement.
  • Aucun trade pour l'instant. Sur les premiers bars d'un backtest, avant toute exécution, la valeur n'a pas de sens. Protégez les conditions temporelles avec onmarket ou un indicateur qui bascule après la première entrée.
  • CumulateOrders change le sens. Avec des positions cumulées, chaque exécution partielle est un trade, donc TRADEINDEX(1) suit le dernier renforcement plutôt que l'entrée initiale de la position. Utilisez une variable sauvegardée à la première entrée si le bar d'origine importe.
  • BarIndex, index de la barre courante, la référence pour le calcul des barres écoulées.
  • TRADEPRICE, prix d'exécution du Nième trade le plus récent.
  • POSITIONPRICE, prix moyen de la position ouverte.
  • ONMARKET, vrai tant qu'une position est ouverte.
  • CumulateOrders, DEFPARAM qui fait compter chaque entrée partielle comme un trade.
  • BarsSince, compte les barres depuis qu'une condition était vraie.
  • COUNTOFPOSITION, taille de la position actuellement ouverte.
  • LONGONMARKET, vrai tant qu'une position long est ouverte.