EA Random by StanFX

Jeff719
Actif
Actif
Messages : 130
Inscription : 23 mai 2017 15:45
Contact :

11 avr. 2018 09:12

StanFX a écrit :
08 avr. 2018 20:46
Avez-vous déjà codé ce type de MM? trading sur équité.
TM201206-2.jpg
C'est précisément celà le TSSF, article ici :TradingAutomatique
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.

Avatar de l’utilisateur
StanFX
Fidèle
Fidèle
Messages : 362
Inscription : 31 mars 2017 16:58

11 avr. 2018 09:26

Jeff719 a écrit :
11 avr. 2018 09:12
C'est précisément celà le TSSF, article ici :TradingAutomatique
;) excelent

Jeff719
Actif
Actif
Messages : 130
Inscription : 23 mai 2017 15:45
Contact :

12 avr. 2018 13:30

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)... ;)
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.

Avatar de l’utilisateur
StanFX
Fidèle
Fidèle
Messages : 362
Inscription : 31 mars 2017 16:58

18 avr. 2018 15:34

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

Avatar de l’utilisateur
StanFX
Fidèle
Fidèle
Messages : 362
Inscription : 31 mars 2017 16:58

20 avr. 2018 10:42

Jeff719 a écrit :
12 avr. 2018 13:30
Ceci avec un booster raisonnable de 20%
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

Jeff719
Actif
Actif
Messages : 130
Inscription : 23 mai 2017 15:45
Contact :

20 avr. 2018 18:54

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. ;)
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.

Avatar de l’utilisateur
StanFX
Fidèle
Fidèle
Messages : 362
Inscription : 31 mars 2017 16:58

21 avr. 2018 01:41

Jeff719 a écrit :
20 avr. 2018 18:54
Oui, c'est un optimum, mais face à quel critère ?
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);
}


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;
}
Quelqu'un voit-il le conflit ? peut-être au niveau du OrdersHistoryTotal.
Jeff719 a écrit :
20 avr. 2018 18:54
c'est un vrai bonheur d'échanger avec un érudit du mm
C'est réciproque ; )

Avatar de l’utilisateur
StanFX
Fidèle
Fidèle
Messages : 362
Inscription : 31 mars 2017 16:58

21 avr. 2018 11:52

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

Image

perf brut vs mm uniquement sur les gains:

Image

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

Jeff719
Actif
Actif
Messages : 130
Inscription : 23 mai 2017 15:45
Contact :

23 avr. 2018 17:05

StanFX a écrit :
21 avr. 2018 01:41
Quelqu'un voit-il le conflit ? peut-être au niveau du OrdersHistoryTotal.
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) :
ForOrderHistory.PNG
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.

Avatar de l’utilisateur
StanFX
Fidèle
Fidèle
Messages : 362
Inscription : 31 mars 2017 16:58

23 avr. 2018 21:14

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)
Jeff719 a écrit :
23 avr. 2018 17:05
Etant donné qu'on parle de bug ou de disfonctionnement bizare, les choses sous souvent subtiles
Exact merci ; ) maintenant je peux continuer mes tests

Répondre
  • Information
  • Qui est en ligne ?

    Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 0 invité