Bonjour,
Je cherche actuellement en vain comment procéder pour faire stopper le système après l’atteinte du TP (et le réenclencher à seulement certaines conditions = changement de situation).
Pour illustrer de manière simple :
Admettons que j’ai 2 conditions cumulatives pour un achat
- au croisement à la hausse d’une MM 30 et 50
- au croisement à la hausse d’un indicateur type MACD par exemple
Si le TP fixé est atteint suite à une première prise de position, je voudrais que le système ne reprenne plus position, sauf nouvelles conditions que je renseignerais (toujours pour l’exemple, un nouveau retournement à la hausse du MACD dans une tendance toujours haussière définie par les MM).
Pour les conditions je vois comment faire normalement, mais ce qu’il me manque c’est le premier “IF (TP ATTEINT) THEN…” : comment traduire cette fonction en code ? Car dans la liste des fonctions je vois seulement la possibilité de définir un niveau de gains ou un TP mais pas de l’utiliser comme une variable atteinte ou non.
// En cas de TP atteint, stopper le système avant prochain retournement
IF [TP ATTEINT] THEN
Autorisetrading=1
Else
Autorisetrading=0
Endif
Merci d’avance pour votre aide !
A noter que je viens d’essayer en mettant
c20= strategyprofit
IF c20=XX (montant du TP) THEN…
Et ça ne marche pas non plus.
Idem pour
myprofit=strategyprofit
autorisetrading=1
IF strategyprofit – myprofit >=5 then
autorisetrading=0
endif
StrategyProfit retourne le profit cumulé (PnL) de la stratégie dans la monnaie du compte, donc tester une valeur de takeprofit avec ne marchera pas ou alors ce serait vraiment pas précis.
Je te propose d’utiliser un test pour savoir si on été au marché dans la barre précédente (et qu’on y est plus dans la barre courante) et de vérifier si le profit était supérieur à 0. Si oui on enregistre le BARINDEX, par la suite on vérifiera si la condition du signal de trading a eu lieu après ou avant ce BARINDEX pour autoriser ou non le trading à nouveau.
//enregistre le barindex du signal
if buycondition then
signalbar=barindex
endif
//vérifie le profit sur le dernier ordre
if ( (not onmarket and onmarket[1] and not onmarket[2]) or (tradeindex(1)=tradeindex(2) and tradeindex(1)=barindex[1] and tradeindex(1)>0) ) and lastcheck<>barindex then
lastcheck = barindex
wasonmarket=1
else
wasonmarket=0
endif
if wasonmarket and positionperf(1)>0 then
profitbar=barindex[1]
endif
//autorise le trading uniquement si le barindex du signal est supérieur à celui de la vérification de profit
if buycondition and signalbar>profitbar then
buy at market
endif
Non testé, à vérifier.
EDIT : je n’avais pas vu votre réponse Nicolas avant de poster, je vérifie donc votre code et vous fais un retour rapidement !
Dernier essai par moi-même avec ce que je viens de trouver, qui ne fonctionne pas non plus :
// Ici je met un flag quand j'ai une tendance à la hausse ou à la baisse sur l'un de mes 2 indicateurs (croisement de MM et MACD)
IF (indicator1 > indicator2) OR (indicator3 > indicator4) OR (indicator1 < indicator2) OR (indicator3 < indicator4) THEN
flag=1
ENDIF
IF flag=1 THEN
autorisetrading=1
ENDIF
// Conditions de reprise du trading
IF autorisetrading=1 THEN
c13 = (indicator3 CROSSES OVER indicator4) // Retournement à la hausse du MACD
c14 = (indicator3 CROSSES UNDER indicator4) // Retournement à la baisse du MACD
ENDIF
// Conditions pour position acheteuse
IF (c13 AND autorisetrading=1) THEN
BUY 1 Contract at market
ENDIF
Je vous fais grâce du reste du code qui n’est que pour la clôture d’une position acheteuse ou la prise d’une position vendeuse.
Dans la logique je pensais pourtant que ça aurait pu fonctionner. M’enfin j’ai encore beaucoup à apprendre lol.
Je viens d’essayer le code donné qui ne fonctionne pas non plus.
J’ai fait quelques adaptations en le mixant avec mon propre code, et je commence à m’en rapprocher.
Ci-dessous vous trouverez la version uniquement pour une position acheteuse. Il n’y a bien qu’une seule prise de position par retournement à la hausse de l’indicateur MACD mais le code ne suit pas ma condition initiale que la MM10 soit strictement supérieure à la MM30…
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position avant l'heure spécifiée
noEntryBeforeTime = 090000
timeEnterBefore = time >= noEntryBeforeTime
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position après l'heure spécifiée
noEntryAfterTime = 180000
timeEnterAfter = time < noEntryAfterTime
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
//
IF condition=0 THEN
firsttrade=0
ENDIF
// Conditions pour ouvrir une position acheteuse
condition=0
indicator1 = WeightedAverage[10](close)
indicator2 = Average[30](close)
c1 = (indicator1 CROSSES OVER indicator2)
c2 = (indicator1 > indicator2)
indicator3, indicator4, ignored = CALL "Mon indicateur MACD"
c3 = (indicator3 CROSSES OVER indicator4)
c4 = (indicator3 > indicator4)
if c1 and c3 then
condition=1
elsif c1 and c4 then
condition=1
elsif c2 and c3 then
condition=1
elsif c2 and c4 then
condition=1
ENDIF
IF condition=1 AND firsttrade=0 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT MARKET
firsttrade=1
ENDIF
// Conditions pour fermer une position acheteuse
c5 = (indicator1 CROSSES UNDER indicator2)
c6 = (indicator3 CROSSES UNDER indicator4)
IF c5 OR c6 THEN
SELL AT MARKET
ENDIF
// Stops et objectifs
SET STOP pLOSS XX
SET TARGET pPROFIT XX
// Après atteinte du TP, reprise du système seulement si retournement et dans la tendance haussière
If firsttrade=1 AND (indicator1 > indicator2) then
flag= 1
endif
// Conditions de reprise du trading
C13 = (indicator3 crosses over indicator4) // Retournement à la hausse du MACD
// Conditions pour position acheteuse
IF c13 AND flag=1 AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry THEN
BUY 1 CONTRACT AT MARKET
ENDIF
// Condition pour fermer une nouvelle position acheteuse (hors tp/sl)
C5 = (indicator1 CROSSES UNDER indicator2)
C6 = (indicator3 CROSSES UNDER indicator4)
IF c5 OR c6 THEN
SELL AT MARKET
ENDIF
Sans doute pas très propre comme code :D.
bonsoir,
a essayer
if longonmarket and close>positionprice + valeur then
Autorisetrading=1
Else
Autorisetrading=0
Endif
if shortonmarket close<positionprice-valeur then
Autorisetrading=1
Else
Autorisetrading=0
Endif