Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 739

 
korobok777:
Lot=NormalizeDouble(Balance*0.001,2);
 
Vinin:
Vous avez écrit quelque chose de mal.

Oui, c'est une faute de frappe, je l'ai corrigée. Ou le principe est-il erroné ? Le point était que si le solde est divisé par 10 sans reste, le lot est pris comme le produit du lot initial par 1/10 du solde. N'est-ce pas ? Comment alors ?


Bien que Vadim l'ait écrit plus simplement ici, oui ;)))

 
evillive:

Oui, c'est une faute de frappe, je l'ai corrigée. Ou le principe est-il erroné ? Le point était que si le solde est divisé par 10 sans reste, le lot est pris comme le produit du lot initial par 1/10 du solde. N'est-ce pas ? Comment faites-vous alors ?


Bien que Vadim l'ait écrit plus simplement ici, oui ;)))

Le solde est très rarement divisé par 10 sans reste. Dans d'autres cas (la plupart), il y aurait un lot par défaut.
 
evillive:
double StartLot=0.01;
if(MathMod(AccountBalance(),10)==0) Lot=StartLot*AccountBalance()/10;

Et MarketInfo() ?

ET MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP ?

Vous devez encore entrer dans la grille des chiffres autorisés des valeurs de lot :

#property strict

/******************************************************************************/
double getLot(double factor = 0.001) {
  double minLot = MarketInfo(Symbol(), MODE_MINLOT);

  if (minLot > 0) { // Проверка значения от функции MetaQuotes на вменяемость
    double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);

    if (maxLot >= minLot) { // Проверка второго значения от функции MetaQuotes на вменяемость
      double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);

      if (lotStep > 0) { // Проверка третьего значения от функции MetaQuotes на вменяемость
        double rawLot = AccountBalance() * factor; // Грубо вычисленное значение лота

        // В процессе "рихтования" грубо вычисленного значения лота подразумевается, что "округление" происходит всегда к меньшему
        if (rawLot >= minLot && rawLot < maxLot + lotStep) { // Если грубо вычисленное значение "влезает" в диапазон разрешённых значений лотов
          int stepNum = int((rawLot - minLot) / lotStep); // Количество step'ов, которое надо "отступить вправо на числовой оси" от минимального значения лота (при преобразовании double -> int как раз и происходит нужный тип округления)

          return minLot + lotStep * stepNum; // Вычисляем значение лота в "разрядной сетке" разрешённых лотов.
        }
      }
    }
  }

  return 0; // Какие-то обстоятельства не позволили выдать значение в "разрядной сетке" разрешённых лотов; для индикации данного события выдаётся специальное значение 0.
}

/******************************************************************************/
void OnStart() {
  Print("AccountBalance() = ", AccountBalance(), ", getLot() = ", getLot());
}

Je l'ai lancé, j'ai obtenu quelque chose de similaire à la vérité :

0       20:09:49.699    Script 3 EURUSDm,H1: loaded successfully
0       20:09:49.699    3 EURUSDm,H1: initialized
0       20:09:49.699    3 EURUSDm,H1: AccountBalance() = 152.82, getLot() = 0.15
0       20:09:49.699    3 EURUSDm,H1: uninit reason 0
0       20:09:49.699    Script 3 EURUSDm,H1: removed

Pas d'erreur, je pense.

 
simpleton:

Et MarketInfo() ?

ET MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP ?

Vous devez encore entrer dans la grille des chiffres autorisés des valeurs de lot :

Je l'ai lancé et j'ai obtenu quelque chose qui ressemble à la vérité :

Je ne semble pas avoir fait d'erreur.

Merci, on me l'a déjà expliqué :D

Il est clair que pour moi-même j'écris avec tous les chèques, comme il se doit, il y avait juste une esquisse de comment amener le lot à l'équilibre/rapport 10, mais l'idée était malheureuse....

Mais vous avez beaucoup de texte, ça pourrait être plus simple :

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;
 
simpleton:

Et MarketInfo() ?

ET MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP ?

Vous devez encore entrer dans la grille des chiffres autorisés des valeurs de lot :

Je l'ai lancé, j'ai obtenu quelque chose de similaire à la vérité :

Il ne semble pas y avoir d'erreur.

pourquoi, lorsqu'un programmeur naturel se charge d'une tâche, une seule ligne nécessaire pour atteindre l'objectif se transforme en une liste longue d'un demi-kilomètre ?

double Lot = NormalizeDouble(AccountBalance()/1000,2);
if(Lot<Min_Lot)Lot=Min_Lot;
 
_new-rena:

Comment se fait-il que lorsqu'un programmeur naturel se charge d'une tâche, une ligne de code nécessaire pour atteindre l'objectif se transforme en une liste longue d'un demi-kilomètre ?

Certaines personnes ont un grand pas non pas 0,01 mais, par exemple, 0,03 ou même 0,1. Et comment alors ? Des contrôles sont nécessaires pour tous les cas, Dieu sait que cela ne prend pas beaucoup de temps.
 
evillive:
Certaines personnes n'ont pas un échelon de 0,01 mais, par exemple, de 0,03. Comment alors ? Des vérifications sont nécessaires dans tous les cas, heureusement que cela ne prend pas beaucoup de temps.
Définissez (ci-dessous) dans l'inite et vous n'aurez plus à vous soucier du serveur et de l'ordinateur.
double Min_Lot=MarketInfo(Symbol(), MODE_MINLOT);
 
Je parle du terrain, pas du lot minimum, mais bon, oubliez ça.
 
