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

 
Maxim Kuznetsov:

Qu'est-ce que c'est que ce canon ? il y a un document officiel - c'est exactement comme le vôtre... tout le reste est juste un faux.

1. Il est utile de définir la sérialisation de tous les tableaux utilisés dans OnCalculate.

2. avant d'entrer dans la boucle, mettez buff[length]=Bid+size ; - vous obtiendrez approximativement ce que vous voulez. Une ligne courbe et à la fin une "visière" à Bid+size

3. observez les limites de la matrice. Bien sûr, rates_total < length, mais on ne peut pas plaisanter avec ça :-)

En d'autres termes, vous devez écrire ArraySetAsSeries au début et ensuite danser à partir de là ?

Oh oui, je l'ai mal décrit. Vous avez besoin de cette ligne pour aller à gauche sur le graphique et la mettre à jour à chaque tick.

 
YanSay:

Merci beaucoup pour votre réponse détaillée !

En suivant vos conseils, j'ai divisé les branches et tout a fonctionné.

J'ai rencontré un problème avec l'ouverture simultanée de 10-15 ordres en attente, j'ai résolu le problème en ajoutant votre code après celui-ci :

Ce n'est pas non plus une solution. L'ordre peut être ouvert manuellement ou par un autre EA. Par conséquent, l'EA en cours de développement n'ouvrira rien. Nous devons donc compter le nombre d'ordres ouverts par le Conseiller Expert. En disposant de ces données, vous pouvez décider d'ouvrir ou non un ordre.

Je suis sûr qu'il y a un meilleur moyen.

En ce qui concerne votre code, veuillez expliquer ce que signifie 1 ; i >=0 ; --i ?

Il s'agit de la boucle de commande standard. OrdersTotal() est le nombre de commandes. Les ordres sont indexés à partir de zéro. Ainsi, s'il y a une commande, son index sera 0, alors que la fonction OrdersTotal() renverra 1. Ainsi, la boucle devrait commencer par l'index, qui est inférieur de 1 au nombre de commandes. Nous obtenons OrdersTotal() - 1. Le second opérande est la condition d'exécution du corps de la boucle. Dans ce cas, la boucle se terminera à i = -1. Le troisième opérande est l'exécution du saut de boucle à l'indice suivant (diminution par 1).

Vous trouverez des informations sur l'opérateur de boucle dans la documentation.

 
Ihor Herasko:

Ce n'est pas non plus une option. L'ordre peut être ouvert manuellement ou par un autre EA. Par conséquent, l'EA en cours de développement n'ouvrira rien. Nous devons donc compter le nombre d'ordres ouverts par le Conseiller Expert. En disposant de ces données, nous devrons prendre la décision d'ouvrir ou non une commande.

J'ai essayé de cette façon mais il a recommencé à ouvrir 10-15 ordres par signal :

if ((OrdersTotal ()>0) && (OrderMagicNumber() != 100)) return;

Le troisième opérande permet de passer à l'indice suivant (diminution de 1).

Il examine donc toutes les commandes depuis la fin ?

 
YanSay:

J'ai essayé ça, mais ça a recommencé à ouvrir 10-15 ordres pour 1 signal :

Donc il regarde toutes les commandes depuis la fin ?

Pour utiliser la fonction OrderMagicNumber(), vous devez d'abord sélectionner un ordre. La boucle standard de collecte d'informations sur ses commandes ressemble à ceci (par exemple, compter le nombre de ses commandes) :

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (OrderMagicNumber() != <значение ID ордеров эксперта>)
         continue;

      ++nCnt;
   }

Après l'exécution de ce code, la variable nCnt contiendra le nombre de bons de travail de l'Expert Advisor.

 
Ihor Herasko:

Je résous le problème comme suit...


Merci.

 
Ihor Herasko:

Pour utiliser la fonction OrderMagicNumber(), vous devez d'abord sélectionner une commande. Le cycle standard de collecte d'informations sur ses commandes se présente comme suit (par exemple, compter le nombre de ses commandes) :

Après l'exécution de ce code, la variable nCnt contiendra le nombre d'ordres de travail de l'EA.

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber)
     continue;
  ++nCnt;
  {
   if (nCnt>0)
      return;
  }
 }

Merci beaucoup ! Ça a marché !

Pourriez-vous indiquer si ++nCnt est une substitution du nombre d'ordres obtenus dans la variable nCnt elle-même ?

 
YanSay:

Merci beaucoup ! Ça a marché.

Pouvez-vous me dire si ++nCnt substitue le nombre de commandes reçues dans la variable nCnt elle-même ?

Dans tous ces cas, consultez immédiatement la documentation. ))

 
YanSay:

Merci beaucoup ! Ça a marché.

Pouvez-vous me dire si ++nCnt est la substitution du nombre de commandes reçues dans la variable nCnt elle-même ?

Il existe une documentation complète sur le langage, il suffit de jeter un coup d'œil au menu supérieur du site.

Ne soyez pas paresseux de le lire, il est impossible de tout garder dans la tête. Presque tout le monde, pas seulement les débutants, y arrive toujours.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Artyom Trishkin:

Il existe une documentation complète sur le langage, il suffit de jeter un coup d'œil au menu supérieur du site web.

Ne soyez pas paresseux de le lire - vous ne pouvez pas tout garder dans votre tête - il est toujours là pour presque tout le monde - pas seulement pour les débutants.

Merci. Je ne sais pas toujours dans quelle section chercher, je ne suis pas encore très douée et l'éditeur de F1 ne m'envoie pas toujours au bon endroit).

Je vais essayer de ne pas m'embêter avec des questions stupides, merci de votre patience).

 
Roman Sharanov:

1. Vous voulez dire qu'il faut écrire ArraySetAsSeries au début, puis partir de là ?

Oh oui, je l'ai mal décrit. Vous voulez que cette ligne aille vers la gauche sur le graphique et se mette à jour à chaque tick.

Dessinez donc une ligne horizontale.

Pourquoi avez-vous besoin de tampons et de leur recalcul ? ObjectSetDoubke(0,myHLine,OBJPROP_PRICE,concrete_price_value) ;

l'utilisateur verra la ligne, vous ne perdrez pas de temps à recalculer les tampons, tout le monde est content et se disperse joyeusement

PS/ bien comprendre - le tampon indicateur, c'est pour transférer (partager) les résultats des calculs effectués en premier lieu. Tracer une ligne horizontale de longueur N est différent