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

 
MakarFX #:

Si vous n'aimez pas "-1", vous pouvez faire ceci.

Non, vous ne pouvez pas - le programme se plantera si vous accédez à votre tableau de cette façon.

Au mieux, si vous accédez à vos tableaux internes, vous manquerez les données dont vous avez besoin, ou vous ne les atteindrez tout simplement pas dans la boucle.

 
Nikolay Ivanov #:

En gros, c'est simple, votre unique résume toutes les commandes mal assorties entre les différents magiciens...

Par exemple, il y a 3 commandes

La première itération de magic=1 unique=0, à la fin de l'itération unique sera=2.

La deuxième itération magik=2unique=2, à la fin de l'itérationunique sera=3

Puisque 3>=nombre de toutes les commandes, la boucle while va se casser... Et la magie =3 n'a jamais été vérifiée... Donc magie =2 à nouveau et ainsi de suite avec tous...

Le premier ordre est donné magique =1 par défaut. Puis la boucle entre en action :

Début de l'itération magie = 1 unique = 0, à la fin (quand il y a déjà un ordre avec magie = 1) magie = 1 est encore 1 et unique = 0
Deuxième itération magie = 2 unique = 0, à la fin magie = 2 et unique = 1 (pas de correspondance) et le retorn est donné au 2ème ordre magie = 2.
Le troisième devrait être le même...

Je voulais imprimer tout le processus, mais quelque chose a mal tourné :

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

Le premier ordre se voit attribuer magic = 1 par défaut. Puis une boucle est lancée :

Début de l'itération magic = 1 unique = 0, à la fin (quand il y a déjà un ordre avec magic = 1 ) magic est toujours 1 et unique = 0
Deuxième itération magic = 2 unique = 0, à la fin, magic = 2 et unique = 1 (pas de correspondance) et le retorn est assigné au 2ème ordre magic = 2.
Le troisième devrait être le même...

Je voulais imprimer tout le processus, mais quelque chose a mal tourné :

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

Visezplus- TOUS les langages de programmation.

C'est simple : dans les langages de programmation, le comptage commence à zéro. La première cellule d'un tableau aura un indice de 0. Par conséquent, vous devez faire une boucle inverse AVANT le zéro INCLUANT. C'est-à-dire >=0

OrdersTotal() donne, par exemple, 10. Et vous démarrez une boucle à partir de 10, alors que le dernier indice du tableau est 9 (rappelez-vous, nous partons de zéro ?). Et que se passera-t-il si vous accédez à une cellule de tableau inexistante ? C'est exact - le programme se bloquera sur une erreur critique, parce que vous avez pénétré dans une zone de mémoire non allouée, au-delà des limites du tableau.

Ce sont des béquilles solides, c'est sûr. Lisez, apprenez et tout viendra à vous.

Merci. Ce n'est pas ce que je voulais dire. On pourrait tout pardonner à mql s'il était sous une licence ouverte. Sinon, je m'en prends à vous. Il me semble, par exemple, que nous aurions pu mettre un drapeau dans la fonction NormalizeDouble et utiliser le rognage de place ou l'arrondi arithmétique. Ou, par exemple, nous pourrions étendre les fonctions de gestion des positions, par exemple, renvoyer le nombre de positions ouvertes uniquement pour la vente ou l'achat. Une aide plus détaillée pourrait également être rédigée. Mais ce n'est que l'opinion d'un amateur. Aussi, veuillez me pardonner si la déclaration précédente vous a semblé dure.
 

Il existe des tonnes de cours gratuits et de qualité sur le C/C++.

Mql est proche d'eux et vous pouvez apprendre librement. Heureusement, une connaissance approfondie n'est pas nécessaire. Mais au moins la syntaxe du langage et les bases fondamentales des algorithmes.

Sinon, nous obtiendrons des absurdités sur le sujet, au lieu de consultations sur la plate-forme et les algorithmes, des dialogues au niveau des écoles primaires - où mettre ; qu'est-ce qu'une boucle et pourquoi les index sont nuls.

