Comment coder ? - page 305

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

Désolé - je regardais en fait mon autre Stoch où de tels points sont présents. Celui suggéré en réponse à mon premier message était correct. Merci !

 

Peut-être juste un conseil :

Lorsque vous avez une "brique" (une fonction, un snippet, une partie de code) qui fonctionne bien, ne la modifiez pas. Les fonctions sont bonnes car vous pouvez changer leurs entrées et elles fonctionnent en fonction des entrées. Et, une fois que vous avez testé les fonctions dans toutes sortes de situations, vous n'avez pas à vous demander si elles fonctionnent bien. De cette façon, vous pouvez réduire le code que vous devez regarder lorsque vous cherchez des erreurs (et cela peut accélérer considérablement le temps de développement).

crsnape@btinternet.com:
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'ai fait des changements simplement parce que je veux changer mon peramètre de risque selon que je gagne ou perde. J'ai essentiellement élaboré le code existant (ou essayé de le faire) 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 :-)
 

Je ne suis pas sûr des parenthèses de fonction et de ce qu'elles contiennent.

Si j'écris une fonction à l'intérieur d'une fonction, dois-je mettre le nom de cette fonction entre parenthèses ?

Par exemple, si j'ai une fonction LastOpenTicket() et que celle-ci est appelée dans une fonction appelée GetLots, dois-je mettre LastOpenTicket() entre parenthèses, comme GetLots (LastOpenTicket()) ?

Dois-je également mettre le () à l'intérieur ? Et si c'est LastOpenTicket (int number, int digit, int anotherone), est-ce que tout cela doit être mis dans la parenthèse de la fonction GetLots dans ce cas, par exemple GetLots (int number, int digit, int anotherone... et toute autre variable dans la fonction etc...) ?

 

...

1. Imaginez la paire de parenthèses {} comme "début" et "fin".

