C'est précisément celà le TSSF, article ici :TradingAutomatique
EA Random by StanFX
Les informations présentées ne peuvent être considérées ni comme un conseil en investissement, ni comme une recommandation d'investissement. Il s'agit de commentaires généraux sur les marchés et de raisonnements que l'on peut tenir à leur sujet.
excelent
Je crois que c'est une mauvaise idée de mélanger les deux sujets : les lots plus grand des séries de gains et les lots plus faibles des séries de pertes. Ce sont les même calculs et raisonnements mais il me semble qu'on peut les étudier séparément.
A un moment je me suis demandé ce qu'on perdait quand on rencontrait un perte. Quelle proportion de la somme des gains précédents ? Est-ce que ça dépend de la durée de la série (N positions gagnantes de suite). Ça dépend de la vitesse à laquelle on augmente les lots sans doute. Ce n'est pas forcé, car plus on augment les lots vite, plus méchante va être la perte.
Faisons un petit modèle :
N = nombre de trades gagnants.
Soit le lots de base (quand on ouvre après une perte on retourne au lot de base) = Lot1.
Gains de base = Lot1 * TP * Compta.
(La Compta c'est le fait que les pips ne sont pas constants en % de l'actif d'une part, et que la monnaie de l'account n'est pas forcément la monnaie de contrepartie qui définit la taille des lots sur le Forex - c'est pourquoi on a parfois besoin d'une autre paire pour faire la compta de l'account. L'approximation consistant à supposer Compta constant ne changera pas grand chose au résultat.)
Soit le gain lors d'une série (on oublie l'ajustement comptable vu qu'on va faire un ratio) :
SGain = Lot1 * TP + Lot1 * TP * ( 1+k) + Lot1 * TP * (1+k)Puissance(2)+........ + Lot1 * TP * (1+k)Puissance(N-1)
k c'est la vitesse d'augmentation des lots. Si on augmente de 20% à chaque fois, k=0.2
Soit la 1ère perte rencontrée :
Perte = Lot1 * TP * (1+k)Puissance(N).
On se demande alors ce que fait la perte quand elle arrive après une série de gain. Perd on 50% ? plus ? moins ? Ça dépend sans doute de N et de k. Est-ce que le résultat nous invitera à ajuter le réglage de k ?
On commence par résoudre la série S = 1 + X + X^2 + X^3 + ....... + X^N
Si on multiplie en haut et en bas par X-1 on elimine tous les termes intermédiaire et on a :
S = ( X^(N+1) - 1 ) / ( X - 1 )
Ce qui fait quand on reporte SGain et qu'on divise par la perte (on veut savoir qu'elle proportion de la somme des gains on rend lors de la perte) :
SGain / Perte
= ( ( (1+k)^N - 1) / ( 1+k - 1 ) ) / ( 1+k )^N
= ( (1+k)^N - 1 ) /
k * (1+k)^N
= 1/k - 1 / ( k * (1+k)^N
On s'est débarassé de Lot1*TP, constantes qui se sont simplifiées lors du ratio.
On vérifie qu'il n'y a pas d'erreur de calcul, par exemple N=4 et k=0.2 (on étudie 5 trades au total, le dernier est perdant)
SGain = Lot1*TP + Lot1*TP * 1.2 + Lot1*TP * 1.44 + Lot1*TP * 1.728
Perte= Lot1*TP * 2.0736
DDratio = 2.0736 / 5.368 = 0.386
Avec la formule :
SGain/Perte = 1/0.2 - 1/(0.2*1.2^4) = 2.589
DDratio = 1/Sgain/Perte = 0.386
La formule est bonne (on rend 39% des gains)
On voit bien que ça dépent de N et de k, et qu'il n'est pas facile de deviner intuitivement l'ordre de grandeur.
Au cas où N=1 (un gain suivi d'une perte) :
N=1 : SGain/Perte = 1/0.2 - 1 / (0.2 * 1.2) = 0.83 (C'est l'enorme effet anti martingale que l'on va subir quand vont s'enchainer gains et pertes une fois sur 2).
N=2 : SGain/Perte = 1/0.2 - 1 / (0.2 * 1.44 ) = 1.53 (DDratio=65%)
N=3 : = 2.1 (DDratio=48%)
N=4 : = 2.6 (DDratio=38%)
N=5 : = 2.99 ( DDratio=33%)
On voit qu'on rend de moins en moins en proportion à mesure que N augmente. Ceci avec un booster raisonnable de 20%.
Peut être est-ce différent quand on prend un k + fort.
S'il y en a qui veulent s'amuser sur Excel ou Mathlab pour explorer (k,N)...
A un moment je me suis demandé ce qu'on perdait quand on rencontrait un perte. Quelle proportion de la somme des gains précédents ? Est-ce que ça dépend de la durée de la série (N positions gagnantes de suite). Ça dépend de la vitesse à laquelle on augmente les lots sans doute. Ce n'est pas forcé, car plus on augment les lots vite, plus méchante va être la perte.
Faisons un petit modèle :
N = nombre de trades gagnants.
Soit le lots de base (quand on ouvre après une perte on retourne au lot de base) = Lot1.
Gains de base = Lot1 * TP * Compta.
(La Compta c'est le fait que les pips ne sont pas constants en % de l'actif d'une part, et que la monnaie de l'account n'est pas forcément la monnaie de contrepartie qui définit la taille des lots sur le Forex - c'est pourquoi on a parfois besoin d'une autre paire pour faire la compta de l'account. L'approximation consistant à supposer Compta constant ne changera pas grand chose au résultat.)
Soit le gain lors d'une série (on oublie l'ajustement comptable vu qu'on va faire un ratio) :
SGain = Lot1 * TP + Lot1 * TP * ( 1+k) + Lot1 * TP * (1+k)Puissance(2)+........ + Lot1 * TP * (1+k)Puissance(N-1)
k c'est la vitesse d'augmentation des lots. Si on augmente de 20% à chaque fois, k=0.2
Soit la 1ère perte rencontrée :
Perte = Lot1 * TP * (1+k)Puissance(N).
On se demande alors ce que fait la perte quand elle arrive après une série de gain. Perd on 50% ? plus ? moins ? Ça dépend sans doute de N et de k. Est-ce que le résultat nous invitera à ajuter le réglage de k ?
On commence par résoudre la série S = 1 + X + X^2 + X^3 + ....... + X^N
Si on multiplie en haut et en bas par X-1 on elimine tous les termes intermédiaire et on a :
S = ( X^(N+1) - 1 ) / ( X - 1 )
Ce qui fait quand on reporte SGain et qu'on divise par la perte (on veut savoir qu'elle proportion de la somme des gains on rend lors de la perte) :
SGain / Perte
= ( ( (1+k)^N - 1) / ( 1+k - 1 ) ) / ( 1+k )^N
= ( (1+k)^N - 1 ) /
k * (1+k)^N
= 1/k - 1 / ( k * (1+k)^N
On s'est débarassé de Lot1*TP, constantes qui se sont simplifiées lors du ratio.
On vérifie qu'il n'y a pas d'erreur de calcul, par exemple N=4 et k=0.2 (on étudie 5 trades au total, le dernier est perdant)
SGain = Lot1*TP + Lot1*TP * 1.2 + Lot1*TP * 1.44 + Lot1*TP * 1.728
Perte= Lot1*TP * 2.0736
DDratio = 2.0736 / 5.368 = 0.386
Avec la formule :
SGain/Perte = 1/0.2 - 1/(0.2*1.2^4) = 2.589
DDratio = 1/Sgain/Perte = 0.386
La formule est bonne (on rend 39% des gains)
On voit bien que ça dépent de N et de k, et qu'il n'est pas facile de deviner intuitivement l'ordre de grandeur.
Au cas où N=1 (un gain suivi d'une perte) :
N=1 : SGain/Perte = 1/0.2 - 1 / (0.2 * 1.2) = 0.83 (C'est l'enorme effet anti martingale que l'on va subir quand vont s'enchainer gains et pertes une fois sur 2).
N=2 : SGain/Perte = 1/0.2 - 1 / (0.2 * 1.44 ) = 1.53 (DDratio=65%)
N=3 : = 2.1 (DDratio=48%)
N=4 : = 2.6 (DDratio=38%)
N=5 : = 2.99 ( DDratio=33%)
On voit qu'on rend de moins en moins en proportion à mesure que N augmente. Ceci avec un booster raisonnable de 20%.
Peut être est-ce différent quand on prend un k + fort.
S'il y en a qui veulent s'amuser sur Excel ou Mathlab pour explorer (k,N)...
Les informations présentées ne peuvent être considérées ni comme un conseil en investissement, ni comme une recommandation d'investissement. Il s'agit de commentaires généraux sur les marchés et de raisonnements que l'on peut tenir à leur sujet.
Sympa les calculs, je n'ai pas recodé depuis mais bientôt et je testerai si la combinaison des 2 approches est plus intéressante ou non
Après plusieurs optimisations différentes du mm j'ai obtenu le même résultat que toi, un boost de 20% est le ratio parfait
Oui, c'est un optimum, mais face à quel critère ?
Le max rendement de long terme est un critère.
Mais il est antinomique avec la durée de HWM (combien de temps dure une période négative).
Par exemple un taux (on rappelle qu'on peut augmenter chaque pose de 10, 20, 30%, à vous de choisir) de 20% produit de longues baisses qui durent longtemps, puis quelques pics mirifiques.
L'antimartingale est musclée si je me souviens bien ( on récuprère 83% des mises lors de séries une fois sur deux). Mais les pics sont sérieux.
Alors les alternatives sont simples :
- 10% et on subira moins d'antimartingale lors de période douces et en contreparie les pics seront moins mirifiques.
- 30% et le jackpot est monstrueux en échange du fait que les longues périodes modestes sont perdantes.
Personnelement je perçoit 0.2 comme un peu trop, cependant ça dépend fortement de la stratégie sous jacente.
PS: c'est un vrai bonheur d'échanger avec un érudit du mm, y en a pas beaucoup.
Le max rendement de long terme est un critère.
Mais il est antinomique avec la durée de HWM (combien de temps dure une période négative).
Par exemple un taux (on rappelle qu'on peut augmenter chaque pose de 10, 20, 30%, à vous de choisir) de 20% produit de longues baisses qui durent longtemps, puis quelques pics mirifiques.
L'antimartingale est musclée si je me souviens bien ( on récuprère 83% des mises lors de séries une fois sur deux). Mais les pics sont sérieux.
Alors les alternatives sont simples :
- 10% et on subira moins d'antimartingale lors de période douces et en contreparie les pics seront moins mirifiques.
- 30% et le jackpot est monstrueux en échange du fait que les longues périodes modestes sont perdantes.
Personnelement je perçoit 0.2 comme un peu trop, cependant ça dépend fortement de la stratégie sous jacente.
PS: c'est un vrai bonheur d'échanger avec un érudit du mm, y en a pas beaucoup.
Les informations présentées ne peuvent être considérées ni comme un conseil en investissement, ni comme une recommandation d'investissement. Il s'agit de commentaires généraux sur les marchés et de raisonnements que l'on peut tenir à leur sujet.
J'ai testé différent paramètre au niveau signal et SL&TP et il s’avère qu'un boost de 20% était globalement le meilleur compromis.
Voici la version en diminuant uniquement l'exposition sur une série de perte:
https://www.myfxbook.com/strategies/sta ... rse/141293
Version brut avec les mêmes entrées & sorties:
https://www.myfxbook.com/strategies/sta ... rut/140331
On peut constater au niveau graph que la perf en diminuant l'expo sur une série perdante est meilleure.
Je pense que je peux encore filtrer le signal pour augmenter les séries gagnantes mais je verrai plus tard.
Pour le moment je ne n'arrive pas à combiner les deux mm, séparément ça marche très bien donc il doit avoir un simple conflit.
Voici le code pour la gestion des séries gagnantes:
Hors-sujet
if(AllowAntiMartingaleWin)
{
closeTime = 0;
while(j<OrdersHistoryTotal()-1)
{
if(OrderSelect(OrdersHistoryTotal()-1-j,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==magic && OrderSymbol()==Symbol() && OrderType()!=OP_BUYSTOP && OrderType()!=OP_SELLSTOP)
{
if((j>0 && closeTime!=OrderCloseTime()) || j==0)
{
if(hWin==NbOrdersToTrigAntiMartingaleWin)
break;
hWin++;
if(OrderProfit()>0)
{
cptWin++;
closeTime = OrderCloseTime();
Print("trig martingale2 ticket Win",OrderTicket());
if(firstWin) {lotForMartWin=OrderLots();firstWin=false;}
}
}
}
else if(OrdersHistoryTotal() == 0)
break;
j++;
}
if(cptWin==NbOrdersToTrigAntiMartingaleWin && (NbOrdersToReturn>cptReturn || !ReturnToInitLot))
start_lot = NormalizeDouble(MathFloor(NormalizeDouble(Coeff_AntiMartingaleWin * lotForMartWin,2)/0.01)/(Step/0.01)*Step,2);
}
{
closeTime = 0;
while(j<OrdersHistoryTotal()-1)
{
if(OrderSelect(OrdersHistoryTotal()-1-j,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==magic && OrderSymbol()==Symbol() && OrderType()!=OP_BUYSTOP && OrderType()!=OP_SELLSTOP)
{
if((j>0 && closeTime!=OrderCloseTime()) || j==0)
{
if(hWin==NbOrdersToTrigAntiMartingaleWin)
break;
hWin++;
if(OrderProfit()>0)
{
cptWin++;
closeTime = OrderCloseTime();
Print("trig martingale2 ticket Win",OrderTicket());
if(firstWin) {lotForMartWin=OrderLots();firstWin=false;}
}
}
}
else if(OrdersHistoryTotal() == 0)
break;
j++;
}
if(cptWin==NbOrdersToTrigAntiMartingaleWin && (NbOrdersToReturn>cptReturn || !ReturnToInitLot))
start_lot = NormalizeDouble(MathFloor(NormalizeDouble(Coeff_AntiMartingaleWin * lotForMartWin,2)/0.01)/(Step/0.01)*Step,2);
}
Et le code pour la gestion des séries perdantes:
Hors-sujet
if(AllowAntiMartingaleLoss)
{
closeTime = 0;
while(j<OrdersHistoryTotal()-1)
{
if(OrderSelect(OrdersHistoryTotal()-1-j,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==magic && OrderSymbol()==Symbol() && OrderType()!=OP_BUYSTOP && OrderType()!=OP_SELLSTOP)
{
if((j>0 && closeTime!=OrderCloseTime()) || j==0)
{
if(hLoss==NbOrdersToTrigAntiMartingaleLoss)
break;
hLoss++;
if(OrderProfit()<0)
{
cptLoss++;
closeTime = OrderCloseTime();
Print("trig martingale2 ticket Loss",OrderTicket());
if(firstLoss) {lotForMartLoss=OrderLots();firstLoss=false;}
}
}
}
else if(OrdersHistoryTotal() == 0)
break;
j++;
}
if(cptLoss==NbOrdersToTrigAntiMartingaleLoss && (NbOrdersToReturnLoss>cptReturn || !ReturnToInitLotLoss))
start_lot = 0.01;
}
{
closeTime = 0;
while(j<OrdersHistoryTotal()-1)
{
if(OrderSelect(OrdersHistoryTotal()-1-j,SELECT_BY_POS,MODE_HISTORY) && OrderMagicNumber()==magic && OrderSymbol()==Symbol() && OrderType()!=OP_BUYSTOP && OrderType()!=OP_SELLSTOP)
{
if((j>0 && closeTime!=OrderCloseTime()) || j==0)
{
if(hLoss==NbOrdersToTrigAntiMartingaleLoss)
break;
hLoss++;
if(OrderProfit()<0)
{
cptLoss++;
closeTime = OrderCloseTime();
Print("trig martingale2 ticket Loss",OrderTicket());
if(firstLoss) {lotForMartLoss=OrderLots();firstLoss=false;}
}
}
}
else if(OrdersHistoryTotal() == 0)
break;
j++;
}
if(cptLoss==NbOrdersToTrigAntiMartingaleLoss && (NbOrdersToReturnLoss>cptReturn || !ReturnToInitLotLoss))
start_lot = 0.01;
}
C'est réciproque ; )
j'ai affiné le signal brut, vous pouvez voir la différence en utilisant un mm uniquement sur les pertes, ça permet de diminuer le DD et de lisser la perf
perf brut vs mm uniquement sur les gains:
combiner les 2 mm permettrait de diminuer le risk tout en donnant la chance au jackpot
@Eric ) ne pas faire attention au %, le lot de départ n'a pas été ajusté par rapport au capital
perf brut vs mm uniquement sur les gains:
combiner les 2 mm permettrait de diminuer le risk tout en donnant la chance au jackpot
@Eric ) ne pas faire attention au %, le lot de départ n'a pas été ajusté par rapport au capital
Sans vouloir être condescendant, ton code n'est pas très lisible. Etant donné qu'on parle de bug ou de disfonctionnement bizare, les choses sous souvent subtiles avec effets de bord ou limites.
On a plein de variables dont on ne voit pas les déclarations, pas les inits, pas les usages par d'autres bouts de code. Donc pas la moindre idée de trouver où ça peut déconner.
On ne sait pas à quoi est initialisé j quand on rentre dans le while ( zéro ? ).
J'ai cru un moment à une interraction sur j utilisé par win et j utilisé pas loose mais c'est sans doute pas ça.
Habituellement, quand on a un pavé d'instuction il est plus lisible de déclarer des variables locales, cad qu'on déclare i,j, VarTmp, etc... juste avant de s'en servir. On voit comment on les inits, si on veut les mémoriser d'un tick à l'autre on les déclare statique - on peut faire ça n'importe ou, sauf dans une classe bien sûr.
Pour éviter les emmerdes, quand on a deux pavés (les Win et les Loose - ce peut être les traitements Buy et les Sell) on évite d'avoir un même nom de variable même si tout doubler peut sembler inutile. Là on a des variables qui ont le même nom et dont on ne sait pas s'il y a des static qui mémorisent des trucs (dont la logique serait bousillée par l'autre pavé).
Par ailleurs il y a des sophistications sans doute fondées, mais qui sans les commentaires rendent les variables peu compréhensibles (lots capés à 2 lots, le step : MarketInfo(Symbol(),MODE_LOTSTEP), NbOrdersToReturn....).
J'ai trouvé firstWin=false; mais pas de firstWin=true; du coup j'ai rien compris.
Je n'ai pas compris l'usage de OrderCloseTime() - Attention au fait qu'on s'en sert habituellement pour filtrer les ordres annulés qui ont un close time à zéro.
Bref j'ai échoué.
Personnellement j'aurais fait une écriture beaucoup plus lite (mais j'ai du rater des trucs) :
Les informations présentées ne peuvent être considérées ni comme un conseil en investissement, ni comme une recommandation d'investissement. Il s'agit de commentaires généraux sur les marchés et de raisonnements que l'on peut tenir à leur sujet.
Problème résolu, enfaite j'ai oublié de différencier le J pour les Wins et le J pour les Loss
while(jWin<OrdersHistoryTotal()-1)
while(jLoss<OrdersHistoryTotal()-1)
while(jWin<OrdersHistoryTotal()-1)
while(jLoss<OrdersHistoryTotal()-1)
Exact merci ; ) maintenant je peux continuer mes tests
-
- Information
-
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 0 invité