Mauvais calcul du Stop Loss en Automatique
Forums › ProRealTime forum Français › Support ProOrder › Mauvais calcul du Stop Loss en Automatique
- This topic has 7 replies, 2 voices, and was last updated 2 years ago by Nicolas.
-
-
08/30/2022 at 8:43 PM #199918
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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101//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 = falseDEFPARAM FlatAfter = 223000HeureDebut = 063000HeureFin = 223000Plage = (time >= HeureDebut AND time <= HeureFin)//Calcul du Fisher_Transform :p = 20p1 = 4p2 = 4a1= customcloseb1= highest[p](a1)b2=lowest[p](a1)IF BARINDEX > p+2 THENvb=(a1-b2)/(b1-b2)v1 =exponentialaverage[p1](2*(vb - 0.5))f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))ENDIFFisher = f1Trigger = f1[1]//Conditions pour Ligne_Hautcondition1 = Fisher > 0 AND Trigger > 0condition2 = Fisher CROSSES UNDER Trigger//Conditions pour Ligne_Bascondition3 = Fisher < 0 AND Trigger < 0condition4 = fisher CROSSES OVER TriggerHauta = condition1 AND condition2CrossHaut = (Fisher > 1 AND Trigger > 1)Basa = condition3 AND condition4CrossBas = (Fisher < -1 AND Trigger < -1)IF HAUTa AND CrossHaut THENa = highest[2](high)ENDIFIF BASa AND CrossBas THENb = lowest[2](low)ENDIF//Condition d'ACHcondition5 = close > open //donc vertecondition6 = open < acondition7 = close > aBreakACH = (condition5 AND condition6 AND condition7)//condition de VTEcondition8 = close < open //donc rougecondition9 = open > bcondition10 = close < bBreakVTE = (condition8 AND condition9 AND condition10)IF NOT ONMARKET AND BreakACH AND Plage THENBUY 1 contract AT MARKET NextBarOpenENDIFIF (TradePrice - b) < 10 THENSET STOP pLOSS (b - 4)ELSIF (TradePrice - b) > 10 THENSET STOP pLOSS bENDIFconditionGainLong = (close - PositionPrice) >= 3IF LONGONMARKET AND conditionGainLong THENSELL AT MARKET NextBarOpenENDIFIF NOT ONMARKET AND BreakVTE AND Plage THENSELLSHORT 1 contract AT MARKET NextBarOpenENDIFIF (a - TradePrice) < 10 THENSET STOP pLOSS (a + 4)ELSIF (a - TradePrice) > 10 THENSET STOP pLOSS aENDIFconditionGainShort = (PositionPrice - close) >= 3IF SHORTONMARKET AND conditionGainShort THENEXITSHORT AT MARKET NextBarOpenENDIF08/31/2022 at 9:41 AM #199932L’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.
08/31/2022 at 10:10 AM #19993709/01/2022 at 9:53 AM #200000Bonjour 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105//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 = falseDEFPARAM FlatAfter = 223000HeureDebut = 080000HeureFin = 223000Plage = (time >= HeureDebut AND time <= HeureFin)//Calcul du Fisher_Transform :p = 20p1 = 4p2 = 4a1= customcloseb1= highest[p](a1)b2=lowest[p](a1)IF BARINDEX > p+2 THENvb=(a1-b2)/(b1-b2)v1 =exponentialaverage[p1](2*(vb - 0.5))f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))ENDIFFisher = f1Trigger = f1[1]//Conditions pour Ligne_Hautcondition1 = Fisher > 0 AND Trigger > 0condition2 = Fisher CROSSES UNDER Trigger//Conditions pour Ligne_Bascondition3 = Fisher < 0 AND Trigger < 0condition4 = fisher CROSSES OVER TriggerHauta = condition1 AND condition2CrossHaut = (Fisher > 1 AND Trigger > 1)Basa = condition3 AND condition4CrossBas = (Fisher < -1 AND Trigger < -1)IF HAUTa AND CrossHaut THENa = highest[2](high)ENDIFLigneHaut = aIF BASa AND CrossBas THENb = lowest[2](low)ENDIFLigneBas = b//Condition d'ACHcondition5 = close > open //donc vertecondition6 = open < LigneHautcondition7 = close > LigneHautBreakACH = (condition5 AND condition6 AND condition7)//condition de VTEcondition8 = close < open //donc rougecondition9 = open > LigneBascondition10 = close < LigneBasBreakVTE = (condition8 AND condition9 AND condition10)IF NOT ONMARKET AND BreakACH AND Plage THENBUY 1 contract AT MARKET NextBarOpenENDIFIF (TradePrice - LigneBas) < 10 THENSET STOP PRICE (LigneBas - 4)ELSIF (TradePrice - LigneBas) > 10 THENSET STOP PRICE LigneBasENDIFconditionGainLong = (close - PositionPrice) >= 3IF LONGONMARKET AND conditionGainLong THENSELL AT MARKET NextBarOpenENDIFIF NOT ONMARKET AND BreakVTE AND Plage THENSELLSHORT 1 contract AT MARKET NextBarOpenENDIFIF (LigneHaut - TradePrice) < 10 THENSET STOP PRICE (LigneHaut + 4)ELSIF (LigneHaut - TradePrice) > 10 THENSET STOP PRICE LigneHautENDIFconditionGainShort = (PositionPrice - close) >= 3IF SHORTONMARKET AND conditionGainShort THENEXITSHORT AT MARKET NextBarOpenENDIF09/01/2022 at 1:23 PM #200018Je 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.
09/01/2022 at 2:57 PM #200022Bonjour 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
09/05/2022 at 4:06 PM #200189Bonjour 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596//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 = falseDEFPARAM FlatAfter = 223000HeureDebut = 080000HeureFin = 223000Plage = (time >= HeureDebut AND time <= HeureFin)//Calcul du Fisher_Transform :p = 20p1 = 4p2 = 4a1= customcloseb1= highest[p](a1)b2=lowest[p](a1)IF BARINDEX > p+2 THENvb=(a1-b2)/(b1-b2)v1 =exponentialaverage[p1](2*(vb - 0.5))f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))ENDIFFisher = f1Trigger = f1[1]//Conditions pour Ligne_Hautcondition1 = Fisher > 0 AND Trigger > 0condition2 = Fisher CROSSES UNDER Trigger//Conditions pour Ligne_Bascondition3 = Fisher < 0 AND Trigger < 0condition4 = fisher CROSSES OVER TriggerHauta = condition1 AND condition2CrossHaut = (Fisher > 1 AND Trigger > 1)Basa = condition3 AND condition4CrossBas = (Fisher < -1 AND Trigger < -1)IF HAUTa AND CrossHaut THENa = highest[2](high)ENDIFLigneHaut = aIF BASa AND CrossBas THENb = lowest[2](low)ENDIFLigneBas = b//Condition d'ACHcondition5 = close > open //donc vertecondition6 = open < LigneBascondition7 = close > LigneBasBreakACH = (condition5 AND condition6 AND condition7)IF NOT ONMARKET AND BreakACH AND Plage THENop = openBUY 1 contract AT MARKET NextBarOpenENDIFTP = TradePriceIF LONGONMARKET AND (TP - LigneBas) < 10 THENSET STOP PRICE (LigneBas - 4)ELSIF LONGONMARKET AND (TP - LigneBas) > 20 THENSET STOP PRICE (TP - 20)ENDIFconditionGainLong = (close - PositionPrice) >= 3IF LONGONMARKET AND conditionGainLong THENSELL AT MARKET NextBarOpenENDIFcondition8 = open >= TP OR open <= TPcondition9 = close < LigneBas OR (close < LigneBas AND close < op)//STOP sur Reverse ImmédiatStopRev = condition8 AND condition9IF LONGONMARKET AND StopRev THENSELL AT MARKET NextBarOpenENDIF09/05/2022 at 4:19 PM #200191 -
AuthorPosts
Find exclusive trading pro-tools on