Avec quoi remplacer OnTradeTransaction() dans mql4 ? - page 4

 

Capture de tous les événements par tic, comparaison avec les données enregistrées précédemment.

Tous dans des tableaux.

En fait, il y a parfois des freins, quand il y a beaucoup de tics. C'est pourquoi j'ai fait un délai entre les contrôles de 1 seconde.

Il s'agit du suivi de nombreuses positions.

Et si vous ne surveillez que les positions d'un robot particulier, c'est bien sûr plus simple.

 

J'ai une tâche simple, et il n'y a pas plus de deux ou trois douzaines de commandes en cours.

Et donc je vais utiliser un timer pour vérifier ce qui est dans OrdersTotal() et écrire les volumes dans les nouvelles et anciennes variables avec substitution à chaque itération, et si le volume a changé - prendre d'autres mesures.

 
Aleksandr Volotko:

J'ai une tâche simple, et il n'y a pas plus de deux ou trois douzaines de commandes en cours.

Et donc je vais utiliser un timer pour vérifier ce qui est dans OrdersTotal() et écrire les volumes dans les nouvelles et anciennes variables avec substitution à chaque itération, et si le volume a changé - prendre d'autres mesures.

Le volume ne change pas lorsqu'un ordre en suspens se déclenche.

 
Artyom Trishkin:

Le volume ne changera pas lorsque l'ordre en attente se déclenchera.

Eh bien, je filtre les ordres par type dans la boucle et je calcule le volume de la position cumulée ouverte.

Cela m'attriste de devoir gaspiller des ressources et de perdre mon temps, alors que dans MT5, vous pouvez simplement attendre un événement spécifique sans aucun stress.

 
Aleksandr Volotko:

Eh bien, je filtre les ordres par type dans la boucle et je calcule le volume de la position cumulée ouverte.

C'est triste de devoir s'entraîner ainsi et de gaspiller des ressources, alors que dans MT5, il suffit d'attendre un événement spécifique sans aucun stress.

Eh bien, le Mt5 est d'un ordre de grandeur supérieur au Mt4.

Cela s'applique également aux autres fonctions.

 
Dans ma situation spécifique, avec des transactions une fois par jour, et l'événement une fois par jour sera engagé 60*60*24=86 400 gestes supplémentaires. Et il n'y a pas encore d'autre moyen de le faire.

 
Aleksandr Volotko:
Dans ma situation spécifique, si nous traitons une fois par jour et organisons un événement une fois par jour, nous aurons 60*60*24=86 400 efforts supplémentaires. Et il n'y a pas encore d'autre moyen.

Cela dépend de la tâche.

Si nous voulons attraper l'ouverture/la fermeture (non partielle) d'une position et l'établissement/la suppression d'un ordre, nous n'avons pas besoin de parcourir la liste à chaque fois dans une boucle.

Nous pouvons simplement vérifier les valeurs actuelles et précédentes de OrdersTotal(). Si nous détectons une différence, nous avons un événement, et ensuite nous examinons la valeur.

J'ai tout fait en utilisant la somme de hachage des propriétés order et position. Dès qu'il y a un changement - nous avons un événement - alors nous regardons ce qui a changé exactement là.

Mais j'avais une tâche pour tout suivre, et tout changement.

 
Aleksandr Volotko:
Dans ma situation spécifique, si les transactions sont exécutées une fois par jour et qu'un événement a lieu une fois par jour, nous devrons faire 60*60*24=86 400 efforts supplémentaires. Et il n'y a pas d'autre moyen.

Il existe également cette approche (si l'apparition d'un nouvel ordre n'est possible que du côté de l'EA) :

  1. Au début de l'EA, un tableau de ses ordres est généré en parcourant tous les ordres de la liste.
  2. À chaque nouveau tick, la présence de l'ordre est vérifiée à l'aide de la fonction

if (OrderSelect(nTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)

Si l'ordre existe, mettez à jour ses données si nécessaire. C'est si la surveillance du SL/TP/volume est nécessaire. Si cela n'est pas nécessaire, nous ne faisons rien d'autre.

Si l'ordre est trouvé dans la liste des ordres fermés (OrderCloseTime() > 0), alors il est supprimé du tableau. Le tableau ne sera réapprovisionné que lorsque l'ordre sera ouvert par un EA.

Par conséquent, nous n'aurons pas à parcourir la liste complète des ordres à chaque tic. Les opérations ne sont possibles qu'avec son propre tableau.

 

Je vais essayer de comparer les valeurs de OrdersTotal() pour le moment (merci à @Artyom Trishkin), cela devrait être suffisant. Je ne veux pas de fermetures partielles.

Pendant l'initialisation, j'attribuerai la valeur -1 à l'ancien ordre, de sorte qu'au départ, la vérification complète soit toujours effectuée, indépendamment de la présence d'ordres sur le marché.

Après cela, une nouvelle commande apparaîtra (événement) ou l'ancienne sera supprimée (événement) et même le symbole n'a pas d'importance - nous pouvons tout vérifier complètement, c'est toujours beaucoup moins fréquent que des tracasseries sans fin.

 
Aleksandr Volotko:

Je vais essayer de comparer les valeurs de OrdersTotal() pour le moment (merci à @Artyom Trishkin), cela devrait être suffisant. Je ne veux pas de fermetures partielles.

Pendant l'initialisation, j'attribuerai la valeur -1 à l'ancienne, de sorte qu'au démarrage, la vérification complète soit toujours effectuée, indépendamment de la présence d'ordres sur le marché.

Après cela, soit le nouvel ordre apparaîtra (événement), soit l'ancien sera supprimé (événement) et même le symbole n'a pas d'importance - nous pouvons effectuer une vérification complète de chacun d'eux, c'est toujours beaucoup moins fréquent qu'un martèlement sans fin.

Mais il faut faire attention, aujourd'hui j'ai fait face à une position fermée et une autre ouverte sur une autre, et presque en même temps entre les ticks.

Au final, OrdersTotal() est resté à 8. La logique du conseiller expert s'est embrouillée - il n'a pas recalculé les nouvelles données.