Aidez-moi à apprendre à programmer. - page 2

 
Alexey Viktorov:

Merci pour cet exemple.

Je pensais être le seul à préférer exposer les choses de cette manière, plutôt que d'écrire de façon abrupte.

hz - traduit en russe par "j'aimerais savoir"... ne pensez pas mal...

Il est préférable d'utiliser les classes de la bibliothèque standard afin de ne pas avoir à écrire tous ces longs PositionGet... etc.

 
Dmitry Fedoseev:
Merci. La digestion.
 
Alexey Viktorov:

Merci pour cet exemple.

Je pensais être le seul à préférer présenter les choses de cette façon plutôt que de les écrire de façon abrutissante.

Quel est le problème ?

Ne prenez pas cela pour un"coder nazi", mais pour ma part,je trouve ces constructions inquiétantes :

for(int index=PositionsTotal()-1; index>=0; index--) { /* тело цикла */ }

C'est une nuisance pour l'œil. Ne serait-il pas mieux de faire en sorte que ce ne soit pas"zaz comment", mais comme ça :

int index = PositionsTotal();

while (index-- > 0) { /* тело цикла */ }

Ou ce genre de "shithcoddling" :

for(int i=0;i<PositionsTotal();i++)

PositionsTotal()est appelé à chaque itération de la boucle !

Un codeur normal ne manipulerait jamais le corps de la boucle qui parcourt les positions par leur index (qui, Dieu merci, est absent ici) conduisant à un changement de leur nombre. C'est juste le summum de l'analphabétisme et du code défectueux. Vous devez, dans le bon sens du terme, recommencer toute la boucle si quelque chose comme ça doit arriver.

Certaines personnes aiment aussi quelque chose comme ça :

double Lot;

// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:
if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;

// а то и вовсе:
if(Lot > MaxLot) Lot = MaxLot;
  else
    if(Lot < MinLot) Lot = MinLot;

// а не проще ли сделать так?
Lot = MathMin(MathMax(Lot, MinLot), MaxLot);

Bien que, pour un débutant qui n'est pas concerné par les heures supplémentaires de temps CPU pour l'optimisation, ces constructions "si-alors-tout" des leçons scolaires de "programmation" en BASIC, soient plus claires.

Et tout cela estreproduit de code en code par le principe du copier-coller.

Alors voilà...

 
Tio Nisla:

...

Ou ce genre de "shithcoding" :

PositionsTotal()est appelé par itération de la boucle !

...

Vous êtes sûr ? Vous vouliez être intelligent, mais vous êtes dans une ornière...

Et vous vous êtes inscrit dans ce but ? Comme ça - dès le premier post et se perdre...

 
Dmitry Fedoseev:

Vous êtes sûr ? Vous essayiez d'être intelligent, mais vous êtes devenu un voyou...

Et tu t'es inscrit exprès pour ça ? Comme ça, dès le premier message, tu es dans les toilettes...

Oh, mon Dieu. "Apprenez les maths", Elger et Knut. Ne soyez pas personnel.

D'accord, je vais t'expliquer :

    for  (            int i=0            ;          i<PositionsTotal()            ;    i++     )    { }
    ^^^               ^^^^^^^                       ^^^^^^^^^^^^^^^^^^                 ^^^          ^^^
объявление   |   объявление переменной   | проверка условия выполнения цикла:     | инкремент  | тело цикла
  цикла      | типа "int", инициализация | 'i' < значения, возвращаемого функцией | переменной |
типа "for"   |       значением '0'       | которая вызывается на каждую итерацию  |

C'est clair, ma chère ?

Si ce n'est pas le cas, lisez attentivement le site https://learnc.info/c/loop.html en commençant quelque part par [ctrl+f , cherchez "Cycle for"].

On n'a même pas la flemme de trouver le lien.

Et apprenez à écrire un code littéraire, agréable et concis. Vous auriez dû commencer par l'assembleur, avec les microcontrôleurs où chaque octet compte.

P.S.

Ici, j'étais même trop paresseux pour montrer à l'expert un exemple simple de sa boucle "for".

int OnInit()
{
   for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
   return(INIT_SUCCEEDED);
}

int somefunc() {
   static int count = 0;
   PrintFormat("Туточки уже %d-й раз!\n", ++count);
   return 3; // это типа количество чего-то там, элементов массива например
}

Et voici le résultat de l'échantillonnage :

2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 1-й раз!

Vous pouvez voir que la fonction n'est pas seulement appelée à chaque itération, mais même +1 fois à la fin.

