Questions OrderSend() - page 2

 
Yedelkin:
J'ai dû manquer un sujet comme celui-ci. Où puis-je voir la fonction de vérification des commandes de KimV ?
C'est pour 4, mais vous pouvez vérifier, ça pourrait être utile. Vous pouvez la consulter sur son site web sous la rubrique : "bibliothèques gratuites", commandez la bibliothèque.
 
-Alexey-:
C'est pour la 4ème version mais vous pouvez y jeter un coup d'œil, cela peut être utile. Vous pouvez la consulter sur son site, dans la section "bibliothèques gratuites", celle qui permet de passer des commandes.

d'un quatre ne fonctionnera pas. J'utilise

PositionSelect

Sélectionne une position ouverte pour une manipulation ultérieure. Retourne vrai si la fonction se termine avec succès. Renvoie false si la fonction échoue. Pour obtenir les informations relatives à l'erreur, appelez la fonction GetLastError().

boolPositionSelect(
string symbol//nom de l'outil
) ;

Paramètres

symbole

[Nom de l'instrument financier.

Valeur retournée

Valeur de type bool.

Note

Pour chaque symbole, on ne peut ouvrir qu'une seule position à un moment donné, qui est le résultat d'une ou plusieurs transactions. Il ne faut pas confondre les positions et les ordres en attente actifs qui sont également affichés dans l'onglet "Trade" du panneau "Toolbox" du terminal client.

La fonction PositionSelect() copie les données relatives à la position dans l'environnement du programme, et les appels suivants PositionGetDouble(), PositionGetInteger() et PositionGetString() renvoient les données précédemment copiées. Cela signifie que la position elle-même peut ne plus exister (ou avoir changé de volume, de direction, etc.), mais que les données de cette position peuvent toujours être récupérées. Afin de garantir l'acquisition de données fraîches sur les postes, il est recommandé d'appeler la fonction PositionSelect() immédiatement avant de poser sa candidature.

 
sergey1294:

d'un quadruplet ne fonctionnera pas. J'utilise PositionSelect pour définir la position

Lorsque l'on utilise la fonction PositionSelect(), il est alarmant de constater qu'elle "...renvoie un faux si la fonction échoue". En d'autres termes, on ne peut pas exclure la situation la fonction OrderSend() renvoie vrai, la fonction PositionSelect() renvoie faux, et la position est toujours ouverte.
 
papaklass:
Analysez-vous ces situations dans les pré-alternances d'un tic ou sur des tic différents ?

OK, je vais procéder de la manière suivante :

Un tick est un changement dans le prix d'un instrument. La fréquence de ces changements est imprévisible : de plusieurs par seconde à plusieurs par heure. De même, les fonctions OrderSend() et PositionSelect() ne doivent pas dépendre de l'activité des ticks. Et puisqu'il en est ainsi, je pense que nous devrions vérifier pour éviter la duplication des ordres (et analyser les situations correspondantes) sans relation avec le comportement (fréquence) des ticks.

Il m'est donc difficile de répondre précisément à la question :/.

 
papaklass:

Ce n'est pas ce que je voulais dire quand j'ai posé ma question. Le gestionnaire d'événement OnTick() est déclenché lorsque le prochain tick arrive. Pour cette raison, je reformule ma question :

Analysez-vous ces situations dans un seul appel OnTick() ou dans plusieurs ?

Si, après l'arrivée d'un nouveau tick(événement utilisateur), il est nécessaire d'envoyer une demande de transaction au serveur, la vérification de la bonne exécution de cette demande est effectuée "au cours du traitement" du tick (événement) arrivé. C'est-à-dire, selon votre terminologie, "dans un seul appel OnTick()". [et indépendamment du nombre de tics (événements) qui sont arrivés (ont dû arriver) pendant ce traitement].
 
papaklass:

Je n'arrive toujours pas à obtenir de réponse : sur un tick, exécutez-vous OrderSend() et PositionSelect() ?

Je vous suggère d'effectuer ces requêtes non pas sur un tick (en déclenchant OnTick()), mais sur deux ticks :

- au premier tic

C'est-à-dire que si la requête est réussie, vous mettez le drapeau d'ouverture de position à buy=true, et interrompez l'exécution de OnTick() jusqu'au retour de l'opérateur du prochain tick (déclenchement de OnTick()).

- Au deuxième tick - PositionSelect().

Dans ce cas, vous n'avez pas de duplication de l'ouverture de la position.

Aucune garantie que la position sera déjà ouverte au prochain tick. Mesure le temps nécessaire pour ouvrir une position lors de la définition manuelle d'un ordre,

Je vous conseille de déplacer le contrôle de l'exécution des ordres vers OnTrade(), cet événement n'est généré que comme réponse du serveur à une opération de transaction.

Bien que je ne comprenne pas très bien pourquoi il y a 4 événements OnTrade() par ordre ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
papaklass:

Je n'arrive toujours pas à obtenir de réponse : sur un tick, exécutez-vous OrderSend() et PositionSelect() ?

Selon votre terminologie, il s'avère que mes fonctions OrderSend() et PositionSelect() sont exécutées "dans un tick".

papaklass:

...Je veux suggérer que ces requêtes soient exécutées non pas dans un seul tick (déclenchement de OnTick()), mais dans deux ticks :

- au premier tic

C'est-à-dire que si la requête répond avec succès, vous mettez le drapeau pour ouvrir la position en buy=true, et interrompez l'exécution de OnTick() jusqu'au retour de l'opérateur OnTick() au prochain tick.

- Au deuxième tick - PositionSelect().

Dans cette variante, vous n'aurez pas d'ouverture de position dupliquée.

Un peu plus tôt, j'ai écrit que l'exécution des fonctions OrderSend() et PositionSelect() n'a rien à voir avec l'arrivée ou non des ticks. Et j'ai brièvement expliqué pourquoi. Par conséquent, la vérification "au deuxième tick - PositionSelect()" ne devrait pas nous éviter de doubler les ordres dans tous les cas possibles.

 
Urain:

Bien que je ne comprenne pas très bien pourquoi il y a 4 événements OnTrade() par ordre ?

Il y a eu un article à ce sujet dans le passé à propos de OnTrade().

Urain:

Il n'y a aucune garantie que la position sera déjà ouverte au prochain tick...

C'est à peu près ce que je dis.
 
papaklass:

Je n'arrive toujours pas à obtenir de réponse : sur un tick, exécutez-vous OrderSend() et PositionSelect() ?

Je vous suggère d'effectuer ces requêtes non pas sur un tick (en déclenchant OnTick()), mais sur deux ticks :

- au premier tic

C'est-à-dire que si la requête est réussie, vous mettez le drapeau d'ouverture de position à buy=true, et interrompez l'exécution de OnTick() jusqu'au retour de l'opérateur du prochain tick (déclenchement de OnTick()).

- Au deuxième tick - PositionSelect().

Dans ce cas, vous n'avez pas de duplication de l'ouverture de la position.

Non - pas dans la tique. Dans la 1ère seconde.

Voici une simplification :

donc - si sans une pause, il ouvrira 2 ordres à la suite. Mais je l'ai réglé sur 3 secondes - et je ne le regrette pas )))). Pourtant, c'est l'ouverture de l'ordre.


void OnTimer()
{
  while(true)
  {
     zOrderSend (_Symbol,0.1,ORDER_TYPE_BUY);

     Sleep (1); 

   if (PositionSelect(_Symbol)==true) {break;} 
  }
}
 

La comptabilisation des ordres dans MT5 est toute une science :Traitement des événements de transaction dans le conseiller expert à l'aide de la fonction OnTrade()

Aucune pause ne vous évitera une réouverture, une situation peut toujours se produire, dans laquelle l'ordre mettra 1 seconde de plus à être exécuté.

ps : Et n'oubliez pas la magie.

Raison: