Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 705

 
multiplicator:
pour une raison quelconque, le terminal n'affiche pas les erreurs)

Vous ne pouvez pas le faire vous-même ?

 
multiplicator:
Pour une raison quelconque, le terminal ne montre pas les erreurs)

Qu'est-ce que le terminal a à voir avec ça ? Vous devez tenir compte du classement par volume dans votre programme.

Essayez d'envoyer par programme un ordre pour ouvrir une position avec le lot 0.000001, ou 0.12345678, ou 100000.1, etc.

 
Алексей Тарабанов:

Vous ne pouvez pas le faire vous-même ?

Quoi ? Ça ne se voit pas.
 
Artyom Trishkin:


Essayez d'envoyer un ordre programmé pour ouvrir une position avec le lot 0.12345678.

s'ouvre avec le lot 0.12.

La question est de savoir s'il faut normaliser ou non.

 
Artem, pourquoi ne pas les oublier ?
 
Alekseu Fedotov:

Essaie celle-là.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}


C'est là que ce n'est pas clair :
  if (ls>0) k=1/ls; else k=1/ml;
Quelle différence cela fait-il que le terrain soit plus grand que zéro ou plus petit ?
 
Алексей Тарабанов:
Artem, pourquoi ne pas les oublier ?
Va te faire foutre.
aller dormir.
 
multiplicator:

s'ouvre avec un lot de 0,12.

La question est de normaliser ou de ne pas normaliser.

J'en ai marre. Qu'est-ce que le lot a à voir avec le prix auquel il a ouvert, vous patient ?

 
Алексей Тарабанов:

J'en ai marre. Qu'est-ce que le lot a à voir avec le prix auquel vous l'avez ouvert, patient ?

Vieil homme, personne ne t'a rien demandé. Va dormir.

Quand je lis vos messages sur le forum, je pense "cet homme a un cerveau faible".
 
Alekseu Fedotov:

Essaie celle-là.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}

Il divise ici par la taille de l'étape du lot, rejette le reste, puis prend le nombre d'étapes du lot qu'il a obtenu.

Il pourrait y avoir une erreur ici.

Par exemple, nous mettons la valeur dans la fonction : 7 lots.
Le courtier a un volume de lot minimum de 5 et un pas de lot de 2.


Il divisera 7 par l'incrément du lot. Il prendra le nombre de pièces entières. Et multipliez à nouveau par l'augmentation du lot. Le résultat sera de 6 lots, et il essaiera d'ouvrir un ordre avec ce volume.
Mais l'ordre ne peut être ouvert qu'avec des volumes tels que 5, 7, 9, etc.


Il serait préférable de soustraire la taille minimale du lot (5) de notre lot (7). Et avec le reste pour travailler.

effectuer toutes les actions avec le reste, qu'il a une fonction.

Comptez le nombre de pas entiers, la taille du pas de lot. Multipliez ensuite le nombre d'étapes par la taille des étapes du lot. Cela nous donne 2.

Ensuite, ce 2 est à nouveau ajouté à la taille du lot minimum (5). Le résultat est 5+2=7.


Mais c'est un exemple fantastique.
Les courtiers ont désormais un lot minimum et des incréments de lot de 0,01.
ou lot minimum et incréments de lot de 0,1