Profit Trailing (on close) ...comment convertir tick by tick ?!
23 réponses
Gaudio Fx
Il y a 8 ans #115026
mikeyc
Il y a 8 ans #136500
//+------------------------------------------------------------------+ /** * gérer le trade - déplacer le SL pour atteindre le seuil de rentabilité ou le trailing stop */ void manageStop() { if(!sqIsBarOpen) return ; ... reste du code
Si vous commentez le :
if(!sqIsBarOpen) return ;
ligne comme :
// if(!sqIsBarOpen) return ;
Ensuite, la fonction manageStop s'exécutera pour chaque tick, et tous les types de mouvements de stop loss se produiront chaque tick là où c'est nécessaire. Cela entraînera une charge de travail beaucoup plus importante pour l'unité centrale de l'ordinateur.
geektrader
Il y a 8 ans #136504
.... et cela ruinera votre stratégie. Vous verrez que dans 99% des cas, l'exécution d'une stratégie avec un trailing par tick au lieu d'un bar open (comme il a été créé par SQ) résultera en une courbe d'équité négative. C'est simplement parce que la stratégie a été trouvée par SQ avec un trailing sur barre et a été créée comme cela. Accélérer le trailing comme cela changera complètement la stratégie et ne vous apportera rien de bon, mais vous verrez ce que je veux dire lorsque vous ferez vos tests dans MT4 avec un trailing by tick au lieu d'un bar open ;)
Gaudio Fx
Il y a 8 ans #136505
//+------------------------------------------------------------------+ /** * gérer le trade - déplacer le SL pour atteindre le seuil de rentabilité ou le trailing stop */ void manageStop() { if(!sqIsBarOpen) return ; ... reste du codeSi vous commentez le :
if(!sqIsBarOpen) return ;
ligne comme :
// if(!sqIsBarOpen) return ;
Ensuite, la fonction manageStop s'exécutera pour chaque tick, et tous les types de mouvements de stop loss se produiront chaque tick là où c'est nécessaire. Cela entraînera une charge de travail beaucoup plus importante pour l'unité centrale de l'ordinateur.
Merci pour votre réponse, mon ami. J'ai donc commenté "if(!sqlsBarOpen) return ;" avec " // " et le résultat est le suivant :
de ce code standard ...
à ce :
mikeyc
Il y a 8 ans #136510
Seule la getProfitTrailingByTick aura un effet si elle est définie avec un nombre de pips comme valeur de retour (celle-ci est vide, donc ne fait rien).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valeur longue ici else if (OrderType() == OP_SELL) { // valeur courte ici } return(0) ; }
L'autre type de suivi d'arrêt (qui utilise un ou plusieurs indicateurs) sera toujours suivi à la clôture, car la valeur de l'indicateur ne change que chaque barre :
double getStopTrailingByClose() { double value = 0 ; if (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1) + (0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1))) ; } else if (OrderType() == OP_SELL) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1) + (-0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1))) ; } return(value) ; }
Gaudio Fx
Il y a 8 ans #136513
Seule la getProfitTrailingByTick aura un effet si elle est définie avec un nombre de pips comme valeur de retour (celle-ci est vide, donc ne fait rien).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valeur longue ici else if (OrderType() == OP_SELL) { // valeur courte ici } return(0) ; }L'autre type de suivi d'arrêt (qui utilise un ou plusieurs indicateurs) sera toujours suivi à la clôture, car la valeur de l'indicateur ne change que chaque barre :
double getStopTrailingByClose() { double value = 0 ; if (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1) + (0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1))) ; } else if (OrderType() == OP_SELL) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1) + (-0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1))) ; } return(value) ; }
Désolé... mais pas de run by tick 🙁 Je compile de cette manière mais je n'ai pas de trailing by tick ... ce n'est pas correct ?
mikeyc
Il y a 8 ans #136514
D'accord, c'est un peu plus compliqué du fait que la fonction manageStop utilise Close[1] comme prix actuel. Bien sûr, ce prix ne change qu'à chaque barre, donc le stop n'est déplacé qu'à chaque barre.
//------------------------------ // profit trailing on TICK !!!!! trailingStopValue = getProfitTrailingByTick() ; if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Bid - trailingStopValue ; } else { tsLevel = Ask + trailingStopValue ; }
Modifiez le code comme indiqué ci-dessus, en remplaçant close par Bid et Ask.
Gaudio Fx
Il y a 8 ans #136515
D'accord, c'est un peu plus compliqué du fait que la fonction manageStop utilise Close[1] comme prix actuel. Bien sûr, ce prix ne change qu'à chaque barre, donc le stop n'est déplacé qu'à chaque barre.//------------------------------ // profit trailing on TICK !!!!! trailingStopValue = getProfitTrailingByTick() ; if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Bid - trailingStopValue ; } else { tsLevel = Ask + trailingStopValue ; }Modifiez le code comme indiqué ci-dessus, en remplaçant close par Bid et Ask.
J'ai changé le Bid & Ask ... mais jamais changé... pas de trace 🙁
mikeyc
Il y a 8 ans #136516
J'ai effectué ces modifications et le traçage par la tique a fonctionné pour moi :
211 2015.08.24 02:45 acheter 11 1,00 1,56723 0,00000 0,00000 0,00 9788,26
212 2015.08.24 02:45 modifier 11 1,00 1,56723 1,54657 0,00000 0,00 9788,26
213 2015.08.24 02:50 modifier 11 1,00 1,56723 1,56723 0,00000 0,00 9788,26
214 2015.08.24 02:52 modifier 11 1,00 1,56723 1,56724 0,00000 0,00 9788,26
215 2015.08.24 02:52 modifier 11 1,00 1,56723 1,56725 0,00000 0,00 9788,26
216 2015.08.24 02:52 modifier 11 1,00 1,56723 1,56726 0,00000 0,00 9788,26
217 2015.08.24 02:52 modifier 11 1,00 1,56723 1,56727 0,00000 0,00 9788,26
218 2015.08.24 02:52 modifier 11 1,00 1,56723 1,56728 0,00000 0,00 9788,26
219 2015.08.24 02:53 modifier 11 1,00 1,56723 1,56729 0,00000 0,00 9788,26
220 2015.08.24 02:53 modifier 11 1,00 1,56723 1,56732 0,00000 0,00 9788,26
221 2015.08.24 02:53 modifier 11 1,00 1,56723 1,56734 0,00000 0,00 9788,26
222 2015.08.24 02:53 modifier 11 1,00 1,56723 1,56737 0,00000 0,00 9788,26
223 2015.08.24 02:53 modifier 11 1,00 1,56723 1,56739 0,00000 0,00 9788,26
224 2015.08.24 02:53 modifier 11 1,00 1,56723 1,56740 0,00000 0,00 9788,26
225 2015.08.24 02:56 s/l 11 1,00 1,56740 1,56740 0,00000 10,73 9798,99
Gaudio Fx
Il y a 8 ans #136519
geektrader
Il y a 8 ans #136530
Vous devez également supprimer la ligne "if (OrderOpenTime() >= Time[0])...", car elle quitte la fonction à ce stade tant que l'ordre n'est pas ouvert depuis au moins une mesure. Il ne commencera donc à suivre (par tic-tac dans votre cas) qu'une mesure après l'ouverture de l'ordre. Si vous supprimez cette ligne, il commencera immédiatement 1 tick après l'ouverture de l'ordre.
Je continue à vous dire que cela ne mènera à rien de plus rentable que votre stratégie originale, ce sera pire, bien pire de traîner par tick, si la stratégie a été créée avec un traçage sur la barre. Vous tuez toute la stratégie de cette façon, car les ordres suivants seront également affectés par la clôture anticipée des ordres précédents. C'est le meilleur moyen de se débarrasser de son argent, mais il semble qu'il faille apprendre à la dure :)
geektrader
Il y a 8 ans #136532
//+------------------------------------------------------------------+ /** * gérer le trade - déplacer le SL pour atteindre le seuil de rentabilité ou le trailing stop */ void manageStop() { //if(!sqIsBarOpen) return ; double trailingStopValue, moveSLValue ; double orderSL, normalOrderSL, orderOpen ; double close = Close[0] ; double tsLevel, newSL ; for(int i=0 ; i= Time[0]) continue ; // exit si l'ordre vient d'être ouvert //------------------------------ // profit trailing à la clôture trailingStopValue = getProfitTrailingByTick() ; if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = close - trailingStopValue ; } else { tsLevel = close + trailingStopValue ; } orderSL = OrderStopLoss() ; normalOrderSL = getNormalSL(orderSL) ; newSL = getSpecialSL(tsLevel) ; if(OrderType() == OP_BUY) { if(isSLCorrect(tsLevel) && (orderSL == 0 || normalOrderSL tsLevel) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0) ; } } } //-------------------------------------------------------- // gérer le trailing stop sur la clôture trailingStopValue = getStopTrailingByClose() ; if(trailingStopValue > 0) { orderOpen = OrderOpenPrice() ; orderSL = OrderStopLoss() ; normalOrderSL = getNormalSL(orderSL) ; newSL = getSpecialSL(trailingStopValue) ; if(OrderType() == OP_BUY) { if(isSLCorrect(trailingStopValue) && (orderSL == 0 || normalOrderSL trailingStopValue) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0) ; } } } //-------------------------------------------------------- // gérer SL 2 BE (par tic) moveSLValue = getMoveSLValueByTick() ; if(moveSLValue > 0) { orderSL = OrderStopLoss() ; normalOrderSL = getNormalSL(orderSL) ; orderOpen = OrderOpenPrice() ; newSL = getSpecialSL(orderOpen) ; if(OrderType() == OP_BUY) { if(isSLCorrect(orderOpen) && (close - orderOpen >= moveSLValue) && (orderSL == 0 || normalOrderSL = moveSLValue) && (orderSL == 0 || normalOrderSL > orderOpen) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), orderOpen, newSL, OrderTakeProfit(), 0) ; } } } } } } //+------------------------------------------------------------------+
Voici le code complet à remplacer, qui tracera votre commande tic-tac par tic-tac.
Gaudio Fx
Il y a 8 ans #136542
... merci beaucoup geektrader 😀 ... j'essaierai une fois et je vous tiendrai au courant.
Gaudio Fx
Il y a 8 ans #136545
Gaudio Fx
Il y a 8 ans #136616
geektrader
Il y a 8 ans #136634
NON, SQ ne créera que des stratégies avec trailing sur BAR CLOSE comme expliqué plusieurs fois ici et dans d'autres fils de discussion. La seule chose que vous pouvez faire est d'exporter un EA pour MT4 qui suit le TICK en modifiant le code MQL4 de la façon dont nous l'avons déjà affiché pour vous plusieurs fois dans ce fil. Cela ne changera RIEN au fait que SQ STILL ne crée des stratégies avec trailing qu'à la fermeture de la barre. La raison pour laquelle c'est le cas a également été expliquée dans le Forum (par moi et d'autres) à plusieurs reprises.