Bonjour,
Je cherche à faire fonctionner un petit code sur le mini France 40 en 1 min en automatique, chez IG. Les ordres sont bien déclenchés selon les critères fournis. Toutefois, à chaque fois ils sont rejetés, car le niveau du Stop Loss est calculé excessivement bas (7 ou 8 ou 9) ou excessivement haut (12412.7 …). Le niveau su Stop Loss est calculé d’après d’autres valeurs calculées dans le code : je vous le fournis en entier. Qu’est-ce qui, selon vous, donne un niveau de Stop Loss aussi erroné ? Merci pour votre retour.
//30 Août 2022
//Le haut du canal varie lorsque Fisher_Transform croise à la baisse son Trigger, le bas du canal varie lorsque le fisher_Transform croise à la baisse son Trigger.
DEFPARAM CumulateOrders = false
DEFPARAM FlatAfter = 223000
HeureDebut = 063000
HeureFin = 223000
Plage = (time >= HeureDebut AND time <= HeureFin)
//Calcul du Fisher_Transform :
p = 20
p1 = 4
p2 = 4
a1= customclose
b1= highest[p](a1)
b2=lowest[p](a1)
IF BARINDEX > p+2 THEN
vb=(a1-b2)/(b1-b2)
v1 =exponentialaverage[p1](2*(vb - 0.5))
f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))
ENDIF
Fisher = f1
Trigger = f1[1]
//Conditions pour Ligne_Haut
condition1 = Fisher > 0 AND Trigger > 0
condition2 = Fisher CROSSES UNDER Trigger
//Conditions pour Ligne_Bas
condition3 = Fisher < 0 AND Trigger < 0
condition4 = fisher CROSSES OVER Trigger
Hauta = condition1 AND condition2
CrossHaut = (Fisher > 1 AND Trigger > 1)
Basa = condition3 AND condition4
CrossBas = (Fisher < -1 AND Trigger < -1)
IF HAUTa AND CrossHaut THEN
a = highest[2](high)
ENDIF
IF BASa AND CrossBas THEN
b = lowest[2](low)
ENDIF
//Condition d'ACH
condition5 = close > open //donc verte
condition6 = open < a
condition7 = close > a
BreakACH = (condition5 AND condition6 AND condition7)
//condition de VTE
condition8 = close < open //donc rouge
condition9 = open > b
condition10 = close < b
BreakVTE = (condition8 AND condition9 AND condition10)
IF NOT ONMARKET AND BreakACH AND Plage THEN
BUY 1 contract AT MARKET NextBarOpen
ENDIF
IF (TradePrice - b) < 10 THEN
SET STOP pLOSS (b - 4)
ELSIF (TradePrice - b) > 10 THEN
SET STOP pLOSS b
ENDIF
conditionGainLong = (close - PositionPrice) >= 3
IF LONGONMARKET AND conditionGainLong THEN
SELL AT MARKET NextBarOpen
ENDIF
IF NOT ONMARKET AND BreakVTE AND Plage THEN
SELLSHORT 1 contract AT MARKET NextBarOpen
ENDIF
IF (a - TradePrice) < 10 THEN
SET STOP pLOSS (a + 4)
ELSIF (a - TradePrice) > 10 THEN
SET STOP pLOSS a
ENDIF
conditionGainShort = (PositionPrice - close) >= 3
IF SHORTONMARKET AND conditionGainShort THEN
EXITSHORT AT MARKET NextBarOpen
ENDIF
L’instruction SET STOP PLOSS attend une distance en pips et tu lui donnes un niveau de prix précis.
Dans ton cas, tu devrais utiliser la nouvelle instruction SET STOP PRICE qui placera le stoploss sur un niveau de prix.
Merci pour cette nouvelle information et la rapidité de la réponse. Je vais essayer cela et le tester. Je reviendrai donner des nouvelles.
Bonjour Nicolas, j’ai apporté la modification recommandée : STOP LOSS en STOP PRICE, et précisé un ou 2 détails dans le code (ajout des lignes 53 et 59). Le système a bien fonctionné : bon calcul des Stop et exécution des ordres d’ouverture-clôture-stop. Merci beaucoup pour ton aide.
Toutefois, le système ne fonctionne qu’en SHORT, alors que la rédaction pour des positions LONG est parfaitement symétrique : je l’ai relu x fois et je ne trouve pas d’erreur/différence entre les commandes Long et SHORT.
Je joins à nouveau le code, si tu as l’opportunité de t’y pencher à nouveau 😉 Merci
//30 Août 2022
//Le haut du canal varie lorsque Fisher_Transform croise à la baisse son Trigger, le bas du canal varie lorsque le fisher_Transform croise à la baisse son Trigger.
DEFPARAM CumulateOrders = false
DEFPARAM FlatAfter = 223000
HeureDebut = 080000
HeureFin = 223000
Plage = (time >= HeureDebut AND time <= HeureFin)
//Calcul du Fisher_Transform :
p = 20
p1 = 4
p2 = 4
a1= customclose
b1= highest[p](a1)
b2=lowest[p](a1)
IF BARINDEX > p+2 THEN
vb=(a1-b2)/(b1-b2)
v1 =exponentialaverage[p1](2*(vb - 0.5))
f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))
ENDIF
Fisher = f1
Trigger = f1[1]
//Conditions pour Ligne_Haut
condition1 = Fisher > 0 AND Trigger > 0
condition2 = Fisher CROSSES UNDER Trigger
//Conditions pour Ligne_Bas
condition3 = Fisher < 0 AND Trigger < 0
condition4 = fisher CROSSES OVER Trigger
Hauta = condition1 AND condition2
CrossHaut = (Fisher > 1 AND Trigger > 1)
Basa = condition3 AND condition4
CrossBas = (Fisher < -1 AND Trigger < -1)
IF HAUTa AND CrossHaut THEN
a = highest[2](high)
ENDIF
LigneHaut = a
IF BASa AND CrossBas THEN
b = lowest[2](low)
ENDIF
LigneBas = b
//Condition d'ACH
condition5 = close > open //donc verte
condition6 = open < LigneHaut
condition7 = close > LigneHaut
BreakACH = (condition5 AND condition6 AND condition7)
//condition de VTE
condition8 = close < open //donc rouge
condition9 = open > LigneBas
condition10 = close < LigneBas
BreakVTE = (condition8 AND condition9 AND condition10)
IF NOT ONMARKET AND BreakACH AND Plage THEN
BUY 1 contract AT MARKET NextBarOpen
ENDIF
IF (TradePrice - LigneBas) < 10 THEN
SET STOP PRICE (LigneBas - 4)
ELSIF (TradePrice - LigneBas) > 10 THEN
SET STOP PRICE LigneBas
ENDIF
conditionGainLong = (close - PositionPrice) >= 3
IF LONGONMARKET AND conditionGainLong THEN
SELL AT MARKET NextBarOpen
ENDIF
IF NOT ONMARKET AND BreakVTE AND Plage THEN
SELLSHORT 1 contract AT MARKET NextBarOpen
ENDIF
IF (LigneHaut - TradePrice) < 10 THEN
SET STOP PRICE (LigneHaut + 4)
ELSIF (LigneHaut - TradePrice) > 10 THEN
SET STOP PRICE LigneHaut
ENDIF
conditionGainShort = (PositionPrice - close) >= 3
IF SHORTONMARKET AND conditionGainShort THEN
EXITSHORT AT MARKET NextBarOpen
ENDIF
Je pense que tu devrais encadrer tes modifications de stoploss (lignes 79 à 83 et lignes 95 à 99) avec des conditions pour savoir si tu es LONG ou SHORTONMARKET, pour ainsi utiliser ces instructions vraiment lorsque c’est utile.
Bonjour Nicolas, merci pour le conseil. J’y retravaillerai un peu plus tard et te redonnerai des nouvelles. En attendant, j’ai scindé mes systèmes en 2 “sous-systèmes” (un Long et un Short à chaque fois). Le travail a été un peu rébarbatif, mais les 2 fonctionnent bien dans les 2 sens. Cela invite à penser que ton idée doit être efficiente, puisqu’ainsi le système saura dans quel(s) cas et à quelle(s) condition(s) entrer/sortir/stopper.
A bientôt
Bonjour Nicolas,
J’ai apporté les modifications que tu m’as suggérées. L’ensemble fonctionne bien, il n’y a plus aucun blocage (sauf à cause d’une erreur de signe de ma part).
J’ai maintenu des systèmes LONG et SHORT individualisés pour plus de sûreté. Bien sûr, cela augmente le nombre de systèmes, mais je vois que plusieurs personnes, sur les forums, rencontrent des incohérences (et donc des dysfonctionnements) entre leurs entrées LONG et leurs entrées SHORT, ainsi que pour le placement de leurs STOP.
J’ai encore de mon côté plusieurs choses à améliorer je pense, afin d’optimiser, et pour que les pertes ne dépassent pas les gains. Ensuite, je compte adapter sur des sous-jacents variés.
Merci encore pour ton aide efficace.
Ci-joint un exemplaire d’un code, à dupliquer en symétrique pour les ACH et les VTE, les HAUT et les BAS.
//30 Août 2022
//Le haut du canal varie lorsque Fisher_Transform croise à la baisse son Trigger, le bas du canal varie lorsque le fisher_Transform croise à la baisse son Trigger.
DEFPARAM CumulateOrders = false
DEFPARAM FlatAfter = 223000
HeureDebut = 080000
HeureFin = 223000
Plage = (time >= HeureDebut AND time <= HeureFin)
//Calcul du Fisher_Transform :
p = 20
p1 = 4
p2 = 4
a1= customclose
b1= highest[p](a1)
b2=lowest[p](a1)
IF BARINDEX > p+2 THEN
vb=(a1-b2)/(b1-b2)
v1 =exponentialaverage[p1](2*(vb - 0.5))
f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))
ENDIF
Fisher = f1
Trigger = f1[1]
//Conditions pour Ligne_Haut
condition1 = Fisher > 0 AND Trigger > 0
condition2 = Fisher CROSSES UNDER Trigger
//Conditions pour Ligne_Bas
condition3 = Fisher < 0 AND Trigger < 0
condition4 = fisher CROSSES OVER Trigger
Hauta = condition1 AND condition2
CrossHaut = (Fisher > 1 AND Trigger > 1)
Basa = condition3 AND condition4
CrossBas = (Fisher < -1 AND Trigger < -1)
IF HAUTa AND CrossHaut THEN
a = highest[2](high)
ENDIF
LigneHaut = a
IF BASa AND CrossBas THEN
b = lowest[2](low)
ENDIF
LigneBas = b
//Condition d'ACH
condition5 = close > open //donc verte
condition6 = open < LigneBas
condition7 = close > LigneBas
BreakACH = (condition5 AND condition6 AND condition7)
IF NOT ONMARKET AND BreakACH AND Plage THEN
op = open
BUY 1 contract AT MARKET NextBarOpen
ENDIF
TP = TradePrice
IF LONGONMARKET AND (TP - LigneBas) < 10 THEN
SET STOP PRICE (LigneBas - 4)
ELSIF LONGONMARKET AND (TP - LigneBas) > 20 THEN
SET STOP PRICE (TP - 20)
ENDIF
conditionGainLong = (close - PositionPrice) >= 3
IF LONGONMARKET AND conditionGainLong THEN
SELL AT MARKET NextBarOpen
ENDIF
condition8 = open >= TP OR open <= TP
condition9 = close < LigneBas OR (close < LigneBas AND close < op)
//STOP sur Reverse Immédiat
StopRev = condition8 AND condition9
IF LONGONMARKET AND StopRev THEN
SELL AT MARKET NextBarOpen
ENDIF
Merci pour le retour et le partage. Bonne continuation et bon courage 🙂