Questions des débutants MQL5 MT5 MetaTrader 5 - page 765

 
Alexey Kozitsyn:

L'événement de mouvement de la souris n'est absolument pas généré. Avec les autres, je pense que c'est la même chose.

Et dans l'EA ?
 
Artyom Trishkin:
Et dans le conseiller ?

Même chose...

 
Alexey Viktorov:

La réponse a été donnée avant...

Mais il vaut mieux ne pas se contenter d'une quantité légère, mais essayer de s'en sortir avec un seul exemplaire.

Je ne vais pas écrire un code d'exemple. Un programmeur normal a juste besoin d'un indice. Voici un algorithme approximatif :

  1. Nous déterminons le nombre approximatif de barres auxquelles le canal est franchi. Que ce soit 15.
  2. Copiez les deux tampons de l'indicateur.
  3. Copier les valeurs des barres en utilisant CopyRates()
  4. Dans la boucle, nous commençons à comparer les valeurs de la limite supérieure du canal et des barres hautes simultanément à la comparaison des barres basses avec la limite inférieure du canal. Si l'un de ces croisements est trouvé, l'indice de la barre est stocké dans une variable, et nous continuons à chercher le deuxième croisement. Nous sortons de la boucle lorsque les deux variables des barres d'intersection ont des valeurs.

Ainsi, il est possible de trouver deux intersections en une copie et un cycle, si nécessaire. Il n'est même pas nécessaire d'utiliser ArraySetAsSeries() car pour trouver le croisement, il est possible et, à mon avis, préférable de se souvenir de l'heure de la barre et non de son numéro. Bien que, connaissant l'heure de la barre, il n'y a aucune difficulté à déterminer son nombre.

Question : Qu'est-ce qui sera le plus rapide, un cycle avec copie du tampon indicateur par 1 valeur et copie de la barre haute par 1 et comparaison de ces valeurs, ou une seule copie d'une certaine quantité et comparaison des valeurs des deux tableaux entre eux ?

Je suggère de ne pas s'écarter du concept qui, si j'ai bien compris, consiste à copier une certaine quantité de données de barres au début du code, puis à travailler avec ces données - ou bien suggérez-vous une exception ?

Et, qu'est-ce qui vous fait penser que je suis un programmeur ?

Je ne pense pas que vous ayez besoin de deviner - ce qui sera plus rapide, parfois la réponse peut ne pas être évidente - seule l'expérience peut donner une réponse à de telles questions.


 
Vladimir Karputov:

J'ai écrit ça hier :

Tâche :

à chaque tick, obtenir les éléments "InpCountCopy" : open, high, low, close et time.

Mise en œuvre :

  1. boucle de "0" à "InpCountCopy-1" - la boucle récupère une ouverture, un haut, un bas, une fermeture et un temps à la fois.
  2. A un moment donné, nous récupérons les éléments "InpCountCopy" dans la structure MqlRates et nous bouclons ensuite dans la structure.

Caractéristiques :

il est possible de choisir comment vérifier : en OnTick ou en OnTimer (1 seconde).

Merci, je vais essayer de comprendre le code.
 

Dites-moi pourquoi ce code trouve un ticket qui n'est pas déjà dans l'historique.

  HistorySelect(0,TimeCurrent()); 
  for(int i=HistoryOrdersTotal()-1; i>=0; i--) {
   string OrdTick=IntegerToString(HistoryOrderGetTicket(i));
   if(OrdTick=="63425010") Print(OrdTick);
  }
2017.07.24 23:58:33.514 RE (EURGBP.m,H1)      63425010


 
Vitaly Muzichenko:

Dites-moi pourquoi ce code trouve un ticket qui n'est pas déjà dans l'historique.


Avez-vous essayé de rechercher une transaction fermée (OUT) ? Il y avait un ordre - vous pouvez le voir.

 
Vitaly Muzichenko:

Dites-moi pourquoi ce code trouve un ticket qui n'est pas déjà dans l'historique.


C'est vrai :

Vous recherchez un ordre, et l'ordre d'ouvrir la position = 63425010 a déjà fait le sien, et il est dans l'historique.

Et je pense que la commande de billets et la position des billets sont les mêmes, ce qui vous a induit en erreur.

Si vous voulez analyser la position, utilisez PositionSelect(), puis analysez ses propriétés.

 

Ce qui est nécessaire :

Nous envoyons un ordre, en réponse nous recevons un ticket de position, puis un objet nommé "ticket de position" est dessiné sur le graphique (aucun remplacement n'est spécifié). Si nous ouvrons plusieurs positions, respectivement, il y a plusieurs objets avec des noms de tickets sur le graphique, et si nous fermons ensuite l'un d'eux, tous les objets sont supprimés, et nous devons seulement supprimer l'objet avec le ticket fermé de l'historique. La fonction de suppression fonctionne sur OnTrade

 
Vitaly Muzichenko:

Ce qui est nécessaire :

Nous envoyons un ordre, en réponse nous recevons un ticket de position, puis un objet nommé "ticket de position" est dessiné sur le graphique (aucun remplacement n'est spécifié). Si nous ouvrons plusieurs positions, respectivement, il y a plusieurs objets avec des noms de tickets sur le graphique, et si nous fermons ensuite l'un d'eux, tous les objets sont supprimés, et nous devons seulement supprimer l'objet avec le ticket fermé de l'historique. La fonction de suppression fonctionne sur OnTrade


Alors, de quoi avez-vous besoin, d'un ticket d'ordre ou d'un ticket de position ?

 
prostotrader:

Alors, de quoi avez-vous besoin, d'un ticket de commande ou d'un ticket de position ?

Vous devez supprimer les objets avec un ticket qui sont déjà dans l'historique, mais pas ceux qui sont encore sur le marché.

Duplicata:

  HistorySelect(0,TimeCurrent()); 
  for(int i=HistoryOrdersTotal()-1; i>=0; i--) {
   string OrdTick=IntegerToString(HistoryOrderGetTicket(i));
   if(OrdTick=="63425010") Print(OrdTick);
  }
2017.07.24 23:58:33.514 RE (EURGBP.m,H1)      63425010


Raison: