Comment coder ? - page 304

 

...

1. En général, non, il n'y a pas d'intérêt à le vérifier puisque la plupart du temps vous aurez beaucoup plus de barres que ce dont vous avez besoin pour qu'une moyenne mobile se "stabilise". Il ne s'agit pas d'un vieux bug, mais d'une simple vérification du nombre de barres dans l'historique.

2. Oui. Gardez juste à l'esprit que iClose() (ainsi que les iOpen(), iHigh() et iLow() similaires) sont des fonctions alors que Close[],Open,High[],Low[] sont de simples tableaux avec un accès beaucoup, beaucoup plus rapide aux valeurs, donc vous devez évaluer si vous avez vraiment besoin de la flexibilité de la fonction plutôt que de la vitesse et de la simplicité de l'accès aux tableaux.

zzz:
Bonjour, je suis nouveau dans la programmation mais pas dans le trading. Je n'ai rien posté pendant un certain temps et maintenant, depuis que j'ai commencé à développer mon EA, j'ai beaucoup de questions. J'ai commencé par construire un indicateur, et une fois qu'il fera ce que je veux, j'irai plus loin. J'ai lu tous les manuels que j'ai pu trouver, alors maintenant il est temps pour moi d'aller de l'avant avec le codage.

Désolé, si c'est un mauvais fil de discussion - s'il vous plaît dites-moi où je devrais poster de telles questions alors.

J'ai 2 questions, probablement basiques, pour le moment, s'il vous plaît :

1. Dans de nombreux indicateurs utilisant des MAs, je vois des lignes vérifiant le nombre de barres sur le graphique. Donc, si j'ai besoin de MA200 et que le graphique n'a que, disons, 100 barres, est-ce que iMA200 fonctionnerait alors ? Je pense que oui - j'ai vérifié et n'importe quelle MA est dessinée sans aucun problème sur n'importe quel graphique, donc je pense que c'est un vieux bug que Metaquotes a corrigé maintenant. Donc, est-il utile de vérifier combien de barres il y a sur le graphique pour dessiner une MA ou utiliser la fonction iMA ?

2. Quelle est la différence entre Close et iClose ? Si je comprends bien, Close ne peut renvoyer que la clôture des barres sur le graphique actuel, et iClose peut renvoyer n'importe quelle clôture de n'importe quelle paire de devises et de n'importe quelle période. Et dans les deux cas, pour obtenir la dernière barre fermée, je dois utiliser l'index [1]. Est-ce que je vois les choses correctement ?

Merci.
 

DoubleStochastic pour MT4, le vrai DoubleStochastic

Bonjour, je suis un nouvel utilisateur de MT4.

J'ai du mal à trouver l'indicateur DoubleStochastic pour MT4. C'était mon indicateur préféré sur la plateforme VTT. Et je veux dire le VRAI DoubleStochastic - pas le Double Stochastic de Bressert qui donne une indication totalement différente du DoubleStochastic original. Voir le fichier joint - Double du VTT donne des indications un peu différentes de Double de MT4 :

Quelqu'un peut-il m'aider à coder le DoubleStochastic du VTT dans MT4 ? Voici le code et la logique du VTT :

Fast %K = ((Today's Close - Lowest Low in %K Periods) / (Highest High in %K Periods - Lowest Low in %K Periods)) * 100

Ralentissement %K = Moyenne mobile sur N périodes du Fast %K

Double %K = ((Slowing %K d'aujourd'hui - Lowest Slowing %K in %K Periods) / (Highest High Slowing %K in %K Periods - Lowest Low Slowing %K in %K Periods)) * 100

Double Slowing %K = Moyenne mobile à N périodes du Double %K

%D = Moyenne mobile simple à 3 périodes du Double Slowing %K

et le code lui-même :

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt) ;

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt) ;

DStD:= Mov(DSt,D,MtD) ;

Quelqu'un maîtrise bien MT4 ?

Je me suis tellement habitué à la version de VTT que je ne peux pas utiliser les autres.

 

...

gmailer

J'ai posté une double stochastique ici : https://www.mql5.com/en/forum/177239/page28 (afin de garder toutes les versions de la stochastique à un seul endroit)

