Bonjour,
Débutant sur pro order, j’aurais besoin de vos conseils pour un code qui semble ne pas fonctionner. Le principe de ce code est une martingale et le problème est le suivant :
L’ordre initial (achat ou vente) se déclenche bien en fonction des conditions demandées mais lorsque la position clôture en perte, l’ordre suivant ne prend pas en compte la martingale et ouvre une position d’un contrat seulement (idem à l’ordre initial donc). J’ai eu beau chercher un peu partout sur le web et dans le manuel d’utilisation, pas moyen de comprendre l’erreur. Pouvez vous m’aider svp ?
Voici le code en question :
DEFPARAM CumulateOrders = False
ONCE OrderSize = 1
ONCE ExitIndex = -2
noEntryBeforeTime = 080000
timeEnterBefore = time >= noEntryBeforeTime
noEntryAfterTime = 183000
timeEnterAfter = time < noEntryAfterTime
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
indicator1 = RSI[14](close)
c1 = (indicator1 <= 30)
IF c1 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND not longonmarket THEN
BUY ordersize CONTRACT AT MARKET
ENDIF
indicator2 = RSI[14](close)
c2 = (indicator2 >= 70)
IF c2 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND not shortonmarket THEN
SELLSHORT ordersize CONTRACT AT MARKET
ENDIF
SET STOP pLOSS 5
SET TARGET pPROFIT 10
ExitIndex = BarIndex
IF Barindex = ExitIndex + 1 THEN
ExitIndex = 0
IF PositionPerf(1) < 0 THEN
OrderSize = OrderSize * 2
ELSIF PositionPerf(1) > 0 THEN
OrderSize = 1
ENDIF
ENDIF
D’avance merci !
Je pense qu’à force d’essayer à faire quelque-chose qui fonctionne, tu as mélangé un peu de tout, j’ai modifié comme ceci:
DEFPARAM CumulateOrders = False
ONCE OrderSize = 1
//ONCE ExitIndex = -2
noEntryBeforeTime = 080000
timeEnterBefore = time >= noEntryBeforeTime
noEntryAfterTime = 183000
timeEnterAfter = time < noEntryAfterTime
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
indicator1 = RSI[14](close)
c1 = (indicator1 <= 30)
IF c1 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND not longonmarket THEN
BUY ordersize CONTRACT AT MARKET
ENDIF
indicator2 = RSI[14](close)
c2 = (indicator2 >= 70)
IF c2 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND not shortonmarket THEN
SELLSHORT ordersize CONTRACT AT MARKET
ENDIF
SET STOP pLOSS 5
SET TARGET pPROFIT 10
IF tradeindex(1)=barindex[1] THEN
IF PositionPerf(1) < 0 THEN
OrderSize = OrderSize * 2
ELSIF PositionPerf(1) > 0 THEN
OrderSize = 1
ENDIF
ENDIF
ça devrait fonctionner, merci de confirmer ! 🙂
Merci Nicolas pour la rapidité de ta réponse 🙂
En fait je me suis appuyé sur le manuel d’utilisation de PRT pour faire le code, chose qui n’a pas été aisé, j’ai du me mélanger un peu les pinceaux.
Avec ton code il y a effectivement eu du changement (j’ai reduit le take profit pour avoir un meilleur visuel au backtest) mais certains problèmes semblent persister 🙁
Sur le graph on voit que la première position est un echec (vente à 1.11876 et rachat à 1.11926) jusqu’ici c’est normal. Par contre la deuxième s’ouvre avec un montant de 4 lot à 1.11940 (normalement ce devrait être 2) et se ferme sur la même bougie à 1.11990 (normal). La position continue d’être perdante mais les positions suivantes continuent à 4 lots.
Je ne comprends pas trop ce qu’il se passe.
Ah ok je vois, le problème avec le code de la martingale de la documentation c’est que l’on ne sait pas si l’ordre a été fermé en takeprofit ou en stoploss avec la façon dont on nous dit de l’incorporer. J’ai changé la façon d’opérer:
DEFPARAM CumulateOrders = False
ONCE OrderSize = 1
noEntryBeforeTime = 080000
timeEnterBefore = time >= noEntryBeforeTime
noEntryAfterTime = 183000
timeEnterAfter = time < noEntryAfterTime
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
indicator1 = RSI[14](close)
c1 = (indicator1 <= 30)
IF c1 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND not longonmarket THEN
EXITSHORT AT MARKET
IF PositionPerf(1) < 0 THEN
OrderSize = OrderSize * 2
ELSIF PositionPerf(1) > 0 THEN
OrderSize = 1
ENDIF
BUY ordersize CONTRACT AT MARKET
ENDIF
indicator2 = RSI[14](close)
c2 = (indicator2 >= 70)
IF c2 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND not shortonmarket THEN
SELL AT MARKET
IF PositionPerf(1) < 0 THEN
OrderSize = OrderSize * 2
ELSIF PositionPerf(1) > 0 THEN
OrderSize = 1
ENDIF
SELLSHORT ordersize CONTRACT AT MARKET
ENDIF
SET STOP pLOSS 5
SET TARGET pPROFIT 10
et maintenant ?
C’est beaucoup mieux ! 😉 et vu la configuration de l’eur/usd aujourd’hui c’est un massacre ! +4600 eur ! lol
Ceci est du au fait que maintenant la clôture se fait uniquement quand le rsi passe sous les 30 pour les shorts et au dessus de 70 pour les longues (en backtest du moins), le stop loss et la martingale fonctionnent bien mais le take profit est par contre devenu inutile dans le code.
Je n’ose pas imaginer pas le résultat un jour de forte tendance continue……hummm et un compte brulé, un ! lol
Je vais essayer de trouver quelque chose pour arranger ça et stopper comme prévu initialement 🙂
En tout cas merci infiniment, la lecture de ton code m’a permis de mieux comprendre le principe et de progresser 🙂
Finalement après plusieurs tests en changeant les valeurs, il s’avère que ton code est tout simplement parfait 🙂
Un grand bravo et encore merci Nicolas.
Un dernier point, il m’est impossible d’effectuer un backtest sur plus d’un jour. Est-ce du au fait que je soit en démo ?
Il faut augmenter la quantité d’unité affichée à 200.000, c’est le maximum d’historique possible avec PRT-CFD premium. La limite est fixé à 100k chandeliers chez IG, je ne sais pas qui est ton courtier.
Je suis cez IG, et effectivement 100K unités fonctionne, il fallait le savoir ^^
Merci pour ton aide ! 🙂
Bonjour,
Cette routine fonctionne bien sur le CAC40 Future en backtest sur des barres de 2 minutes ; je l’essaie demain sur un portefeuille virtuel. Avez-vous essayé avec un stop-suiveur à 5% plutôt qu’un stop-loss ? (je ne connais pas la formule pour le coder, mais le trailing stop me semble très puissant).