Erreurs, bugs, questions - page 2450
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Aidez-moi avec OnTradeTransaction(). Le comportement décrit ci-dessous est-il normal ? Je l'ai vérifié dans le testeur - c'est ainsi :( Et sur un compte "live" ?
OnTick() a une boucle qui ferme les positions dans l'ordre.
La fonction OnTradeTrancaction() calcule le nombre de positions ouvertes.
Le conseiller expert procède de la manière suivante : il ferme d'abord la boucle jusqu'à la fin, puis il passe à OnTradeTransaction et effectue les calculs dans le même ordre.
En d'autres termes, il n'y a pas
а
c'est-à-dire qu'il fonctionne de manière séquentielle et non en parallèle.
Si la description ci-dessus est normale, il s'avère que OnTradeTransaction() peut être utilisé en toute sécurité uniquement dans les Expert Advisors qui n'ouvrent/ferment qu'un seul ordre. S'il y a une grille ou une grille multi-symboles (ou une grille multi-symboles, c'est là qu'on la trouve :) ) - l'algorithme s'effondre.
Citation de la documentation
Une demande de transaction envoyée manuellement depuis le terminal ou via les fonctions OrderSend()/OrderSendAsync() peut générer plusieurs transactions consécutives sur le serveur de transactions. De plus, l'ordre d'arrivée de ces transactions sur le terminal n'estpas garanti. Nous ne pouvons donc pas construire notre algorithme de négociation en attendant l'arrivée d'une transaction commerciale après l'autre.
Par conséquent, tout sera calculé, mais pas dans l'ordre prévu.
Pouvez-vous expliquer pourquoi vous avez décidé de compter le nombre de positions dans OnTradeTrancaction() ? Si le calcul n'est pas organisé correctement, on ne peut exclure qu'il y ait des opérations inutiles. Après tout, si vous fermez plusieurs positions dans la boucle, il n'est pas nécessaire de les recalculer toutes après avoir fermé chaque position. Il suffit de les compter une fois que la boucle est terminée. Ou bien, arrangez-vous dans OnTradeTrancaction() de telle sorte que la quantité augmente de 1 lorsque le type IN est défini, et diminue lorsque le type OUT est défini. Et même dans ce cas, si la position n'est pas complètement fermée, il faut en tenir compte.
Pouvez-vous expliquer pourquoi vous avez décidé de compter le nombre de positions dans OnTradeTrancaction() ?
Si vous comptez sur chaque tic, cela demande beaucoup de ressources, ce qui est particulièrement visible chez le testeur de stratégie. Ne serait-il pas plus correct de ne compter que lors de l'événement Trade, c'est-à-dire lorsqu'un élément de la liste des positions ouvertes change réellement ? Avec OnTradeTransaction(), il est plus facile de contrôler l'intervention de l'utilisateur dans l'EA. (Il y a des précédents :)
Dans ce robot, je testais la possibilité de fermer la grille par le schéma : Perte + profit > X , puis de fermer les deux (généralement sur des symboles différents). Mais un échec se produit, car même s'ils sont fermés, le testeur n'en est pas conscient et passe à l'itération suivante, en "jumelant" par erreur les existants avec ceux déjà fermés. C'est-à-dire que j'ai dû ajouter un nouveau calcul après chaque fermeture.
J'ai un recalcul avec un compteur de remise à zéro et sur tous les ouverts d'abord, pas +1 / -1
Citation de la documentation
Je suis d'accord, il était trop risqué d'utiliser OnTradeTransaction() au début. En général, je le refuserais probablement dans les cas où les requêtes ne sont pas asynchrones - seuls les problèmes en découlent.
Pour une grille multi-symboles, l'asynchronie est une bonne chose. C'est pourquoi je choisirais la deuxième option.
Je pense déjà dans cette direction ;)
***
Dans ce robot, j'ai testé la possibilité de fermer des grilles selon le schéma : perte + profit > X , puis de fermer les deux (généralement sur des symboles différents).
***
Si vous savez que vous voulez fermer exactement ces deux positions, il est préférable de mémoriser les tickets de ces positions, et de les fermer jusqu'à ce que vous les fermiez (ATTENTION : pas de while et de Sleep - donnez des ordres de fermeture, sortez de OnTick, vérifiez s'il y a d'autres positions avec ces tickets - si oui, essayez de les fermer à nouveau et sortez de OnTick).
Si vous savez que vous devez fermer exactement ces deux positions, il est préférable de se souvenir des tickers de ces positions et de les fermer jusqu'à ce que vous les fermiez (NOTE : pas de while et de Sleep - donnez des ordres de fermeture, sortez de OnTick, vérifiez s'il y a d'autres positions avec ces tickers - s'il y en a, essayez de les fermer à nouveau et sortez de OnTick).
C'est une idée précieuse. Peut-être que la fonction OnTick() forme un tableau avec le ticket et essaie de le fermer une fois, et que la fonction OnTimer() vérifie s'il y en a d'autres et les ferme, le cas échéant.
Il peut y avoir plusieurs minutes entre les tics, alors passons la tâche au minuteurUne idée précieuse. Peut-être : OnTick() génère un tableau avec les tickets et essaie de les fermer une fois, tandis que OnTimer() vérifie s'ils sont toujours présents et les ferme s'ils le sont.
Entre deux ticks, il peut s'écouler plusieurs minutes, alors passons la tâche à un timerJ'abandonnerais ALL while, Sleep et OnTimer pour la tâche de fermeture des positions. Je ferais ce qui suit : déclencher des ordres de fermeture - sortir sur OnTick, sur le tick suivant, je vérifierais si les positions avec les tickets nécessaires sont toujours en vie - à nouveau déclencher des ordres de fermeture, et ainsi de suite dans la boucle via l'entrée/sortie sur OnTick.
La logique est la suivante : la fermeture d'une position est la première priorité, donc la boucle de fermeture est au tout début de OnTick. Et la formation d'un tableau de tickets de clôture peut se faire n'importe où sur le tick - même à la toute fin.
***
Il peut y avoir plusieurs minutes entre les tics, alors passons la tâche au minuteurIl n'y a donc rien à faire - nous devons simplement attendre un nouveau tic.
OnTick() génère un tableau avec les tickets et essaie de les fermer une fois, et OnTimer() vérifie s'ils sont toujours présents et les ferme s'ils le sont.
Une autre option (pour le monde réel, c'est la meilleure) est d'exécuter l'EA dans un environnement virtuel (l'exécution y est parfaite), et dans le monde réel seulement la synchronisation avec le virtuel.
Il n'y a donc rien à faire - il suffit d'attendre le prochain tic-tac.
Si, par exemple, il y a une panne de réseau, attendre le prochain tic-tac est une occasion manquée de conclure.
Si, par exemple, il y a une panne de réseau, attendre le prochain tic-tac, c'est manquer une occasion de conclure.
Défaillance du réseau == déconnexion ? S'il n'y a pas d'internet, rien ne peut être fermé ou ouvert - quel genre d'occasion manquée est-ce là ?
En général, si le système de trading est très sensible à chaque éternuement (une défaillance de connexion ou autre) - alors au diable un tel système de trading.