Monday 13 February 2017

Script Close All Order Forex Cargo

Il ya des moments où avoir la capacité rapide de double-cliquer sur un script pour fermer tous les métiers rentables sur un compte ou sur un nombre magique donnée vient à portée de main. Que vous preniez un bénéfice important ou petit, le script CloseAllAllSymbolsProfit MQL4 pour Metatrader appartient à chaque arsenal d'outils de trading de forex. Double-cliquez simplement sur le script dans le volet Navigateur après l'avoir copié dans le dossier approprié, et tous les métiers profiteurs ouverts (ordres ouverts) doivent être fermés pour le nombre magique sélectionné. La valeur par défaut est de fermer tous les métiers pour tous les numéros magiques (MagicNumber -1). CloseAllAllSymbolsProfit MQL4 est un script Metatrader 4 qui recherche dans un compte et ferme tous les métiers ouverts correspondant au nombre magique sélectionné. Par défaut, tous les métiers rentables sont fermés, ce qui fait un moyen pratique de quitter le marché et de prendre ce profit en un clin d'œil. Le script contient des valeurs par défaut qui s'exécuteront à moins que vous ne modifiez manuellement le code à partir du MetaEditor. Lorsque MagicNumber -1 ferme tous les numéros magiques extern int MagicNumber -1 pips de slippage pour permettre extern int Slippage 7 Si vous souhaitez modifier l'allocation maximale pour le glissement, vous devez modifier la valeur dans le code avant d'exécuter le script sur votre graphique . Cliquez avec le bouton droit de la souris sur le volet de navigation tout en sélectionnant le nom des scripts, puis choisissez Modifier. Cela devrait ouvrir le MetaEditor et charger le script dans la mémoire. Modifiez la valeur souhaitée, puis cliquez sur le bouton Compiler situé en haut du MetaEditor. Comment utiliser CloseAllAllSymbols. mq4 Téléchargez le fichier ci-dessous et copiez-le dans votre dossier ..expertsscripts. Après avoir redémarré Metatrader 4 afin qu'il ait une chance de compiler et trouver le script et le placer dans le volet Navigateur. Vous devriez voir le script CloseAllAllSymbolsProfit répertorié dans Scripts si vous avez copié le fichier dans le bon emplacement et redémarré votre Metatrader. Soyez prudent car lorsque vous double cliquez sur le script MT4 tous les métiers rentables sur TOUS les graphiques sélectionnés doivent fermer immédiatement Vous pouvez afficher ce script MT4 à d'autres sites, mais si vous le faites, vous devez publier un lien vers cette page directement et vous ne pouvez pas le vendre Ou le code source. Vous êtes par ailleurs libre de copier, utiliser et distribuer ce script MQL4 à des fins non commerciales. Note: mis à jour 11112011 pour éliminer un petit bogue qui empêchait le script de décharger correctement et retravaillé la direction de la boucle pour prendre toutes les possibilités de remplissage en compte. Fermeture et suppression des commandes Les demandes de commerce pour la fermeture des commandes du marché sont formées en utilisant la fonction OrderClose () . Function OrderClose () C'est une fonction utilisée pour fermer un ordre de marché. La fonction renvoie TRUE, si la transaction est effectuée avec succès. Il renvoie FALSE, si le commerce échoue. Ticket - le numéro unique de la commande. Lots - la quantité de lots à fermer. Il est permis de spécifier une valeur inférieure à la quantité de lots disponible dans l'ordre. Dans ce cas, si la demande de transaction est exécutée avec succès, l'ordre sera fermé en partie. Prix ​​- prix de clôture. Ce paramètre est établi en fonction des exigences et limites acceptées pour l'exécution des métiers (voir Caractéristiques et règles de commande pour la négociation et annexe 3). S'il n'y a pas de prix demandé pour la clôture de l'ordre du marché dans le flux de prix ou s'il est obsolète, cette demande commerciale sera rejetée si le prix est dépassé, mais trouvé dans le flux de prix et en même temps son écart À partir des gammes de prix actuelles dans la valeur du glissement, la demande commerciale sera acceptée par le terminal client et envoyée au serveur de commerce. Glissement - écart maximal autorisé du prix demandé pour la clôture de la commande du prix du marché (en points). Couleur - la couleur de la flèche de fermeture dans un graphique. Si ce paramètre n'est pas disponible ou si sa valeur est égale à celle de CLRNONE, la flèche ne sera pas affichée dans le graphique. Si le programme contient des informations sur le type d'ordre à fermer, sur son numéro unique, ainsi que sur la quantité de lots à fermer, il est très facile de fermer la commande. Pour cela, vous devez utiliser dans le code du programme l'appel de fonction OrderClose () avec des paramètres prédéfinis. Par exemple, si le numéro unique de la commande Achat est 12345 et si vous voulez fermer 0,5 lot, l'appel à la fonction de fermeture de l'ordre peut ressembler à ceci: Pour décider quels ordres et dans quelle séquence doit être fermée, Vous devez avoir des données de toutes les commandes ouvertes dans la situation actuelle. Dans MQL4, il existe un certain nombre de fonctions qui peuvent être utilisées pour obtenir diverses données qui caractérisent n'importe quel ordre. Par exemple, la fonction OrderOpenPrice () renvoie la valeur du prix d'ordre ouvert (ou du prix demandé pour les commandes en attente), la fonction OrderLots () renvoie la quantité de lots, la fonction OrderType () renvoie le type de l'ordre, Etc. Toutes les fonctions qui renvoient les valeurs d'une caractéristique d'ordre appelent lors de leur exécution à l'ordre sélectionné par la fonction OrderSelect (). Fonction OrderSelect () Afin d'obtenir les paramètres de vos ordres (peu importe le marché ou en attente, fermés ou supprimés), vous devez d'abord le sélectionner à l'aide de la fonction OrderSelect (). OrderSelect est une fonction qui sélectionne une commande pour d'autres opérations avec elle. Il retourne TRUE, si la fonction est exécutée avec succès. Sinon, il renvoie FALSE. Index - la position ou le numéro d'ordre, cela dépend du second paramètre. Select - le drapeau de la méthode de sélection. La sélection de paramètres peut prendre l'une des deux valeurs possibles: SELECTBYPOS - dans l'index de paramètres, le numéro de commande dans la liste est renvoyé (la numérotation commence par 0), SELECTBYTICKET - dans l'index de paramètres, le numéro de ticket revenu. Pool - la source de données pour la sélection. Le pool de paramètres est utilisé lorsque la sélection de paramètre est égale à la valeur de SELECTBYPOS. Le pool de paramètres est ignoré si l'ordre est sélectionné par le numéro de ticket (SELECTBYTICKET). Le pool de paramètres peut prendre deux valeurs possibles: MODETRADES (par défaut) - l'ordre est sélectionné dans les ordres ouvert et en attente, c'est-à-dire parmi les ordres affichés dans l'onglet quotTradequot de la fenêtre quotTerminalquot MODEHISTORY - l'ordre est sélectionné dans closed et deleted Ordres, c'est-à-dire parmi les ordres affichés dans l'onglet Historique de l'historique de quot de la fenêtre QuotTerminalquot. Dans ce cas, la profondeur de l'historique spécifié par l'utilisateur pour l'affichage des commandes fermées et supprimées est importante. Afin de démontrer la méthode d'utilisation des fonctions commerciales pour la fermeture des ordres du marché, permet de résoudre un problème: Problème 28. Écrivez un script qui ferme l'un des ordres de marché disponibles sur le compte. L'exécution du script doit entraîner la fermeture de l'ordre le plus proche de l'emplacement du script attaché à la fenêtre des symboles avec la souris. Supposons qu'il y ait trois ordres de marché ouverts dans le terminal pour le symbole EurUsd et un ordre en attente ouvert pour UsdChf: Fig. 90. Affichage de plusieurs ordres ouverts pour différents symboles dans la fenêtre du terminal. Nous devrions écrire un tel script qui peut être traîné par la souris de la fenêtre quotNavigatorquot dans la fenêtre de symbole, ce qui devrait aboutir à la fermeture d'un des ordres du marché, à savoir, l'ordre le plus proche du curseur (à partir du moment où l'utilisateur Relâché le bouton de la souris). Dans la Fig. 91, vous pouvez voir l'alternative, à laquelle le curseur est le plus proche de l'ordre Vendre 4372889. C'est cet ordre qui doit être fermé à la suite de l'exécution du script. Pour résoudre le problème, nous devons sélectionner (en utilisant la fonction OrderSymbol ()) parmi tous les ordres uniquement ceux ouverts pour le symbole, dans la fenêtre dont le script est supprimé. Ensuite, nous devrions trouver les prix ouverts de tous les ordres de marché sélectionnés (c'est-à-dire exécuter la fonction OrderOpenPrice () successivement pour chaque commande). Connaissant l'ordre des prix ouverts, nous pouvons facilement sélectionner l'un d'eux qui correspond à l'énoncé du problème. Pour spécifier les valeurs correctes des paramètres dans la fonction OrderClose (), nous devons également connaître d'autres données concernant l'ordre sélectionné: la quantité de lots (déterminée par la fonction OrderLots ()) et le numéro de commande unique Fonction OrderTicket ()). En outre, pour trouver un ou un autre prix d'un devis bidirectionnel, nous devons connaître le type de l'ordre (déterminé par la fonction OrderType ()). Considérons quels paramètres doivent être spécifiés dans la fonction OrderSelect () pour obtenir les caractéristiques d'ordre ci-dessus. Tout d'abord, il est nécessaire de choisir la méthode de sélection d'ordre. Dans notre problème, la méthode de sélection est déterminée par l'énoncé du problème lui-même: Les données sur les numéros de commande sont censées être indisponibles dans le programme dès le moment du lancement du script pour l'exécution, c'est-à-dire que le programme est censé contenir un bloc qui Déterminer les numéros de commande. Cela signifie que nous devrions vérifier tous les ordres un par un affichés dans quotTerminalquot (Figure 64.1), donc nous devons utiliser le paramètre SELECTBYPOS. La source de sélection des commandes est évidente, aussi bien. Pour résoudre le problème, il n'est pas nécessaire d'analyser les commandes fermées et supprimées. Dans ce cas, nous sommes intéressés uniquement par les commandes du marché, nous les rechercherons avec le paramètre MODETRADES dans la fonction OrderSelect (). Pour le pool de paramètres, la valeur par défaut de MODETRADES est spécifiée dans l'en-tête de fonction, donc elle peut être ignorée. Vous trouverez ci-dessous la façon dont un bloc d'analyse des ordres de marché et des ordres en attente peut être construit: Dans le titre de l'opérateur de cycle, la valeur initiale est spécifiée comme i1, alors que la condition de sortie du cycle est l'expression iltOrdersTotal (). La fonction OrdersTotal () renvoie le montant total des commandes du marché et des commandes en attente, c'est-à-dire celles qui sont affichées dans l'onglet quotTradequot de la fenêtre quotTerminalquot. C'est pourquoi il y aura autant d'itérations dans le cycle que de nombreux ordres de participer à la négociation. A chaque itération, lorsque la condition est calculée dans l'opérateur si, la fonction OrderSelect (i-1, SELECTBYPOS) sera exécutée. La question importante suivante doit être notée ici: La numérotation des commandes dans la liste des commandes en cours et en attente commence par zéro. Cela signifie que le premier ordre de la liste (figure 90) est placé en position zéro, la position du second ordre est numérotée 1, celle du troisième ordre est numérotée comme 2, etc. C'est pourquoi, dans la fonction Call OrderSelect (), la valeur de index est donnée sous la forme i-1. Ainsi, pour tous les ordres sélectionnés, cet indice sera toujours 1 inférieur à la valeur de la variable i (qui coïncide avec le numéro de la prochaine itération). La fonction OrderSelect () renvoie true si l'ordre est correctement sélectionné. Cela signifie qu'une sélection d'ordre peut échouer. Cela peut se produire si le montant des commandes a changé pendant leur traitement. Lors de la programmation en MQL4, vous devriez vous rappeler qu'un programme d'application fonctionnera en mode temps réel et que, pendant le traitement de certains paramètres, les valeurs de ces paramètres peuvent changer. Par exemple, la quantité d'ordres du marché peut changer en raison de la fois ouverture clôture des commandes et la modification des commandes en attente dans les marchés. C'est pourquoi vous devez respecter la règle suivante lors de la programmation du traitement des commandes: Les commandes doivent être traitées dès que possible, alors que le bloc de programme responsable de ce traitement ne doit pas, si possible, contenir des lignes de programme redondantes. Selon le code représenté sur la Fig. 64.3, dans l'en-tête de l'opérateur si, le programme analyse si l'ordre suivant est disponible dans la liste de commande au moment où il est sélectionné. Si l'ordre suivant est disponible, le contrôle sera passé dans le corps de l'opérateur si de traiter les paramètres de commande. Il est à noter qu'une telle construction n'aide guère, en cas de conflits possibles, parce que l'ordre peut être perdu (fermé) lors du traitement de ses paramètres. Cependant, cette solution s'avère être la plus efficace si, dès le moment de sa sélection, la commande n'est plus disponible. Dans le corps de l'opérateur si, les paramètres de l'ordre sélectionné sont analysés. Lors de l'exécution des fonctions OrderOpenPrice (), OrderTicket (), OrderType () et d'autres du type, chacune d'elles renverra la valeur d'une certaine caractéristique de l'ordre sélectionné à la suite de l'exécution de la fonction OrderSelect (). Tout le raisonnement ci-dessus a été utilisé dans le programme qui permettrait de résoudre le problème 28. Un exemple d'un script simple destiné à la fermeture d'un ordre de marché, dont le prix d'achat est plus proche de l'emplacement de l'attachement script que les prix ouverts des autres ordres (Closeorder. mq4). Le code entier du programme closeorder. mq4 est concentré dans la fonction spéciale start (). Dans le bloc 1-2, certaines variables sont initialisées. La variable Dist est la distance entre l'emplacement où le script a été abandonné et l'ordre le plus proche. La variable RealOrder est un indicateur qui affiche la disponibilité d'au moins un ordre de marché dans le terminal client (valeur non négative). La variable WinPrice est le prix auquel l'utilisateur a attaché le script à la fenêtre des symboles. Dans le bloc 2-6, l'ordre est analysé: Une des commandes disponibles est assignée pour être fermée. Le bloc 6-10 est le bloc de fermeture de l'ordre et de traitement des erreurs qui peuvent survenir lors de l'exécution du métier. A partir du moment où l'utilisateur a attaché le script à la fenêtre des symboles, les valeurs des variables sont calculées dans le bloc 1-2, la variable WinPrice prenant la valeur du prix, au niveau de laquelle l'utilisateur a attaché le script. Il est maintenant nécessaire de trouver l'ordre (avec ses caractéristiques) le plus proche de cet emplacement. Dans le cycle pour (bloc 2-6), les ordres sont recherchés. Dans le bloc 2-3, le programme vérifie s'il existe un ordre dans la ligne suivante du quotTerminalquot. Si un ordre est trouvé, le contrôle est transmis au corps de l'opérateur pour obtenir et analyser les caractéristiques de cet ordre. Dans le bloc 3-4, les ordres ouverts pour les symboles erronés (et non le symbole pour lequel le programme est exécuté) sont filtrés. Dans notre cas, c'est l'ordre 4372930 ouvert pour UsdChf. La fonction OrderSymbol () retourne le nom du symbole de l'ordre sélectionné. Si ce nom de symbole est différent de celui pour lequel le programme est exécuté, l'itération actuelle est interrompue, ce qui empêche l'ordre ouvert pour qu'un autre symbole soit traité. Si l'ordre en cours d'analyse s'ouvre pour le symbole quotour, un autre chèque sera effectué. Le type d'ordre est déterminé à l'aide de la fonction OrderType () (voir Types de métiers). Si le type de commande s'avère être supérieur à 1, cela signifie que l'ordre est en attente. Dans ce cas, l'itération actuelle est également interrompue parce que nous ne sommes pas intéressés par les commandes en attente. Dans notre exemple, nous avons un tel ordre, mais il est ouvert pour un autre symbole, donc il a déjà été filtré. Toutes les commandes qui passent le bloc 3-4 avec succès sont celles du marché. Le bloc 4-5 est destiné à sélectionner seulement un ordre de tous les ordres du marché qui ont passé avec succès le bloc précédent. Cet ordre doit être le plus proche du prix prédéfini (la valeur de la variable WinPrice). L'utilisateur n'est pas tenu de quotpinpointquot la ligne de commande avec son curseur de souris. L'ordre qui est plus proche que tout autre ordre du curseur au moment du lancement du script pour l'exécution sera sélectionné. Le prix d'achat de l'ordre traité est trouvé à l'aide de la fonction OrderOpenPrice (). Si la valeur absolue de la distance entre le prix de l'ordre courant et le prix quotcursor est inférieure à la même distance pour l'ordre précédent, l'ordre courant sera sélectionné (la valeur absolue de la distance est nécessaire pour exclure l'influence de La position du curseur - sous ou au-dessus de la ligne de commande). Dans ce cas, cet ordre sera mémorisé à l'itération actuelle du cycle en tant que coureur avant pour être fermé. Pour cette commande, le numéro de ticket (le numéro individuel de la commande) et la quantité de lots sont calculés à la fin du bloc 4-5. Dans cet exemple (figure 90), le montant total des commandes est de quatre (trois marchés et un ordre en attente), il y aura donc quatre itérations exécutées dans le cycle pour, ce qui permettra de trouver toutes les données nécessaires pour la fermeture d'un Sélectionnée. Ensuite, la commande dans le programme d'exécution sera transmise à l'opérateur de cycle pendant (bloc 6-10). Dans le bloc 6-7, les commandes du marché trouvées sont vérifiées pour la disponibilité. Si aucun ordre de marché n'est trouvé dans le bloc 2-4 (il est tout à fait possible, en général), la valeur du drapeau RealOrder reste égale à -1, ce qui signifie l'indisponibilité des commandes du marché. Si la vérification dans le bloc 6-7 ne détecte aucune commande de marché, l'exécution du cycle pendant qu'elle est interrompue, le programme termine alors ses opérations. Si la valeur de la variable RealOrder s'avère égale à 0 ou 1, cela signifie qu'un marché est prédéfini pour la fermeture et doit être fermé. Dans le bloc 7-8, selon le type d'ordre, le prix de clôture de la commande est calculé. Il s'agit de la valeur des ordres Bid for Buy et de la valeur des commandes Ask for Sell (voir Exigences et restrictions dans la création de métiers). Dans le bloc 7-8, les valeurs de la variable auxiliaire Texte sont calculées. La demande de négociation pour la clôture de la commande est formée dans la fonction OrderClose () dans la ligne ci-dessous: Fonction commerciale OrderClose () retourne vrai, si le commerce est effectué avec succès, et faux, sinon. Si la demande de transaction est exécutée avec succès sur le serveur, la valeur true sera affectée à la variable Ans (réponse). Dans ce cas, lors de l'exécution du bloc 8-9, le programme informera l'utilisateur de la réussite de la fermeture de commande. Après cela, l'exécution de l'opérateur de cycle pendant sera arrêtée, et le programme mettra fin à ses opérations. Sinon, le contrôle sera passé au bloc 9-10 afin d'analyser l'erreur renvoyée par le terminal client au programme. Au début du bloc 9-10, le code d'erreur est calculé. Ensuite, selon le code d'erreur, soit la sortie du programme soit l'opération répétée sont exécutées. Dans le premier commutateur d'opérateur, le programme traite les erreurs qui sont implicitement dépassables, c'est-à-dire que les erreurs peuvent être considérées comme des difficultés temporaires dans l'exécution du commerce. Toutes les actions nécessaires sont prises pour chacune de ces erreurs, puis l'itération en cours est arrêtée et l'exécution du cycle redémarre. (Veuillez noter que, dans cet exemple, nous utilisons pour le traitement d'erreur le commutateur d'opérateur qui est sorti en tant que résultat de l'utilisation de l'opérateur de continuer que, comme tel, n'est pas destiné à passer le contrôle en dehors de l'interrupteur de l'opérateur. Simplement parce que le commutateur d'opérateur fait partie du contenu de l'opérateur de cycle externe tandis que l'opérateur continue à interrompre l'itération en cours en passant le contrôle à l'en-tête de l'opérateur pendant que). Si le code d'erreur n'est pas traité dans le premier commutateur d'opérateur, cette erreur est considérée comme critique. Dans ce cas, la commande est passée au deuxième commutateur d'opérateur, qui est exécuté pour informer l'utilisateur qu'une ou une autre erreur critique s'est produite. En outre, le programme utilise la pause d'opérateur qui interrompt l'exécution du cycle while. La sortie du cycle, pour une raison quelconque, entraînera le passage de la commande vers le bloc 9-10 qui produit un message concernant la fin des opérations du programme. Le retour de l'opérateur arrête l'exécution de la fonction spéciale start (), et le programme termine ses opérations. Le résultat pratique obtenu après le lancement du script dans les conditions indiquées (voir figures 90 et 91) est présenté ci-dessous. Le commerce a été effectué avec succès sur le serveur. À la suite de la clôture de l'un des ordres, il reste deux commandes dans la fenêtre d'EurUsd. La fermeture de la commande a également été affichée dans la fenêtre QuotTerminalquot: Fig. 94. Après l'exécution du script closeorder. mq4. Deux ordres de marché sont affichés dans la fenêtre de quotTerminal. Plus tard, les deux autres ordres sont fermés en utilisant ce script, aussi. Suppression des commandes en attente Les demandes de suppression des commandes en attente sont créées à l'aide de la fonction OrderDelete (). Function OrderDelete () La fonction supprime l'ordre précédemment placé en attente. Il retourne TRUE, s'il a bien fonctionné. Sinon, il renvoie FALSE. Ticket - le numéro unique d'une commande. Arrowcolor - la couleur d'une flèche dans un graphique. Si ce paramètre n'est pas disponible ou si sa valeur est égale à celle de CLRNONE, la flèche ne sera pas affichée dans le graphique. Il est facile de voir que la fonction OrderDelete () ne contient pas une spécification du volume et le prix de clôture de la commande à supprimer. L'ordre est supprimé indépendamment des prix du marché. La suppression partielle d'un ordre est également impossible. Vous pouvez diminuer la quantité de lots dans un ordre en attente en deux étapes: supprimer l'ordre existant, puis placer un nouvel ordre en attente avec la diminution (n'importe quelle quantité) de lots. L'algorithme du programme qui supprimera un ordre en attente peut être tout à fait identique à celui de la fermeture du marché. Une légère différence réside dans le fait qu'aucun prix proche n'est nécessaire pour supprimer un ordre en attente, de sorte que le programme ci-dessous ne contient pas le bloc qui met à jour les prix du marché. Un exemple de script simple destiné à la suppression d'un ordre en attente dont le prix demandé est plus proche de l'emplacement de l'attachement de script que les prix des autres commandes en attente (deleteorder. mq4). Le bloc de traitement d'erreur a également été légèrement modifié. Vous devriez considérer la possibilité d'erreurs liées à des changements de prix (erreurs 135 et 136) lors de la clôture des commandes du marché, mais ces erreurs ne se produisent pas lors de la suppression des commandes en attente. Pour la même raison, la fonction RefreshRates () n'est utilisée nulle part dans le programme. Traiter des erreurs telles que l'erreur 4 et l'erreur 137 (voir Codes d'erreur) peut être un peu difficile. Par exemple, lors de l'obtention de l'erreur 137, le programme peut prendre en considération que quotbroker est occupé. Toutefois, une question naturelle se pose: Quand est le courtier gratuit, pour l'utilisateur de continuer son erreur de négociation ne fournit pas de telles informations. C'est pourquoi le programmeur doit décider lui-même comment construire le programme de traitement de telles erreurs correctement. Dans un cas simple, la requête peut être répétée après une certaine pause (dans notre exemple, en 3 secondes). D'autre part, après une série de tentatives infructueuses de supprimer (ou, dans un cas commun, de fermer, d'ouvrir ou de modifier) ​​un ordre, le serveur peut renvoyer l'erreur 141 - trop de requêtes. Cette erreur se traduit par le fait que le script deleteorder. mq4 cesse de fonctionner. Généralement, ces conflits ne sont pas des questions de programmation. Dans ce cas, vous devriez contacter le service de support des centres de transaction et clarifier les raisons du rejet pour exécuter la demande de transaction. Erreur 145 peut se produire, si un ordre en attente (dans un cas commun, il peut être un ordre d'arrêt d'un ordre du marché) est trop proche du prix du marché. Cette erreur ne se produit pas, si vous négociez régulièrement sur un marché calme. Si les prix changent rapidement, votre courtier peut décider qu'une commande sera bientôt ouverte, de sorte que le courtier ne permettra pas de la supprimer ou de la modifier. Cette erreur est considérée dans le script comme critique et entraîne la résiliation du programme (il ne fait aucun sens de déranger le courtier avec des demandes commerciales). Si le prix change au bout d'un certain temps, vous pouvez essayer de supprimer l'ordre en lançant à nouveau le script pour l'exécuter. Généralement, l'occurrence de l'erreur 145 peut être évitée, si l'on considère le niveau de gel défini par le centre de traitement. Le niveau de gel est une valeur qui détermine la bande de prix, dans laquelle l'ordre est considéré comme gelé, c'est-à-dire qu'il peut être interdit de le supprimer. Par exemple, si un ordre en attente est placé à 1.2500 et que le niveau de gel est égal à 10 points, cela signifie que si le prix varie de 1.2490 à 1.2510, la suppression de l'ordre en attente est interdite. Vous pouvez obtenir la valeur de niveau de gel après avoir exécuté la fonction MarketInfo () avec l'identificateur de requête de MODEFREEZELEVEL. Clôture des ordres opposés L'ordre opposé est un ordre du marché ouvert dans la direction opposée à la direction d'un autre ordre du marché ouvert pour le même symbole. Si vous avez deux ordres opposés pour un certain symbole, vous pouvez les fermer simultanément, un par un autre, en utilisant la fonction OrderCloseBy (). Vous épargnerez un écart si vous effectuez une telle opération. Fonction OrderCloseBy () La fonction ferme un ordre de marché par un autre ordre de marché ouvert pour le même symbole dans la direction opposée. La fonction retourne TRUE, si elle est terminée avec succès, et FALSE, sinon. Ticket - le numéro unique de la commande à fermer. Opposé - le numéro unique de l'ordre opposé. Couleur - la couleur de la flèche de fermeture dans un graphique. Si ce paramètre n'est pas disponible ou si sa valeur est égale à celle de CLRNONE, la flèche ne sera pas affichée dans le graphique. Il n'est pas nécessaire que les ordres opposés aient le même volume. Si vous fermez une commande par un ordre opposé, la transaction sera exécutée dans le volume de la commande qui a le volume le plus petit. Prenons un exemple. Qu'il y ait deux ordres de marché du même volume dans le terminal client, un achat et un vendre. Si on ferme chacun d'eux séparément à l'aide de la fonction OrderClose (), notre résultat économique sera la somme des profits obtenus à partir de chaque commande: Fig. 95. Résultat de la fermeture séparée des ordres à l'aide de la fonction OrderClose (). Cependant, si nous utilisons dans cette situation la fonction OrderCloseBy () destinée à la fermeture opposée des ordres, la production économique sera meilleure (par rapport à la précédente) par le montant proportionnel au coût d'une propagation de commandes: Fig. 96. Résultat de clôture d'ordres par d'autres ordres à l'aide de la fonction OrderCloseBy (). Il est évident que s'il y a des ordres opposés à fermer dans le terminal, il serait économiquement rationnel d'utiliser la fonction OrderCloseBy (), not OrderClose (). Quant à la sauvegarde d'un spread à la fermeture des ordres opposés, nous devrions donner quelques explications plus générales. En effet, l'ouverture d'une commande (par exemple, une commande Achat) est implicitement une opération qui est opposée à l'ouverture d'une commande dans la direction opposée (c'est-à-dire une commande de Vente) au même degré que la commande commande). En d'autres termes, il est économiquement identique lequel des alternatives à utiliser: juste pour fermer un ordre du marché ou pour ouvrir un ordre opposé du même volume (et puis fermer les deux ordres les uns aux autres). La différence entre ces deux alternatives ne peut consister que dans différentes méthodes utilisées dans différents centres de négociation pour calculer l'argent à détourner pour soutenir les ordres du marché (voir figure 85 et figure 88). Il est également facile de voir que le prix de clôture n'est pas nécessaire d'être spécifié dans la fonction OrderCloseBy () pour la fermeture des ordres opposés. Il n'est pas nécessaire, parce que le profit et la perte de deux ordres opposés se remboursent mutuellement, de sorte que la production économique totale ne dépend pas du prix du marché. Bien entendu, cette règle ne s'applique qu'aux ordres du même volume. Si, par exemple, nous avons deux ordres pour un symbole: un ordre d'achat de 1 lot et un ordre de vente de 0,7 lot, ce commerce dépend uniquement du prix de marché lié à la partie commande d'achat de 0,3 lot, tandis que 0,7 lot de Les deux ordres ne dépendent pas du prix symbole. Les ordres opposés n'influencent pas le total des résultats de négociation. C'est pourquoi les tactiques commerciales basées sur l'ouverture d'ordres opposés n'ont pas de contenu informel (pour cette raison, certains centres de négociation forcément fermer tous les ordres opposés dans les quantités coïncidentes de lots). La seule influence (négative) de telles tactiques peut consister à détourner l'argent selon les règles acceptées dans certains centres de négociation. En outre, la disponibilité de plusieurs ordres opposés donne plus de difficultés dans le contexte du commerce programmé que dans un ordre. Si l'on considère diverses commissions et swaps (pour chaque ordre de marché séparément), la nécessité de fermer des ordres opposés devient évidente. Exemple d'un script simple qui ferme tous les ordres opposés pour un symbole (closeby. mq4). L'algorithme du script ci-dessus est un peu différent des précédents. Cette différence consiste en ce que le même code doit être exécuté plusieurs fois afin de fermer plusieurs ordres (le montant des ordres à fermer en non limité) avec succès. Le script a été testé sur un ensemble aléatoire de commandes du marché. 5 ordres de volumes différents sont représentés sur la Fig. 97 ci-dessous. Afin de fermer les ordres opposés disponibles, nous devrions pré-définir les critères de sélection. Ce critère dans l'algorithme donné est la taille de l'ordre - les ordres de grands volumes sont fermés en premier, puis les ordres de volumes plus petits sont fermés. Après que les ordres opposés de volumes différents ont été fermés, les ordres des volumes de repos restent. Par exemple, la fermeture d'ordres opposés Achat (1 lot) et Vente (0,8 lot) se traduira par cette commande Achat (0,2 lot) reste ouvert. C'est pourquoi, après chaque clôture réussie, le programme doit se référer à la liste mise à jour des ordres pour trouver deux autres ordres opposés les plus importants dans cette liste mise à jour. Les calculs ci-dessus sont réalisés dans un cycle (conditionnellement) continu tandis que dans les blocs 2-10. Le début du cycle, à chaque itération le programme suppose qu'il n'y a plus d'ordres d'un certain type. Pour cela, la valeur de -1 est affectée aux variables HedgBuy et HedgSell. L'algorithme du bloc de traitement des ordres est en général préservé (voir le code de closeby. mq4). Dans le cycle de recherche de commandes, à savoir dans le bloc 3-4, comme dans les programmes précédents, des ordres non triés sont filtrés. Dans ce cas, il s'agit d'ordres ouverts pour un autre symbole et des commandes en attente. Dans le bloc 4-5, le volume de chaque ordre vérifié dans le bloc 3-4 est calculé. S'il s'avère pendant les calculs que l'ordre actuellement traité est le plus grand volume parmi toutes les commandes traitées, son billet est stocké. Cela signifie que l'ordre ayant ce ticket est, à ce stade de calcul, un candidat pour la fermeture d'ordres opposés. Au moment où la dernière itération du cycle de finitions, les billets d'ordres avec quantité maximale de lots ouverts dans des directions opposées ont déjà été connus. Ces commandes sont sélectionnées par le programme. Si des commandes de n'importe quel type sont déjà indisponibles à ce moment, le bloc 5-6 quitte le programme. Le bloc 6-10 représente le traitement des erreurs. Il est complètement le même que ceux considérés ci-dessus (dans cette section et les précédentes). La demande de transaction pour la fermeture d'ordres opposés est formée dans le bloc 7-8 en utilisant la fonction OrderCloseBy (). S'il échoue, selon le code d'erreur, le programme passe le contrôle soit pour réessayer de faire le commerce (pour les mêmes billets) ou pour le retour opérateur qui termine les opérations du programme. Si une transaction est effectuée avec succès, le programme quitte le bloc de traitement d'erreur et l'itération actuelle du cycle le plus externe se termine. La prochaine itération de ce cycle, tous les calculs seront répétés: la recherche dans les ordres disponibles, la sélection des ordres du marché, sélectionnée une pour chaque type d'ordre, formant une demande de transaction pour la fermeture opposée, et l'analyse des erreurs suivantes. This cycle is executed until there are no available orders of a certain type (or, in a particular case, of both types) in the terminal. This event will be calculated in block 5-6, then the program ends its operations. The following messages were received at the execution of the script closeby. mq4 intended for closing of market orders shown in Fig. 97: On the quotAccount Historyquot tab of the quotTerminalquot window, you can see that some orders are closed with a zero profit. This is what we save when closing opposite orders. You can compare economic results in Fig. 97 and Fig. 99: On the quotJournalquot tab in the quotTerminalquot window, you can track the history of order closing (the latest events are on top): the execution of the script, according to the algorithm, the orders of maximum volume available at the moment will be closed. In spite of the fact that the orders were opened in a random sequence (Fig. 97), the first orders to be closed were Buy 778594 and Sell 778595, with the volumes of 1 lot and 0.8 lot, respectively (the lower lines in Fig. 100). Since these orders have different volumes, the opposite closing produced a new order, Buy 778597, with the resting volume of 0.2 lot. Then the program selected orders Buy 778592 and Sell 778593, 0.5 lot each, to be closed as opposite orders. These orders were closed without opening a resting order. By the moment the third iteration started, two orders had remained in the symbol window in the external cycle: initial order Sell 778596 of 0.3 lot and the order opened as a result of the execution of the script, Buy 778597 of 0.2 lot. In the upper lines of Fig. 100, you can see that those orders are also closed as opposite orders. The volumes of those orders were different, so the last trade resulted in that one market order of 0.1 lot remained in the symbol window (please note the economic results): It is convenient to use the script closeby. mq4 in manual trading, especially in cases of many differently-directed market orders available in the symbol window.


No comments:

Post a Comment