Je pense que c'est ce que vous recherchez.

gmailer:
Bonjour les gars - nouvel utilisateur de MT4.

J'ai du mal à trouver l'indicateur DoubleStochastic pour MT4. C'était mon indicateur préféré sur la plateforme VTT. Et je veux dire le VRAI DoubleStochastic - pas le Double Stochastic de Bressert qui donne une indication totalement différente du DoubleStochastic original. Voir le fichier joint - Double du VTT donne des indications un peu différentes de Double de MT4 :

Quelqu'un peut-il m'aider à coder le DoubleStochastic du VTT dans MT4 ? Voici le code et la logique du VTT :

Fast %K = ((Today's Close - Lowest Low in %K Periods) / (Highest High in %K Periods - Lowest Low in %K Periods)) * 100

Ralentissement %K = Moyenne mobile sur N périodes du Fast %K

Double %K = ((Slowing %K d'aujourd'hui - Lowest Slowing %K in %K Periods) / (Highest High Slowing %K in %K Periods - Lowest Low Slowing %K in %K Periods)) * 100

Double Slowing %K = Moyenne mobile sur N périodes du Double %K

%D = moyenne mobile simple sur 3 périodes du Double Slowing %K

et le code lui-même :

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt) ;

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt) ;

DStD:= Mov(DSt,D,MtD) ;

Quelqu'un maîtrise bien MT4 ?

Je me suis tellement habitué à la version de VTT que je ne peux pas utiliser les autres.
 

Merci, c'est peut-être ça. Savez-vous comment vous débarrasser de ces "points verts et roses" en bas et en haut ?

 

merci mladen. c'est logique.

 

Bonjour à tous,

J'ai du mal à trouver un moyen de déclencher une transaction lorsque ma ligne stochastique traverse la zone de surchauffe (80) ou de survente (20). Je suis capable de déclencher une transaction lorsque ma ligne traverse, mais je ne suis pas capable de la configurer pour qu'elle déclenche une transaction UNIQUEMENT lorsqu'elle se trouve dans la région de surchauffe ou de survente. Quelqu'un a-t-il une idée de la façon dont je peux procéder ou existe-t-il un autre endroit où je peux me référer ?

Je suis tombé sur des sites qui parlaient de fixer certaines valeurs à 20.1 et 80.1 mais rien de plus.

Merci de m'éclairer. Merci.

Salutations

Terrance

 

...

Terrance,

Voici un fil de discussion avec un code pratique qui pourrait servir d'exemple pour ce dont vous avez besoin : https://www.mql5.com/en/forum/179114

tkuan77:
Bonjour à tous,

J'ai du mal à trouver un moyen de déclencher une transaction lorsque ma ligne stochastique traverse la région de surchauffe (80) ou de survente (20). Je suis capable de déclencher une transaction lorsque ma ligne traverse, mais je ne suis pas capable de la configurer pour qu'elle déclenche une transaction UNIQUEMENT lorsqu'elle se trouve dans la région de surchauffe ou de survente. Quelqu'un a-t-il une idée de la façon dont je peux procéder ou existe-t-il un autre endroit où je peux me référer ?

Je suis tombé sur des sites qui parlaient de fixer certaines valeurs à 20.1 et 80.1 mais rien de plus.

Merci de m'éclairer. Merci.

Salutations

Terrance
 

Bonjour, j'ai corrigé les fonctions et j'en suis content maintenant. Cela semble bon. Cependant, le journal des résultats des transactions lorsque je fais un backtest ne contient qu'un seul ordre d'achat. Je pense que cela pourrait être lié à ma fonction GetLots mais je ne suis pas sûr à 100% bien que je l'aie regardé plusieurs fois - pourriez-vous jeter un coup d'œil dessus et me faire savoir si vous trouvez quelque chose qui ne va pas ? Merci.

//--- Fonction de calcul des lots pour les positions longues

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates() ;

double MinLots, MaxLots, LotStep ;

int LotDigit = 2 ;

double LotsLong = 0 ;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2) ; // Les lots doivent être normalisés pour tenir compte du LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2) ; // La normalisation n'arrondit pas, mais coupe toute partie du lot qui est plus grande que LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2) ; // Ainsi, le risque est un peu plus faible.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0 ;