Alors voilà.

Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
  • 1989.04.14
  • Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev
  • learnc.info
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
 
Tio Nisla:

Eh, chérie. "Apprenez les maths", Elger et Knut. Ne le prenez pas personnellement.

D'accord, je vais t'expliquer :

C'est clair, ma chère ?

Si ce n'est pas le cas, lisez attentivement le site https://learnc.info/c/loop.html en commençant quelque part par [ctrl+f , cherchez "Cycle for"].

On n'a même pas la flemme de trouver le lien.

Et apprenez à écrire un code littéraire, agréable et concis. Vous auriez dû commencer par l'assembleur, avec les microcontrôleurs où chaque octet compte.

P.S.

Ici, j'étais même trop paresseux pour montrer à l'expert un exemple simple de sa boucle "for".

Et voici le résultat de l'échantillonnage :

Vous pouvez voir que la fonction n'est pas seulement appelée à chaque itération, mais même +1 fois à la fin.

Alors voilà.

J'applaudis ! Continuez...


 
Dmitry Fedoseev:

J'applaudis ! Continuez...


Pourquoi as-tu fait un tel gâchis ? Et le mettre sur le Net. Ta mère va te gronder !
 
Si certains codes sont stressants et font tourner les têtes, il existe bien d'autres professions dans le monde : concierge, chargeur, nettoyeur, agent sanitaire...
 
Dmitry Fedoseev:

Vous êtes sûr ? Vous essayiez d'être intelligent, mais vous êtes devenu un voyou...

Et tu t'es inscrit exprès pour ça ? Juste comme ça - du premier post et dans une flaque d'eau...

Quelleconversation intéressante vous avez) )))

Messieurs, les personnalités sont des personnalités, mais découvrons la vérité.

En utilisant l'exemple, je peux voir quePositionsTotal()est appelé à chaque itération de la boucle.

Mais Dimitri, au contraire, tu dis que le compilateur le fait d'une manière différente - je ne comprends pas. Expliquer.

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;
CSymbolInfo    m_symbol;
//-------------------------------------------------------------------+
void OnInit()
  {
   m_symbol.Name(Symbol());
   m_symbol.RefreshRates();

   for(int i = 0; i < 10; i++)
     {
      m_trade.Buy(1, _Symbol, m_symbol.Ask() + i * 2 * _Point, 0, 0);
     }

//---закомментировать не нужное
   for(int i = 5; i < PositionsTotal(); i++) // так удаляются только 3 сделки
     {
      m_trade.PositionClose(_Symbol);
     }
//---закомментировать не нужное
   int index = PositionsTotal();
   for(int i = 5; i < index; i++) // так удаляются 5 сделок
     {
      m_trade.PositionClose(_Symbol);
     }

//вывод: PositionsTotal() вызывается на каждой итерации
  }
//+------------------------------------------------------------------+

Si vous voulez dire que la fonctionPositionsTotal() ne recalcule pas les positions à chaque fois, mais renvoie simplement la valeur d'une variable contenant le nombre de positions ouvertes, alors oui, vous avez raison, il n'y a aucun sens à déclarer une variable de plus, mais alors qu'est-ce que le compilateur a à faire avec cela ?

Et si cette fonction recalcule les positions ouvertes à chaque fois, il s'avère que le compilateur doit comprendre si la valeur de cette fonction affecte les calculs ultérieurs et utilise soit une fonction, soit une variable.

Quelque chose ne colle pas pour moi.

 
Aleksandr Slavskii:

Une conversation intéressante que vous avez)))

Je voulais ajouter plus tôt que si la fonction somefunc() effectue d'autres manipulations en plus de retourner un certain montant ou quelque chose, calcule des paramètres commerciaux, par exemple, une telle utilisation provoque des artefacts difficiles à attraper et peut conduire l'auteur du code à la stupeur : "Ht ??? Pourquoi 4 fois ? O_o F$#@ !!!! Il n'est pas censé être là trois fois ? Pourquoi mon EA me ment-il ?". C'est ce que j'ai appelé le "shithcod", dont un expert s'est indigné jusqu'à la racine des cheveux. Je n'en ai pas parlé, car c'est évident, mais tu l'as fait pour moi. Mais vous n'avez pas pris en compte le fait que l'adressage par un index calculé dynamiquement sans réinitialisation du tableau est autre chose. Dans les sys nus, cela conduit généralement à GPF, dans les plus avec des pointeurs intelligents et des tableaux à une exception et son gestionnaire. Dans mql, il n'est pas évident de savoir à quoi cela mène.