_new-rena:

Comment se fait-il que lorsqu'un programmeur naturel se charge d'une tâche, une ligne de code nécessaire pour atteindre l'objectif se transforme en une liste longue d'un demi-kilomètre ?

Parce que toutes sortes de merdes vous attendent à chaque tournant, et vous devez vous protéger. Si vous ne vous protégez pas, la qualité sera très faible, ce qui peut finir par vous coûter très cher à long terme. 90% des efforts sont consacrés à se défendre contre le diable et seulement 10% sont consacrés à résoudre le problème. Dans le cas de MT4 et MQL4++, le rapport est encore plus asymétrique.

La merde commence en lisant la documentation:

Возвращаемое значение

Информация о финансовом инструменте. Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

Tout. Est obligé de retourner les informations sur l'instrument financier, et rien d'autre. Il n'y a pas d'autres résultats. Nous obtenons des informations sur l'instrument :

#property strict

/******************************************************************************/
void OnStart() {
  Print("MarketInfo(\"Фигня\", MODE_MINLOT) = ", MarketInfo("Фигня", MODE_MINLOT));
  Print("MarketInfo(\"Фигня\", MODE_MAXLOT) = ", MarketInfo("Фигня", MODE_MAXLOT));
  Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));
}

Voyons quels sont les paramètres du lot pour cet outil :

0       21:12:18.980    Script 3 EURUSDm,H1: loaded successfully
0       21:12:18.980    3 EURUSDm,H1: initialized
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_MINLOT) = 0.0
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_MAXLOT) = 0.0
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_LOTSTEP) = 0.0
0       21:12:18.980    3 EURUSDm,H1: uninit reason 0
0       21:12:18.980    Script 3 EURUSDm,H1: removed

Paramètres intéressants. Je ne sais pas pourquoi la documentation ne décrit pas le comportement de cette fonction en cas d'erreur. Nous devrons utiliser des fonctionnalités non documentées que nous avons découvertes en observant le comportement de cette fonction.

Ainsi, la fonction MarketInfo() peut retourner 0 pour ces paramètres demandés dont les valeurs doivent être différentes de 0 par nature, ce qui constitue une situation d'erreur non documentée. Le code doit vérifier si une erreur s'est produite lors de la demande de chacun des paramètres. Pour cette seule raison, 3 contrôles sont prévus dans le code.

Suivant. De toute évidence, la taille de lot calculée peut ne pas entrer dans la fourchette des tailles de lot autorisées. On ne le vérifie pas ? Ou devrions-nous programmer explicitement cette situation, puis programmer la réaction à cette situation dans le code de niveau supérieur, au lieu de procéder "au fur et à mesure" ? Un exemple de ce à quoi cela ressemble quand tout n'est pas programmé, et fonctionne comme par hasard, pourrait être une autre version récente de MT4, quand quelque chose s'est déplacé quelque part, a miraculeusement bugué, et quelque part a cessé de fonctionner complètement. Peut-être n'est-ce pas le résultat souhaité ?

Le code est développé et commenté pour montrer le processus de réflexion et le modèle de calcul utilisé. Étant donné que le modèle de lot défini par MetaQuotes est mis en œuvre sous la forme d'une "grille de valeurs d'ordres étalés" définie par les paramètres MINLOT, MAXLOT et LOTSTEP, il serait plus raisonnable de calculer la valeur exacte du lot en ces termes. C'est pourquoi le modèle de calcul est rédigé en ces termes.

Je ne vois pas de "demi-kilomètres" ou autre chose. La seule chose est que le code est exécuté de manière à obtenir des performances maximales lorsque les fonctions sont appelées une fois et que les valeurs résultantes sont stockées dans des variables, et que chaque appel n'est exécuté qu'après une autre vérification lorsqu'il s'avère que la valeur renvoyée n'est pas un indicateur d'erreur et qu'il est toujours judicieux de poursuivre les calculs. Une fois qu'il est clair qu'une erreur s'est produite, les ressources informatiques ne sont plus gaspillées en appels inutiles.

Pour rendre le code plus compact, nous pourrions obtenir les 3 valeurs en une fois et vérifier les 3 conditions en un seul if. Mais en cas d'erreur lors du premier appel, les deux autres appels seraient un gaspillage de ressources informatiques.

Notez que lors de la programmation d'une expression qui utilise la division par lotStep, nous avons volontairement fait attention au fait qu'elle est utilisée sous les if's, qui vérifient simplement que la valeur de lotStep est différente de 0, c'est-à-dire que la division par 0 ne peut pas se produire. En principe, le code peut encore être amélioré en déclarant toutes les variables comme "double" et "int" et "const double" et "const int", se protégeant ainsi contre lui-même lors d'éventuelles modifications ultérieures du code. En particulier, si dans le code if, qui vient de vérifier si la valeur de la variable lotStep est différente de 0, accidentellement, dans un code nouvellement ajouté à cet endroit, on attribue par erreur la valeur 0 à cette variable, alors une autre division par 0 se produira dans l'expression. Si la variable est déclarée comme "const double", alors j'espère que le compilateur signalera immédiatement une tentative non autorisée de modifier la variable lotStep, empêchant ainsi de faire une telle erreur.

Les "demi-kilomètres" sont donc dus à des conditions objectives sévères, et non au caprice de quelqu'un.

Comment s'appelle la branche ? Eh bien, si tu veux aider, fais-le correctement, pour que tu puisses vraiment apprendre quelque chose.