si (LotStep == 1.00) LotDigit = 0 ;

si (LotStep == 0.10) LotDigit = 1 ;

si (LotStep == 0.01) LotDigit = 2 ;

si (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit) ;

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots) ;

retourner (LotsLong) ;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit) ;

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots) ;

retourne (LotsLong) ;

}

 

...

GetLots() dans la forme que j'ai postée est testé et fonctionne comme il se doit. Il n'est pas nécessaire de la modifier. Utilisez-la comme une fonction qui déterminera la taille du lot au moment de l'ouverture de l'ordre. Ne touchez pas au reste de la logique (cette fonction ne doit faire que cela : déterminer la taille de l'ordre en fonction du risque, du stop loss et de l'état actuel du compte ).

Sans le reste du code, je ne peux pas vous aider. Ce serait comme si je pouvais regarder à travers un petit trou et voir le monde entier. C'est impossible. Si vous voulez garder le reste du code secret, je ne peux vous aider qu'avec le code que vous postez ici, et je le répète : soyez assuré que GetLots() dans sa forme originale fonctionne comme il se doit et qu'il doit être utilisé dans sa forme originale.

Si vous voulez l'utiliser avec des résultats variables, changez le risque ou le stop loss alimenté dynamiquement ("décidez" du risque ou du stop loss dans le code avant GetLots() et appelez-le ensuite avec ces risques ou stop loss modifiés - la fonction calculera correctement pour les entrées modifiées données).

crsnape@btinternet.com:
Bonjour, j'ai corrigé les fonctions et je suis satisfait d'elles maintenant. Cela semble bon. Cependant, le journal des résultats des transactions lorsque je fais un backtest ne contient qu'un seul ordre d'achat. Je pense que cela pourrait être lié à ma fonction GetLots mais je ne suis pas sûr à 100% bien que je l'aie regardé plusieurs fois - pourriez-vous jeter un coup d'œil dessus et me faire savoir si vous trouvez quelque chose qui ne va pas ? Merci.

//--- Fonction de calcul des lots pour les positions longues

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates() ;

double MinLots, MaxLots, LotStep ;

int LotDigit = 2 ;

double LotsLong = 0 ;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2) ; // Les lots doivent être normalisés pour tenir compte du LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2) ; // La normalisation n'arrondit pas, mais coupe toute partie du lot qui est plus grande que LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2) ; // Ainsi, le risque est un peu plus faible.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0 ;

si (LotStep == 1.00) LotDigit = 0 ;

si (LotStep == 0.10) LotDigit = 1 ;

si (LotStep == 0.01) LotDigit = 2 ;

si (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit) ;

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots) ;

retourner (LotsLong) ;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit) ;

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit) ;

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots) ;

return (LotsLong) ;

}
 

Bonjour mladen Je suis entièrement d'accord avec vous, la fonction GetLots que vous avez fournie fonctionne comme elle le devrait ; je l'ai testée dans le cadre de mon code et elle a fonctionné.

J'y ai apporté des modifications simplement parce que je veux changer mon taux de risque selon que je gagne ou que je perde. J'ai essentiellement élaboré le code existant (ou du moins j'ai essayé) en incorporant des règles supplémentaires de gestion de l'argent.

Je peux honnêtement dire que mon code n'est pas secret ; je suis sûr que beaucoup d'autres personnes ont considéré et implémenté dans le code ce que j'essaie de faire ; mais je suppose qu'il y a un élément de confidentialité parce que j'ai personnellement passé beaucoup de temps à le développer.

Je vais continuer à réviser mon code, je veux évidemment essayer de résoudre tout problème moi-même, car je suis fier d'apprendre et de faire les choses à partir de zéro.

Mais je comprends votre dernier paragraphe ; j'utiliserai une variable 'Risque' et je modifierai ce risque en fonction de la sortie d'une fonction.

En tout cas, merci d'avoir répondu une fois de plus, ce forum ne serait pas le même sans vous ; vous m'avez aidé un nombre incalculable de fois.

Merci :-)