Par exemple, il y a un site intuit.ru - il y a des cours sur le C et les algorithmes, prenez votre temps, quelques semaines tout au plus. En même temps, vous pouvez obtenir un papier :-)

 
Maxim Kuznetsov la syntaxe du langage et les bases fondamentales des algorithmes.

Sinon, nous obtiendrons des absurdités sur le sujet, au lieu de consultations sur la plate-forme et les algorithmes, des dialogues au niveau des écoles primaires - où mettre ; qu'est-ce qu'une boucle et pourquoi les index sont nuls.

Par exemple, il y a un site intuit.ru - il y a des cours sur le C et les algorithmes, prenez votre temps, quelques semaines tout au plus. Vous pouvez obtenir un papier en même temps :-)

Comme ça ?


 
Artyom Trishkin #:

OrdersTotal() donne par exemple 10. Et vous commencez la boucle à partir de 10. Mais le dernier indice du tableau est 9 (rappelez-vous, nous comptons à partir de zéro ?). Et que se passera-t-il si vous accédez à une cellule de tableau inexistante ? C'est exact - le programme se bloquera sur une erreur critique, parce que vous avez pénétré dans une zone de mémoire non allouée, au-delà des limites du tableau.

Je me suis trompé... Il n'y aura pas d'erreur critique, juste le booléen OrderSelect retournera false... et c'est tout... Mais bien sûr, il vaut mieux éviter... Car si vous utilisez des caractéristiques de code incorrectes, il est difficile de prévoir les erreurs possibles...


Nerd Trader#:

Le premier ordre se voit attribuer magic = 1 par défaut. Puis une boucle est lancée :

Début de l'itération magic = 1 unique = 0, à la fin (quand il y a déjà un ordre avec magic = 1 ) magic = 1 et unique = 0
Deuxième itération magic = 2 unique = 0, à la fin magic = 2 et unique = 1 (pas de correspondance) et le retorn est attribué au 2ème ordre magic = 2.
Le troisième devrait être le même...

Je vois juste que le remplissage de l'unique va très vite et atteint la limite, et la magie croît à peine... En général, il était erroné d'utiliser la même variable à la fois pour le contrôle de la boucle et pour la logique à l'intérieur de la boucle où cette variable gonfle...

Imprimer pour trouver une solution dans ce contexte, mais je suggérerais de reformuler le problème... Par exemple trouver le maximum de magik dans les commandes par la boucle et le retourner avec +1, ce serait la bonne solution simple.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Vous pouvez le faire de cette façon, le code est appelé selon les besoins, son poids n'est donc pas un problème.

Pour le test, j'ai utilisé l'option Achat/Vente

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes les questions des débutants sur MQL4 et MQL5, conseils et discussions sur les algorithmes et les codes.

Vitaly Muzichenko, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


Semyon Semyonych.
Nikolay Ivanov #:

Je vais le corriger un peu. Il n'y aura pas d'erreur critique, mais le booléen OrderSelect retournera false ... et c'est tout... Mais bien sûr, il vaut mieux éviter... Car si les fonctionnalités du code ne sont pas utilisées correctement, il est difficile de prévoir les pièges possibles...


Je vois juste l'unique se remplir à un rythme très rapide et atteindre sa limite, tandis que la magie se développe à peine... En général, il était erroné d'utiliser la même variable à la fois pour le contrôle de la boucle et pour la logique à l'intérieur de la boucle, où cette variable gonfle...

Imprimer pour trouver une solution dans ce contexte, mais je suggérerais de reformuler le problème... Par exemple trouver le maximum de magik dans les commandes par la boucle et le retourner avec +1, ce serait la bonne solution simple.

C'est un dernier recours, au cas où cette option ne fonctionnerait pas. En attendant, voici ce que l'empreinte a donné.

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

Vous pouvez le faire de cette façon, le code est appelé selon les besoins, son poids n'est donc pas un problème.

Pour le test, j'ai utilisé l'option Achat/Vente

J'y jetterai un coup d'œil demain, je n'ai pas l'énergie pour m'y mettre maintenant.
Raison: