Bonjour,
Je cherche à définir un take profit à une distance en point égale au dernier plus bas pour un achat long.
J’ai essayé les 2 codes suivants et à chaque fois le take profit est placé bien plus loin que la valeur attendue:
once tp1 = 12000 //valeur fixée arbitrairement comme point de départ
if rsi[14] < 50 then
tp1 = min(tp1,close)
endif
if tp1 < 12000 and rsi[14] crosses over 50 then
buy X contracts at market
set target pprofit (close - tp1)
endif
if rsi[14] < 50 and close < close[1] then
tp1 = close
endif
if rsi[14] crosses over 50 then
buy X contracts at market
set target pprofit (close - tp1)
endif
Auriez-vous une idée de codage valide?
Merci,
Je pense que ta deuxième version est meilleure, mais je modifierai le pprofit en profit pour être en version prix et non en points, si le pointsize n’est pas égal à 1, cela pourrait poser problème.
set target profit (close - tp1)
Par ailleurs, il est possible que parfois cette soustraction donne une valeur négative ? à tester avec un GRAPH close-tp1
Bonjour,
J’avais posté une réponse il y a quelques jours mais je vois qu’elle n’est pas parue. L’ayant fait depuis mon smartphone il y a du avoir un soucis.
Juste pour dire que je suis effectivement arrivé à mes fin en utilisant la deuxième version et “profit” au lieu de “pprofit”.
Merci encore Nicolas
Du coup pour aller plus loin, j’utilise ce code en semi-automatique, c’est-à-dire que je lance le code seulement quand je repère une potentielle opportunité et n’est pas destiné à tourner tout seul tout le temps.
Dans l’idée je souhaite acheter quand le MACD passe 0, mais je ne souhaite pas forcément que la position soit prise au premier croisement mais à un croisement ultérieur.
Par exemple sur l’image je lance le robot au niveau de la flèche rouge et je souhaite que l’ordre soit pris à la flèche verte, et non la bleue, soit au deuxième croisement du macd au dessus de 0.
En utilisant le code suivant la position s’ouvre au premier croisement alors que j’ai ajouté la variable m comme déclencheur.
defparam cumulateorders = false
if strategyprofit <> 0 then
quit
endif
X = 0.5
i1 = monmacd
once m = 0
if i1 crosses under 0 then
tp = close
m = 1
endif
if i1 < 0 and not onmarket and close < close[1] then
tp = close
endif
if m = 1 and i1 crosses over 0 then
buy X contracts at market
set target pprofit (close - tp)
endif
if onmarket and i1 crosses under 0 then
sell at market
endif
set stop ploss 150
Quelle modification puis-je apporter?
Logique puisque ta condition ‘if m = 1’ est juste en dessous de ‘m=1’ (ligne 15), donc le code fera ce que tu lui demandes, à la ligne 22 la variable m est bien égale à 1.
Le code est lu de haut en bas.
Soit tu fais un incrément de m :
m = m+1
et à la ligne 15 tu testes si m>1
Soit tu inverses la position des lignes pour que ta ligne 15 soit lu aux bougies après celle ou tu donnes à m la valeur 1.
Merci pour ton retour mais j’ai du mal à saisir. Car je commence avec m = 0 et m est censé passer à 1 seulement si la consition i1 crosses under 0 est réalisée, or le trade est pris alors que la condition n’est pas réalisée.
La variable prend une valeur à 1 peut être avant le backtest lors de la lecture de l’historique, dans ce cas faire un
defparam prealoadbars=0
en tête du code de la stratégie.
Quand on veut tester la valeur d’une variable on peut utilise GRAPH, soit ici :
GRAPH m
ce qui pourrait t’aider à comprendre pourquoi “m” change d’état, et quand !
C’est bien ce que je me disais, que la valeur est prise à la lecture de l’historique.
Je vais donc jongler avec la valeur du preloadbars et un incrément de m.
Tres bonne journée