2. Vous ne pouvez pas écrire de fonctions imbriquées dans mql (pascal le permet, mais pas mql - les fonctions imbriquées consisteraient à déclarer une fonction dans le corps d'autres fonctions. Voir ici : Nested function - Wikipedia, the free encyclopedia). 2. vous pouvez placer un appel à n'importe quelle fonction dans n'importe quelle partie de votre code

3. vous pouvez utiliser cette forme d'appel (un appel direct, comme votre exemple GetLots (LastOpenTicket())) ou vous pouvez assigner le retour de LastOpenTicket() à une variable et ensuite l'utiliser comme argument dans un appel à GetLots()

crsnape@btinternet.com:
Je ne suis pas sûr des parenthèses de la fonction et de ce qu'elles contiennent.

Si j'écris une fonction à l'intérieur d'une fonction, dois-je mettre le nom de cette fonction entre parenthèses ?

Par exemple, si j'ai une fonction LastOpenTicket() et que celle-ci est appelée dans une fonction appelée GetLots, dois-je mettre LastOpenTicket() entre parenthèses, comme GetLots (LastOpenTicket()) ?

Dois-je également mettre le () à l'intérieur ? Et si c'est LastOpenTicket (int number, int digit, int anotherone), est-ce que tout cela doit être mis dans les parenthèses de la fonction GetLots dans ce cas, par exemple GetLots (int number, int digit, int anotherone... et toute autre variable dans la fonction etc...) ?
 

Quelle est la différence entre les deux ? Y en a-t-il une ?

double GetLots (int number, int call, int specialcall, int order)

{

et...

double GetLots ()

{

int nombre ;

int call ;

int specialcall ;

int order ;

?

 

...

La première est une fonction acceptant des arguments

La seconde est une fonction sans arguments, vous ne pouvez donc pas modifier les valeurs "number", "call", "specialcall" et "order" en dehors du corps de la fonction.

Vous trouverez d'autres informations utiles sur la déclaration des fonctions sur ce fil de discussion : https://www.mql5.com/en/forum/173005

crsnape@btinternet.com:
Quelle est la différence entre les deux ? Y en a-t-il une ?

double GetLots (int number, int call, int specialcall, int order)

{

et...

double GetLots ()

{

int nombre ;

int call ;

int specialcall ;

int order ;

?
 

J'ai joué avec mes fonctions ces deux derniers jours et j'obtiens toujours des résultats vierges. Je m'arrache littéralement les cheveux.

J'ai modifié la fonction pour calculer RiskSize comme vous l'avez suggéré (je suis d'accord que c'est un meilleur système maintenant) et je l'ai utilisé dans ma fonction GetLots. La voici :

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates() ;

double MinLots, MaxLots, LotStep ;

double LotsLong = 0 ;

int LotDigit = 2 ;

int Risk = GetRiskLong (RiskLong) ;

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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

retourne (LotsLong) ;

}

Il se plaint également de RiskLong - variable non définie. Mais cette variable est définie dans la fonction GetRiskLong qu'il appelle.

S'il est difficile de vous aider avec le code que j'ai posté, puis-je vous l'envoyer ?

 

...

Tout d'abord, il n'est pas nécessaire de faire des lots séparés pour un long et pour un court. Utilisez une seule fonction (qui vous a déjà été fournie) pour les deux types d'ordres (le calcul de la taille du lot pour les deux, court et long, doit être exactement le même). Modifiez simplement le risque ou la distance du stop loss si vous souhaitez un calcul différent.

L'erreur que vous obtenez est due au fait que les variables déclarées dans les fonctions ne sont "visibles" que dans les fonctions. Cela n'a pas d'importance que vous appeliez la fonction qui a une variable appelée du nom que vous dites : elle est locale à la seule fonction appelée, les autres parties du code ne la "connaissent" pas et ne peuvent pas y accéder.

crsnape@btinternet.com:
J'ai joué avec mes fonctions au cours des deux derniers jours et j'obtiens toujours des résultats vides. Je m'arrache littéralement les cheveux.

J'ai changé la fonction pour calculer RiskSize comme vous l'avez suggéré (je suis d'accord que c'est un meilleur système maintenant) et je l'ai utilisé dans ma fonction GetLots. La voici :

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates() ;

double MinLots, MaxLots, LotStep ;

double LotsLong = 0 ;

int LotDigit = 2 ;

int Risk = GetRiskLong (RiskLong) ;

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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

retourne (LotsLong) ;

}

Il se plaint également de RiskLong - variable non définie. Mais cette variable est définie dans la fonction GetRiskLong qu'il appelle.

Si c'est difficile de vous aider avec le code que j'ai posté, je peux vous l'envoyer ?
 
mladen:
First est une fonction acceptant des arguments

La deuxième est une fonction sans arguments, vous ne pouvez donc pas modifier les valeurs "number", "call", "specialcall" et "order" en dehors du corps de la fonction.

Vous trouverez d'autres informations utiles sur la déclaration des fonctions dans ce fil de discussion : https://www.mql5.com/en/forum/173005.

Merci pour cela. Donc, si j'appelle une fonction appelée GetRisk à partir d'une fonction appelée GetLots, je devrais mettre les variables de la fonction GetRisk entre les crochets (...) de GetLots parce que les valeurs sont calculées en dehors de la fonction GetLots ?

 

...

Laissez-moi essayer de cette façon :

2 questions (en supposant que nous connaissons l'état actuel du compte en dollars) :

Question 1 : Je suis prêt à risquer (je ne sais pas) % avec (je ne sais pas) pips stop loss. Quelle devrait être la taille de mes lots ?

question 2 : Je suis prêt à risquer 1% avec un stop loss de 100 pips. Quelle devrait être la taille de mes lots ?

Il est évident que la réponse à la première question est impossible puisque vous ne connaissez pas le pourcentage de risque que je suis prêt à prendre ni le stop loss que je vais utiliser. Mais dans le second exemple, il est possible de calculer la taille du lot puisque vous connaissez tous ces éléments. Maintenant, ce sont des arguments : puisque nous prévoyons que le rsik% et le stop loss peuvent varier, nous les fournissons au calcul de la taille du lot en tant qu'arguments variables qui seront "dits" à la fonction à chaque fois qu'elle sera appelée.

J'espère que cela clarifie le rôle des arguments (paramètres) dans les fonctions. Toutes les fonctions fonctionnent sur le même principe : si vous prévoyez qu'une partie du calcul peut échouer, mettez-la comme argument de la fonction.

Voici d'autres exemples de codage de fonctions : https://en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Merci pour cela. Donc, si j'appelle une fonction appelée GetRisk à partir d'une fonction appelée GetLots, je devrais mettre les variables de la fonction GetRisk dans les parenthèses (...) de GetLots parce que les valeurs sont calculées en dehors de la fonction GetLots ?