Monday 20 February 2017

Déménagement Moyenne Mql4 Exemple

Je suis nouveau en écrivant un conseiller expert, et j'ai besoin d'aide avec mon conseiller d'expert de la moyenne mobile simple de croisement simple. Mon code est très basique. Il vendsbuys quand la moyenne mobile plus petite se déplace ci-dessous au-dessus de la moyenne mobile plus grande. Ce que je veux faire, c'est cela. Un ordre est placé lorsque la moyenne mobile plus petite croise au-dessus de la plus grande moyenne mobile, de sorte que l'EE achète. Quand la moyenne mobile plus petite croise alors au-dessous de la moyenne mobile plus grande je veux vendre cet ordre. Tout est bien Et en même temps je veux placer un nouvel ordre pour buysell en fonction du dernier ordre. Je ne veux pas attendre le prochain croisement. Ainsi, lorsqu'une commande est fermée, une autre doit être placée. Obtenez-le S'il vous plaît quelqu'un peut-il aider à modifier mon code existant Voyant que je suis un débutant, quelqu'un peut faire des commentaires sur le code qui a été écrit J'ai joint mon fichier actuel. Salutations, Brendan (Afrique du Sud) Je suis nouveau en écrivant un conseiller expert, et j'ai besoin d'aide avec mon conseiller expert de moyenne mobile simple de croisement double. Mon code est très basique. Il vendsbuys quand la moyenne mobile plus petite se déplace ci-dessous au-dessus de la moyenne mobile plus grande. Ce que je veux faire, c'est cela. Un ordre est placé lorsque la moyenne mobile plus petite croise au-dessus de la plus grande moyenne mobile, de sorte que l'EE achète. Quand la moyenne mobile plus petite croise alors au-dessous de la moyenne mobile plus grande je veux vendre cet ordre. Tout est bien Et en même temps je veux placer un nouvel ordre pour buysell en fonction du dernier ordre. Je ne veux pas attendre le prochain croisement. Ainsi, lorsqu'une commande est fermée, une autre doit être placée. Obtenez-le S'il vous plaît quelqu'un peut-il aider à modifier mon code existant Voyant que je suis un débutant, quelqu'un peut faire des commentaires sur le code qui a été écrit J'ai joint mon fichier actuel. Regards, Brendan (Afrique du Sud) Vos fichiers ne sont pas joints. Pouvez-vous essayer d'attacher le fichier mq4 Juste un commentaire côté que les croix des MA ne sont pas le meilleur moment pour buysell. Au moment où les croix se produisent, le changement de direction est déjà bien en cours, de sorte que le buysell peut être un peu tard. Le MACD qui suit les différences d'écart entre 2 MAs est un meilleur indicateur de changement de direction. L'histogramme suit la direction, la ligne de signal indique si la direction est vers le haut ou vers le bas. C'est la théorie de toute façon. Alors vous pensez que je dois rayer le 2 MA crossover et écrire un nouveau système expert avec un MACD Avez-vous peut-être un exemple fonctionnel de ceci avec vous s'il vous plaît Voici mon 2 SMA crossover: int Crossed (double ligne1, double ligne2) static int lastdirection 0 static int currentdirction 0 if (ligne1 gt line2) currentdirction 1 up if (ligne1 lt ligne2) currentdirction 2 down int cnt, ticket, total double shortSma, longSma if (Barres lt 100) Print (quotbars less than 100quot) return (0) (0, 5, 0, MODESMA, PRICECLOSE, 0) MODE DE SIGNALISATION DE L'IMPRIMANTE , 0) int estCrossed Crossed (shortSma, longSma) if (total lt 1) if (isCrossed 1) ticket OrderSend (Symbol (), OPBUY, Lots, Ask, 3, 0, AskDoble SMA Crossover H1quot, 12345, 0, Bleu) if (ticket gt 0) if (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) Print (quotBUY order ouvert. Quot, OrderOpenPrice () Quot, GetLastError ()) return (0) if (isCrossed 2) ticket OrderSend (Symbole (), OPSELL, Lots, Bid, 3, 0 (Bid - TakeProfit Point), quotDouble SMA Crossover H1quot, 12345, If (ticket gt 0) if (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) print (quotSELL order ouvert. Quot, OrderOpenPrice ()) else Print (quotError ouvrant la commande SELL, quot, GetLastError () ) Pour (cnt 0 cnt lt cnt total) OrderSelect (cnt, SELECTBYPOS, MODETRADES) si (OrderType () lt OPSELL ampamp OrderSymbol () Symbole ()) si (OrderType () OPBUY) (TrailingStop gt 0) si ((Bid - OrderOpenPrice ()) gt (Point TrailingStop) ) Si (OrderStopLoss () lt (Bid - Point TrailingStop)) OrderModify (OrderTicket (), OrderOpenPrice (), (Bid - Point TrailingStop), OrderTakeProfit (), 0, Green) Fermer si (isCrossed 1) OrderClose (OrderTicket (), OrderLots (), Ask, 3, Violet) close position retour (0) exit check pour trailing stop si (TrailingStop gt 0) (OrderStopLoss)) (OrderStopLoss () 0)) OrderModify (OrderTicket (), OrderOpenPrice (), (Ask Point TrailingStop), OrderTakeProfit (), 0, Red) retourner (0) Donc vous pensez que je dois gratter le 2 MA crossover et écrire un nouveau système expert avec un MACD Avez-vous peut-être un exemple fonctionnel de ceci avec vous S'il vous plaît voici mon 2 SMA crossover: int Crossed (double line1, double line2) Static int lastdirection 0 statique int currentdirction 0 if (ligne1 gt line2) currentdirction 1 up if (ligne1 lt line2) currentdirction 2 vers le bas int cnt, ticket, total double shortSma, longSma if (Barres lt 100) Print (quotbars less than 100quot) return (0) if (TakeProfit lt 10) Imprimer (quotTakeProfit moins de 10quot) return (0) vérifier TakeProfit shortSma iMA (NULL, 0, 5, 0, MODESMA, PRICECLOSE, 0) (S) (s) (s), (s) (s) (s) (s) (s) (s) Crossover H1quot, 12345, 0, Blue) si (ticket gt 0) si (OrderSelect (ticket, SELECTBYTICKET, MODETRADES)) Imprimer (quotBUY ordre ouvert. (0) if (isCrossed 2) ticket OrderSend (Symbole (), OPSELL, Lots, Bid, 3, 0, (Bid - TakeProfit (Ticket, SELECTBYTICKET, MODETRADES)) Print (quotSELL ordre ouvert. Quot, OrderOpenPrice ()) else Imprimer (quotError ouverture de la commande VENDRE), quotDouble SMA Crossover H1quot, 12345, 0, Rouge) if (ticket gt 0) (Cnt, SELECTBYPOS, MODETRADES) if (OrderType () lt OPSELL ampamp OrderSymbol () Symbole ()) if (OrderType () OPBUY) la position longue est ouverte si elle est fermée si (isCrossed 2) OrderClose (OrderTicket (), OrderLots (), Bid, 3, Violet) close position return (0) exit check pour trailing stop if (TrailingStop gt 0) Si OrderStopLoss () (Order-Stop) (Order-Stop) () (OrderTollPost () (0), retour à la position courte si elle est fermée si (isCrossed 1) OrderClose (OrderTicket (), OrderLots (), Ask, 3, Violet) (OrderOpenPrice () - Ask) gt (Point TrailingStop)) si ((OrderStopLoss () gt (Ask Point TrailingStop)) (OrderStopLoss () 0)) OrderModify (OrderTicket () (0) Usage des indicateurs techniques Selon l'appartenance au système de trading en ligne MetaTrader 4, il existe deux types d'indicateurs dans MQL4: technique et personnalisée. Indicateur technique est une partie intégrante du système de trading en ligne MetaTrader, fonction intégrée qui permet de dessiner sur l'écran une certaine dépendance. Propriétés des indicateurs techniques Dessin dans la fenêtre de sécurité Chaque indicateur technique calcule une certaine dépendance prédéfinie. Pour dessiner cette dépendance graphiquement sur l'écran, un indicateur technique doit être joint à un graphique. Cela peut se faire via le menu système Insérer les indicateurs gtgt ou via la fenêtre Navigateur d'un terminal client. Pour attacher un indicateur technique à un graphique à partir de la fenêtre Navigateur, une méthode très simple est utilisée - drag-amp-drop du nom de l'indicateur technique de la fenêtre Navigateur à une fenêtre de graphique. Par conséquent, une ou plusieurs lignes calculées dans cet indicateur apparaîtront dans la fenêtre du graphique. Les indicateurs d'un indicateur technique peuvent être tracés à la fois dans la fenêtre du graphique principal et dans une fenêtre séparée dans la partie inférieure d'une fenêtre de sécurité. Dans la Fig. 104 indicateur technique L'alligator est dessiné dans une fenêtre de diagramme. Code Unchangeability Tous les indicateurs techniques sont intégrés, leur code n'est pas disponible pour faire des modifications. Ainsi, un utilisateur est protégé contre une modification erronée des indicateurs techniques intégrés. Toutefois, le code source sur lequel est calculé un indicateur technique est disponible sur le site Web du développeur de logiciels (MetaQuotes Software Corp.) dans la section Indicateurs techniques. Si nécessaire, un programmeur peut utiliser le code complet ou une partie de celui-ci pour créer des indicateurs personnalisés (voir Création d'indicateurs personnalisés). Fonctions d'appel des indicateurs techniques La représentation graphique visible à un utilisateur est affichée par un terminal client. De plus, pour plus de commodité, nous appelerons ces lignes indicatrices de dessins. La ligne indicatrice est un affichage graphique d'une certaine dépendance basée sur les valeurs numériques incluses dans un tableau indicateur. Le type de ligne d'indicateur est configuré par un utilisateur. La ligne d'indicateur peut être affichée sous la forme d'une ligne pleine ou en pointillés, d'une couleur spécifiée, ainsi que sous la forme d'une chaîne de certains signes (points, carrés, anneaux, etc.). Au cours des calculs d'indicateurs, des ensembles de valeurs numériques sont calculés dans les lignes d'indicateurs qui seront tirées conformément à ces calculs. Ces ensembles de valeurs sont stockés dans des tableaux d'indicateurs. Indicator Array est un tableau unidimensionnel contenant des valeurs numériques, selon lequel les lignes indicatrices sont construites. Les valeurs numériques des éléments de tableau indicateur sont des coordonnées de points, sur lesquelles une ligne d'indicateur est tracée. La coordonnée Y de chaque point est la valeur d'un élément tableau indicateur, X-coordonnée est la valeur d'index de l'élément tableau indicateur. La technologie de stockage de données dans les tableaux d'indicateurs est la base de la construction d'indicateurs techniques et personnalisés. Les valeurs des éléments du tableau indicateur des indicateurs techniques sont disponibles dans tous les programmes d'application, y compris les conseillers experts, les scripts et les indicateurs personnalisés. Pour obtenir la valeur d'un élément tableau indicateur avec un certain index dans un programme d'application, il est nécessaire d'appeler une fonction intégrée dont le nom est défini conformément à un nom d'indicateur technique. Pour l'exécution d'une fonction d'indicateur technique, l'indicateur correspondant ne doit pas nécessairement être attaché à une fenêtre de sécurité. En outre, l'appel de fonction d'indicateur technique à partir d'un programme d'application ne conduit pas à l'attachement d'un indicateur correspondant à une fenêtre de sécurité. L'ajout d'un indicateur technique à une fenêtre de sécurité n'entraîne pas non plus un appel d'indicateur technique dans un programme d'application. Un certain nombre d'indicateurs techniques est inclus dans le terminal client du système de trading en ligne MetaTrader 4. Analysons quelques-uns d'entre eux. Moyenne mobile, MA Indicateur technique Moyenne mobile, MA indique la valeur moyenne du prix de l'instrument pour une certaine période de temps. L'indicateur reflète la tendance générale du marché - peut augmenter, diminuer ou montrer certaines fluctuations près d'un certain prix. Pour obtenir des valeurs de la ligne d'indicateur MA à un certain moment, utilisez la fonction standard: symbole - nom du symbole d'un titre, sur les données dont l'indicateur sera calculé. NULL signifie le symbole courant. Période - période. Peut être une des périodes de graphique. 0 signifie la période du graphique courant. Période - période de moyenne pour les calculs de MA. Mashift - indic shift par rapport à un tableau de prix. Méthode de calcul de la moyenne. Peut être l'une des valeurs des méthodes MA. Prix ​​appliqué - prix usagé. Peut être n'importe laquelle des constantes de prix. Indice de valeur de décalage acquis à partir d 'un tableau indicateur (décalage par rapport à une barre courante par un nombre spécifié de barres). Vous trouverez ci-dessous un exemple d'appel d'une fonction d'indicateur technique à partir de l'expert expert callindicator. mq4: Dans l'appel EA callindicator. mq4, l'appel de fonction iMA () est utilisé (fonction de l'indicateur technique Moyenne mobile). Analysons cette partie du programme en détail: NULL indique que le calcul d'une moyenne mobile est fait pour une fenêtre de sécurité, à laquelle l'EA est attaché (dans ce cas c'est EA, en général, il peut être n'importe quel programme d'application) Calculée pour l'intervalle de temps défini dans la fenêtre de sécurité à laquelle l'EA est attaché PeriodMA - la valeur de la période de moyenne est définie dans une variable externe si après avoir joint EA à une fenêtre de sécurité, un utilisateur ne change pas cette valeur dans les paramètres des variables externes EA , La valeur est égale à 5 0 - le tableau indicateur n'est pas décalé par rapport à un graphique, c'est-à-dire que les valeurs des éléments du tableau indicateur contiennent des valeurs MA calculées pour les barres sur lesquelles est tracée la ligne indicatrice MODESMA - Calculs PRICECLOSE - le prix de clôture de barre est utilisé pour les calculs 0 - Indice d'élément de tableau d'indicateur, pour lequel la valeur est acquise - dans ce cas elle est zéro élément. Compte tenu du fait que la matrice d'indicateur n'est pas décalée par rapport au graphique, la valeur MA est obtenue pour la barre de zéro. La fonction iMA () renvoie une valeur affectée à la variable MA. Dans d'autres lignes de programme, cette valeur est comparée au prix courant de l'offre. Si le prix actuel est supérieur ou inférieur à la valeur MA obtenue, une alerte est affichée. L'utilisation des variables FactUp et FactDn permet de montrer l'alerte seulement après le premier passage de la ligne MA (note, la ligne indicatrice bleue dans une fenêtre de sécurité est dessinée non pas parce que la fonction d'indicateur technique a été appelée depuis le programme, mais parce qu'un utilisateur a joint L'indicateur au diagramme, figure 104). Il convient de noter ici qu'avec l'apparition de nouveaux barres, les indices des barres d'histoire augmentent, la barre en cours d'élaboration a toujours l'indice 0. Dans le Expert Advisor callindicator. mq4, la fonction indicateur technique iMA () renvoie la valeur calculée pour la barre zéro. Bien que la valeur d'indice ne soit jamais modifiée pendant l'exécution EA (c'est-à-dire que les calculs sont toujours effectués sur la barre courante), la valeur renvoyée par iMA () correspondra toujours à la dernière valeur calculée, c'est-à-dire calculée pour la barre zéro courante. Si, pour certains calculs du programme, nous devons obtenir la valeur d'une valeur d'indicateur technique non pas pour la barre courante, bur pour une valeur historique, l'indice de tableau indicateur nécessaire doit être spécifié dans l'appel de fonction. Permet d'afficher un exemple d'EA historybars. mq4. Dans lequel MA est calculée sur la quatrième barre: Dans l'EA, historybars. mq4 les valeurs MA sont calculées pour la barre courante (index 0) et pour la quatrième barre (index 4). Les indices 0 et 4 indiqués ne changent pas pendant cette opération de programme et le programme peut fonctionner infiniment long à chaque fois que l'on calcule des valeurs de MA pour le zéro et le quatrième barres. Rappelez-vous, bien que des calculs soient faits pour MA sur des barres avec les mêmes index, MA sera changé, c'est-à-dire correspondra aux valeurs courantes de MA sur la barre de zéro courante et la quatrième barre courante. Dans la Fig. 106 il est clair que, à mesure que les prix augmentent sur les bars, MA augmente. La différence entre les valeurs MA sur les barres zéro et quatrième augmente également ce qui est reflété dans les alertes affichées. Les indicateurs techniques peuvent refléter non seulement un, mais aussi deux indicateurs ou plus Indicateur technique Stochastic Oscillator compare le prix de clôture actuel avec la fourchette de prix pour une période de temps sélectionnée. L'indicateur est généralement représenté par deux lignes indicatrices. La principale est appelée K. La seconde ligne de signal D est la moyenne mobile de K. Habituellement, K est dessiné sous forme de ligne continue, D - pointillé. Selon l'une des variantes d'explication de l'indicateur, on devrait acheter si K est plus élevé que D et se vendre si K devient inférieur à D. Le moment le plus favorable pour exécuter une opération commerciale est considéré comme le moment de la concurrence des lignes. Le nom du symbole d'un titre, sur les données dont l'indicateur sera calculé. NULL signifie le symbole courant. Période - période. Peut être une des périodes de graphique. 0 signifie la période du graphique courant. Kperiod - période (nombre de barres) pour le calcul de K. Dperiod - période de moyenne de D. valeur de ralentissement. Méthode - méthode de la moyenne. Peut être l'une des valeurs des méthodes MA. Pricefield - paramètre de choix des prix pour les calculs. Peut être l'une des valeurs suivantes: 0 - LowHigh ou 1 - CloseClose. Mode - index des lignes indicatrices. Peut être l'une des valeurs suivantes: MODEMAIN ou MODESIGNAL. Shift - index de la valeur obtenue à partir d 'un tampon indicateur (décalage par rapport à une barre courante par un nombre spécifié de barres). L'utilisation de l'oscillateur stochastique offre la nécessité d'analyser les positions relatives des lignes. Pour calculer la décision commerciale, il faut tenir compte de la valeur de chaque ligne sur les barres actuelle et précédente (voir figure 107). Lorsque les lignes se croisent dans le point A (la ligne verte croise le rouge vers le haut), la commande de vente doit être fermée et l'ordre d'achat doit être ouvert. Pendant la partie A - B (aucune ligne croisée, la ligne verte est plus haute que la ligne rouge) La commande d 'achat doit être maintenue ouverte. Dans le point B (la ligne verte croise le rouge vers le bas) l'achat devrait être fermé et la vente devrait être ouverte. Puis Sell devrait rester ouvert jusqu'à la prochaine traversée (pas de croisement, ligne verte en dessous de la ligne rouge). Figue. 107. Concurrence des lignes principale et de signal de l'oscillateur stochastique. L'exemple suivant contient la mise en œuvre d'un algorithme simple qui montre comment les valeurs nécessaires de chaque ligne peuvent être obtenues et les critères de négociation peuvent être formés. Pour cela, on utilise les valeurs des fonctions techniques d'indicateur iStochastic () dans l'appel EA tohastic. mq4: Pour obtenir la valeur de ligne K (vert plein) sur la barre de zéro, on utilise la ligne de calcul suivante: Ici le paramètre MODEMAIN indique la ligne, la valeur Le dernier paramètre 0 est l'indice de barre, pour lequel la valeur de ligne doit être calculée. Dans les trois lignes de programme suivantes, d'autres variables sont calculées par analogie - pour la ligne D (ligne pointillée rouge, paramètre MODESIGNAL) pour le zéro et la première barre. Dans le bloc suivant, la corrélation des valeurs obtenues est analysée et l'EA rend compte de l'état actuel de chaque tique. Par exemple, dans les lignes: le fait qu'une ligne rouge soit croisée par le vert vers le haut est détecté. Si sur la barre précédente la ligne verte est inférieure à la rouge (c'est-à-dire que l'expression M1 lt S1 est vraie) et sur la barre courante la ligne verte s'élève au-dessus de la rouge ou leurs valeurs sont égales (c'est-à-dire l'expression M0 gt S0 est Vrai), cela signifie que de la formation de bar antérieure à l'instant actuel le vert solitaire a croisé le rouge vers le haut. Ainsi condition calculée dans si l'opérateur est vrai, c'est pourquoi le contrôle est passé à si le corps de l'opérateur, comme résultat Alert () est exécuté pour montrer le message correspondant. Dans un conseiller expert destiné à la négociation dans si le corps de l'opérateur d'une fonction de négociation pour l'ouverture d'une commande d'achat doit être indiqué. Dans ce cas, la variante analysée de croisement des lignes indicatrices conduira à la formation d'un ordre commercial et, enfin, à l'exécution d'une opération commerciale. Pour la variante lorsque la ligne verte traverse le rouge vers le bas, dans le corps si une fonction commerciale pour l'ouverture d'une commande de vente doit être indiqué. Figue. 108 montre le résultat de l'opération callstohastic. mq4. Utilisation des fonctions des indicateurs techniques pour créer Trading Expert Advisors et des scripts est très pratique. Le nombre de fonctions d'indicateur technique utilisées dans un Expert Advisor est illimité. Un concepteur de stratégie de négociation peut décider de définir différents critères de négociation basés sur la combinaison de valeurs d'indicateurs techniques. Exemple d'un conseiller expert trading simple, dont les critères de négociation sont basés sur des indicateurs techniques, est analysé dans la section Simple Expert Advisor. Simple Expert Advisor Problème 29. Créer un conseiller expert en négociation. Arguments préliminaires Avant de commencer à programmer un Expert Expert en négociation, il est nécessaire de définir les principes généraux d'un futur programme. Il n'existe pas de programme strict de création de règles. Cependant, une fois avoir créé un programme, un programmeur continue habituellement à l'améliorer. Pour être en mesure de comprendre le programme à l'avenir, il doit être créé selon un schéma bien pensé et facile à comprendre (il est particulièrement important si un programme sera amélioré par un autre programmeur). Le programme le plus commode est celui qui consiste en blocs fonctionnels, dont chacun est responsable de sa part de calculs. Pour créer un algorithme de trading Expert Advisor, permet d'analyser ce qu'un programme d'exploitation devrait faire. L'une des données les plus importantes dans la formation d'ordres commerciaux est l'information sur les commandes qui existent déjà dans un terminal client. Certaines stratégies de négociation ne permettent qu'un seul ordre unidirectionnel. Généralement, si une stratégie de négociation le permet, plusieurs ordres peuvent être ouverts dans un terminal en même temps, bien que leur nombre soit raisonnablement limité. Lors de l'utilisation de toute stratégie, les décisions commerciales doivent être prises en tenant compte de la situation actuelle. Avant qu'une décision commerciale soit prise dans un programme, il est nécessaire de savoir quels ordres de trading ont déjà été ouverts ou placés. Tout d'abord un programme doit contenir un bloc de commandes comptables qui est parmi les premiers à être exécutés. Lors d'une exécution de l'EE, des décisions commerciales doivent être prises, dont la mise en œuvre conduit à l'exécution d'opérations commerciales. Code partie responsable de la formation des ordres de négociation est mieux écrit dans un bloc séparé. Un conseiller expert peut former une demande commerciale pour ouvrir un nouvel ordre en attente ou sur le marché, fermer ou modifier des commandes existantes ou ne pas effectuer d'actions du tout. Une EA doit également calculer les prix de commande en fonction de la volonté des utilisateurs. Les décisions commerciales doivent être prises dans un programme sur la base de critères commerciaux. Le succès de l'ensemble du programme dépend de la justesse de la détection des critères commerciaux dans le programme. Lors du calcul des critères commerciaux, un programme peut (et doit) prendre en compte toutes les informations qui peuvent être utiles. Par exemple, un conseiller expert peut analyser la combinaison des valeurs des indicateurs techniques, le temps des communiqués de presse importants, l'heure actuelle, les valeurs de certains niveaux de prix, etc. Pour plus de commodité, la partie du programme responsable du calcul des critères de négociation devrait être écrite séparément bloc. Un Expert Expert en négociation doit nécessairement contenir un bloc de traitement d'erreur. L'analyse des erreurs qui peuvent se produire dans l'exécution d'opérations commerciales permet, d'une part, de répéter une demande commerciale et, d'autre part, d'informer un utilisateur d'une éventuelle situation de conflit. Structure d'un Expert Expert Simple Voici un schéma structurel d'un Expert Expert simple construit sur la base de plusieurs blocs fonctionnels, dans chaque bloc une certaine partie détachée des calculs. À l'étape de développement EA suivante, il n'y a pas encore de code de programme. Dans le même temps, l'algorithme d'un programme est en grande partie formé. Comment l'EA construit sur les bases du schéma offert fonctionnera peut être facilement compris simplement en regardant sur le schéma et l'orientation sur les noms de blocs et les tableaux de relations (contrôle de passage) entre eux. Après le début du programme, la commande est passée au bloc de traitement préliminaire. Dans ce bloc, certains paramètres généraux peuvent être analysés. Par exemple, s'il n'y a pas assez de barres dans une fenêtre (barres nécessaires pour calculer les paramètres des indicateurs techniques), une EE ne pourra pas fonctionner correctement. Dans un tel cas, une EA doit mettre fin à l'opération en informant préalablement un utilisateur et en signalant la raison de la résiliation. S'il n'y a pas de contraindicatons de caractère général, le contrôle est passé au bloc comptable de commande. Dans le bloc d'ordres comptables, le nombre et la qualité des ordres existant dans un terminal client pour une sécurité (à la fenêtre dont l'EA est relié) est détecté. Dans ce bloc, les ordres d'autres titres doivent être éliminés. Si une stratégie de négociation programmée nécessite l'utilisation uniquement des ordres du marché (et n'utilise pas les commandes en attente), le fait de la présence d'ordres en attente doit être détecté. Si une stratégie n'admet qu'un seul ordre de marché et qu'il ya effectivement plusieurs ordres, ce fait devrait également être connu. La tâche du bloc de comptabilisation des ordres (dans ce schéma) consiste à déterminer si la situation commerciale actuelle correspond à une situation attendue, à savoir celle dans laquelle l'EE peut fonctionner de manière adéquate. Si la situation correspond, le contrôle doit être passé au bloc suivant pour continuer l'opération de l'EA si non, l'opération EA doit être terminée et ce fait doit être signalé à un utilisateur. S'il n'y a pas d'ordres dans le terminal ou si le nombre et la qualité des ordres existants correspond à ce qui était attendu, le contrôle est passé au bloc de critères de négociation définissant. Dans ce bloc sont calculés tous les critères nécessaires à la prise de décisions commerciales, à savoir les critères d'ouverture, de fermeture et de modification des ordres. Une commande supplémentaire est passée au bloc d'ordres de clôture. Il est facile de comprendre pourquoi dans le schéma offert le bloc de commandes de clôture est exécuté plus tôt que le bloc d'ordres d'ouverture. Il est toujours plus raisonnable de traiter les premières commandes existantes (fermer ou modifier) ​​et seulement après cela pour ouvrir de nouvelles commandes. En général, il est correct d'être guidé par le désir d'avoir aussi peu d'ordres que possible. Lors de l'exécution de ce bloc, toutes les commandes, pour lesquelles le critère de clôture a été activé, doivent être fermées. Une fois que tous les ordres nécessaires ont été fermés, le contrôle est passé à un bloc de calcul de taille des nouveaux ordres. Il ya beaucoup d'algorithmes pour calculer un volume d'ordre. La plus simple d'entre elles utilise une taille de lot constante et fixe. Il est pratique d'utiliser cet algorithme dans un programme pour tester des stratégies. La méthode la plus populaire pour définir une taille d'ordre est de définir le nombre de lots en fonction de la quantité de marge libre, par exemple 30-40 de celle-ci. Si la marge libre n'est pas suffisante, le programme met fin à son fonctionnement après avoir informé l'utilisateur de la raison. Après que le nombre de lots pour l'ouverture de nouvelles commandes est défini, le contrôle est passé au bloc d'ouverture de commande. Si l'un des critères calculés précédemment souligne la nécessité d'ouvrir un ordre d'un certain type, une requête commerciale pour ouvrir une commande est formée dans ce bloc. Il y a aussi un bloc d'analyse d'erreur dans un Expert Advisor. Si une opération échoue, le contrôle (uniquement dans ce cas) est transmis au bloc de traitement d'erreur. Si une erreur retournée par un serveur ou un terminal client n'est pas cruciale, une nouvelle tentative est faite pour effectuer une opération commerciale. Si une erreur cruciale est renvoyée (par exemple, un compte est bloqué), une EA doit terminer son opération. Rappelez-vous, dans MQL4 il n'y a aucune possibilité de programme de terminer une opération EA dans une fenêtre de sécurité (à la différence des scripts, voir Fonctions spéciales). Ce qui peut être fait d'une manière de programme est la fin de start (). Lors d'un nouveau démarrage de la fonction start () sur un nouveau tick, la valeur d'un certain drapeau variable interdisant la négociation (dans ce cas, activée à la suite d'une erreur critique) peut être analysée et le contrôle peut être passé pour la terminaison du Opération de fonction spéciale ainsi la formation d'une nouvelle demande commerciale n'est pas permise. Dans le schéma proposé, la valeur d'indicateur est analysée dans le bloc de traitement préliminaire. Stratégie de négociation Les prix du marché sont en constante évolution. L'état du marché à n'importe quel moment peut être conditionnellement caractérisé soit comme une tendance - forte variation de prix unidirectionnelle (hausse ou baisse), soit comme un mouvement de prix plat-latéral avec des déviations faibles d'une certaine moyenne. Ces caractéristiques du marché sont conditionnelles, car il n'existe pas de critères clairs selon lesquels la tendance ou l'appartement peut être identifié. Par exemple, de longs mouvements latéraux avec des écarts forts qui ne peuvent être tracés ni à un plat ni à une tendance. En général, il est supposé que le marché est principalement dans l'état de mouvement latéral et les tendances ont généralement lieu 15-20 de temps. Toutes les stratégies de négociation peuvent également être classiquement divisé en deux groupes principaux. Le premier groupe contient des stratégies à plat. L'idée principale de ces stratégies est qu'après un écart évident prix doit revenir à la position précédente, thats pourquoi les ordres sont ouverts dans la direction contraire au dernier mouvement des prix. Les stratégies du deuxième groupe sont des stratégies de tendance, lorsque les commandes sont ouvertes dans la même direction que le mouvement du prix du sel. Il existe des stratégies plus compliquées (combinées). De telles stratégies tiennent compte de nombreux facteurs différents qui caractérisent le marché en tant que résultat de négociation peut être exécuté à la fois sur plat et tendance. Il n'est pas difficile de mettre en œuvre le commerce selon telle ou telle stratégie techniquement - MQL4 contient tous les moyens nécessaires pour cela. Le travail principal dans la création d'une stratégie propre fois consiste à la recherche de critères commerciaux. Critères de négociation Dans cet exemple, nous allons essayer de construire une tendance Expert Advisor, c'est-à-dire celui qui ouvrira les ordres dans la direction du mouvement des prix. Ainsi, nous devons trouver parmi les différents indicateurs techniques ceux qui détectent une tendance commençant. L'une des méthodes les plus simples de recherche des critères de négociation est basée sur l'analyse de la combinaison des MA avec des périodes de moyenne différente. Figue. 111 et Fig. 112 montrent la position de deux MA différents (avec des périodes de moyenne 11 et 31) sur différentes parties du marché. Les moyennes avec une petite période moyenne (lignes rouges) sont plus proches d'un tableau de prix, twisty et mobile. Les moyennes mobiles avec une plus grande période de moyenne (ligne bleue) sont plus inertes, affichent un décalage plus important et sont situées plus éloignées des prix du marché. Permet de prêter attention aux endroits où les AM avec des périodes de moyenne différente croiser et essayer de décider, si le fait de MA traversant peut être utilisé comme un critère de lecture. Figue. 111. Traversée de MA (11) et MA (31) lorsque la direction de déplacement de prix change. Dans la Fig. 111 nous voyons une part du marché où les ordres d'ouverture dans le sens du mouvement de prix au passage de MA sont justifiés. Dans le point A la ligne rouge traverse le bleu de bas en haut, après que le prix du marché continue à croître pendant un certain temps. Une inversion supplémentaire de MA crossing indique le changement de direction du mouvement des prix. Si nous ouvrons un ordre Buy au point A et le fermons à B, nous obtiendrons un profit proportionnel à la différence des prix A et B. Figue. 112. Traversée de MA (11) et MA (31) lorsque la direction du mouvement des prix change. Dans le même temps, il y a d'autres moments sur le marché lorsque MA croise, mais cela n'entraîne pas d'autres hausses de prix ou de chutes considérables (figure 112). Les ordres ouverts à la traversée MA à ces moments entraîneront des pertes. Si la vente est ouverte à A et fermée à B, cette transaction entraînera des pertes. La même chose peut être dite sur une commande Buy ouverte à B et fermée à C. Le succès de toute la stratégie mise en œuvre sur la base de la traversée MA dépend du nombre de pièces qui peuvent être caractérisés comme tendance et à plat. Dans le plat souvent MA traversant est un événement régulier qui interfère avec toute stratégie de tendance. De nombreux faux signaux conduisent généralement à des pertes. C'est la raison pour laquelle ce croisement de MA avec des périodes de moyenne différente peut être utilisé pour construire des stratégies de négociation uniquement en combinaison avec d'autres signes indiquant une tendance. In this example (for constructing a simple Expert Advisor) we will have to refuse using this sign. We will use another sign. Analyzing visually the character of price changes in the market, we can see that a long one-direction price rise or fall often appears as a result of a short strong movement. In other words, if within a short period a strong movement happened, we may expect its continuation in a medium-term period. Figue. 113 shows the market period when a strong movement resulted in the continuation of the price change in the same direction. As the quota strong movementquot we may use the difference of MAs with different averaging periods. The stronger the movement, the larger is the lag of MA with larger averaging period from MA with a small period of averaging. Moreover, even strong discontinuous price movements with further return do not result in a large difference between MAs, i. e. numerous false signals do not appear. For example, price jump by 50 points with further return (in the center in Fig. 113) entailed increase of difference between MAs only by 20 points. At the same time a really strong movement (which is not usually accompanied by a considerable correction) in point A resulted in the difference increase up to 25 - 30 points. If Buy order is opened when a certain value of difference between MAs is reached, for example in A, most probably the order will be profitable when a price reaches a preset Stop order value. Lets use this value as a trading criterion in our Expert Advisor. Number of Orders In this example we analyze an Expert Advisor that admits presence of only one market order, pending orders are not provided. Such an approach is justified not only in this certain example, but can be used as the basis for any strategy. Pending orders are usually used when a developer has quite a reliable criterion for forecasting the future price change with high probability. If there is no such criterion, no need to use pending orders. The situation when several opposite orders for one security are open also cannot be considered reasonable. It was written earlier that from economical point of view opposite orders are considered to be senseless, especially if the order prices are equal (see Closing and Deleting Orders ). In such a case we should close one order by another one and wait for a signal to open one market order in a certain direction. Relation of Trading Criteria From this position it becomes clear what relations are possible between trading criteria. Figue. 114 shows three variants of correlation of trading criteria, when each criterion is important (valid). Actions (opening and closing market orders) take place clockwise on the following pictures. Figue. 114. Order opening and closing criteria correlation (a and b - correct, c - incorrect). The most popular variant of a correctly formed trading criteria is the variant a . After being opened a market order Buy is held upon till the moment when criterion requiring its closing triggers. After that a pause occurs when no orders are opened. Further a market order Sell can be opened. Conditions for closing a Sell order (in accordance with correctly formed criteria) occur earlier, than conditions for opening a Buy order. However, a Buy order can be opened once again, if a trading criterion requires this. But according to this variant a market order cannot be opened if there is an open market order in the contrary direction. Similar criteria correlation is in the variant b . The difference is that a criterion for opening any market order is at the same time a criterion for closing the opposite order. This variant like the variant a does not allow several orders opened in the terminal at the same time on one security. The variant of criteria correlation is incorrect. According to this variant opening of a market order is allowed when contrary orders are not closed yet, which is senseless. There can be rare cases when this variant is partially justified. Opening of an opposite order is sometimes acceptable for compensating losses occurring at small corrections after strong price movements. In such cases an opposite order can be opened of the same or smaller value than the already existing one and then closed when the correction is over. Such a tactic allows not to interfere with the quotmainquot order opened in the trend direction. In general case several one-direction orders are also possible. This may be justified when an earlier opened order is protected by a Stop order and the criterion pointing at the price development in the same direction triggered once again. However, when creating such a strategy, a developer must be fully aware that in case of a sharp price movement change the placed stop orders may be unexecuted by some brokers at the first price touch. And the loss will be proportionate to the total value of one-directional market orders. In our example we use variant b of trading criteria correlation. All opened market orders are closed either by a stop order or after a criterion of opening an order in opposite direction triggers (here criterion of closing Buy coincides with that of opening Sell and vice versa). Size of Opened Orders In any trading strategy order sizes should be reasonably limited. In a simple case a fixed order size is used in an Expert Advisor. Before EA operation start, a user can set any size of future orders and leave it unchanged for some time. Further if balance changes, a user can set up a new value of lot numbers of opened orders. A too small order size provides more confidence in operation at the unpredictable market change, but the profit in case of success will be not so large. If the order size is too large, large profit can be acquired, but such an EA will be too risky. Usually the size of opened orders is set up so, that margin requirements do not exceed 2-35 percent of the balance or free margin (if a strategy allows only one opened order, balance and free margin at the moment before the order opening will be equal). In this example both variants are implemented. A user may choose either to indicate directly values of orders or set the value in percentage from the free margin. Programming Details A simple trend Expert Advisor tradingexpert. mq4 constructed on the basis of previous arguments can look like this: Describing Variables One more criterion in program estimation is its readability. A program is considered to be correctly written, if it can be easily read by other programmers, thats why all main program parts and main moments characterizing the strategy must be commented. This is also why it is recommended to declare and comment all variables at the beginning of the program. In the block 1-2 external and global variables are described. According to rules, external and global variables must be opened before their first usage (see Types of Variables ), thats why they are declared in the program head part. All local variables of the function start() are gathered and described in the upper function part (block 2-3) immediately after the function header. Rules of declaring local variables do not require it, but also do not prohibit. If a programmer faces difficulties in understanding the meaning of a variable when reading the program, he can refer to the upper program part and find out the meaning and type of any variable. It is very convenient in programming practice. Block of preliminary processing In this example the preprocessing consists of two parts (block 3-4). The program terminates operation if there are not enough bars in a security window in such a case it is impossible to detect correctly (in block 5-6) values of moving averages necessary for calculating criteria. Besides here the value of the variable Work is analyzed. In the normal EA operation the variable value is always true (it is set once during initialization). If a critical error occurs in the program operation, false is assigned to this variable and start() finishes its operation. This value will not change in future, that is why the following code is not executed. In such a case the program operation must be stopped and the reason for the critical error must be detected (if needed, a dealing center must be contacted). After the situation is solved, the program can be started once again, i. e. the EA can be attached to a security window. Accounting orders The described Expert Advisor allows working only with one market order. The task of the orders accounting block (block 4-5) is to define characteristics of an opened order, if there is one. In the loop going through orders for all existing market and pending orders are checked, namely from the first (int i1) to the last one (iampltOrdersTotal()). In each cycle iteration the next order is selected by the function OrderSelect(). The selection is made from a source of opened and pending orders (SELECTBYPOS). If the selection is executed successfully (i. e. there is one more order in the terminal), further this order and the situation must be analyzed: whether the order is opened for the security, at which the EA operates, whether the order is market or pending it also must be taken into account when counting orders. In the line: all orders opened for another security are eliminated. Operator continue stops the iteration and characteristics of such an order are not processed. But if the order is opened for the security, to the window of which the EA is attached, it is further analyzed. If OrderType() returns value more than 1 (see Types of Trades ), the selected order is a pending one. But in this Expert Advisor managing pending orders is not provided. It means the execution of start() must be terminated, because a conflict situation occurred. In such a case after a message about the operation termination start() execution is stopped by the operator return. If the last check showed that the analyzed order is a market order, the total number of orders for a security is calculated and analyzed. For the first of such orders all necessary characteristics are defined. If in the next iteration the order counter (variable Total) finds the second market order, the situation is also considered to be conflict, because the EA cannot manage more than one market order. In such a case start() execution is stopped after showing a corresponding message. As a result of the order accounting block execution (if all checks were successful) the variable Total preserves its zero value if there are no market orders, or gets the value 1 if there is a market order for our security. In the latter case some variables set in correspondence with the order characteristics (number, type, opening price, stop levels and order value) also get their values. Calculating Trading Criteria In the analyzed example definition of trading criteria (block 5-6) is calculated on the bases of difference between Moving Averages with different periods of averaging. According to accepted criteria a chart is bull-directed if the current value of the MA with smaller period is larger than the value of MA with larger period, and the difference between the values is larger than a certain value. In a bear movement MA with smaller period is lower than MA with larger period and the difference is also larger than a certain critical value. At the block beginning values of MAs with averaging periods PeriodMA1 and PeriodMA2 are calculated. The fact of significance of any trading criterion is expressed via the value of a corresponding variable. Variables OpnB and OpnS denote the criterion triggering for opening Buy and Sell orders, variables Cls and ClsS - for closing. For example, if a criterion for opening Buy has not triggered, the value of OpnB remains false (set at the variable initialization) if it has triggered, OpnB gets the value true. In this case the criterion for closing Sell coincides with that for opening Buy, criterion for opening Sell coincides with that for closing Buy. Trading criteria accepted in this example are used for educational purpose only and must not be considered as a guideline when trading on a real account. Closing Orders It was written earlier that this Expert Advisor is intended for operation only with one market order opened for a security, to which window the EA is attached. To the moment when control in the program is passed to the order closing block it is known for sure that at the current moment there are either no orders for the security, or there is only one market order. Thats why the code in orders closing block is written so that only one order can be closed successfully. This block is based on the infinite loop while, the body of which consists of two analogous parts: one for closing a Buy order, another for closing a Sell order. While is used here for the purpose that in case of a trade operation failure it could be repeated once again. In the header of the first operator if condition for closing a Buy order is calculated (Sell orders are closed in the analogous way). If the type of an earlier opened order corresponds to Buy (see Types of Trades ) and the sign for closing Buy is relevant, control is passed to the body of if operator where a request to close is formed. As an order closing price in the function OrderClose() the value of a two-sided quote corresponding to the order type is indicated (see Requirements and Limitations in Making Trades ). If a trade operation is executed successfully, after a message about the order closing is shown the current while iteration is stopped and the execution of the order closing block is over. But if the operation fails, the user-defined function for processing errors FunError() is called (block 10-11). Processing Errors As a passed parameter in FunError() the last error code calculated by GetLastError() is used. Depending on the error code FunError() returns 1 if the error is not critical and the operation can be repeated, and 0 if the error is critical. Critical errors are divided into two types - those, after which a program execution can be continued (for example, a common error) and those, after which execution of any trade operations must be stopped (for example, blocked account). if after an unsuccessful trade operation the user-defined function returns 1, the current while iteration is terminated and during the next iteration another attempt is made to execute the operation - to close the order. If the function returns 0, the current start() execution is stopped. On the next tick start() will be started by the client terminal again and if conditions for order closing are preserved, another attempt to close the order will be made. If during error processing it is found out that further program execution is senseless (for example the program operates on an old client terminal version) during the next start the execution of the special function start() will be terminated in the block of preliminary processing when analyzing the value of the variable Work. Calculating Amount of Lots for New Orders Amount of lots can be calculated in accordance with a users settings following one of the two variants. The first variant is a certain constant value set up by a user. According to the second variant the amount of lots is calculated on the basis of a sum equal to a certain percentage (set by a user) of a free margin. At the beginning of the block of defining the amount of lots for new orders (block 7-8) necessary values of some variables are calculated - minimal allowed amount of lots and step of lot change set up by a broker, free margin and price of one lot for the security. In this example the following is provided. If a user has set up a certain non-zero value of the external variable Lts, for example 0.5, it is accepted as the amount of lots Lts when a trade request to open an order is formed. If 0 is assigned to Lts, the number of lots Lts is defined on the basis of the variable Prots (percentage), free margin and conditions set up by a broker. After Lts is calculated, a check is conducted. If this value is lower than the minimal allowed value, the minimal allowed value is accepted. but if free margin is not enough, after a corresponding message the start() execution is terminated. Opening Orders The block of opening orders (block 8-9) like the bloke of opening orders is an infinite loop while. In the header of the first operator if conditions for opening a Buy order are calculated: if there are no orders for the security (variable Total is equal to 0) and the sign for opening a Buy order is relevant (OpnB is true ), control is passed to if operator body for opening an order. In such a case after rates are refreshed prices for stop levels are calculated. Values of stop levels are initially set by a user in external variables StopLoss and TakeProfit. In a general case a user can set values for this parameters smaller that a broker allows. Besides a broker may change the minimal allowed distance at any moment (it is an often case at strong market movements, for example, before important news release). Thats why before each order opening stop levels must be calculate taking into account values set bu a user and the minimal allowed value set up by a broker. For calculating stop levels the user-defined function NewStop() is used as a passed parameter the stop level value set by a user is used. In NewStop() first the current minimal allowed distance is calculated. If the value set by a user corresponds to a brokers requirements, this value is returned. If it is smaller than the allowed value, the value allowed by a broker is used. Prices of stop requests are calculated from the corresponding two-sided quote (see Requirements and Limitations in Making Trades ). A trade request to open an order is formed using the function OrderSend(). For the calculation of order opening price and prices of stop requests the two-sided quote values corresponding to the order type are used. If a trade operation was successful (i. e. a server returned the number of an opened order) after a message about a successful order opening is shown. start() execution is finished. If an order was not opened and the client terminal returned an error, the error is processed according to the algorithm described earlier. Some Code Peculiarities The analyzed Expert Advisor code is oriented to the implementation of a certain strategy. Note, some program lines contain variables and calculations that would be changed, if the strategy were changed. For example, according to the accepted strategy the Expert Advisor is developed to work only with one order. This allowed to use the variable Ticket both for the identification of a closing order number (in block of closing 6-7) and for the identification of a success of a trade operation execution when opening an order (in the block of opening 8-9). In this case such a solution is acceptable. However, if we take the analyzed code as the basis for the implementation of another strategy (for example allow opposite orders) we will have to introduce one or several variables to be able to recognize numbers of opened orders and identify the success of trade operations. In further strategy modifications we will have to change come program lines containing part of logics contained in the source strategy. Namely in the order accounting block we will not have to terminate the program operation if there are several open orders for a security. Besides, conditions for opening and closing orders will alslo change. This will entail the code changing in blocks of opening and closing orders. On the basis of this analysis we can easily conclude that the described simple Expert Advisor is not perfect. In a general case, for the implementation of order accounting one should use a universal function based on using data arrays and not containing logics of a certain strategy. The same can be said about the blocks of opening and closing orders. A more complete program must contain a main analytical function, all other user-defined functions must be subordinate to it. This analytical function must contain a program code, in which all conditions for the implementation of any strategy are analyzed all subordinate functions must perform limited actions. The function of accounting orders must only account orders, functions of opening and closing orders must only open and close orders, and the analytical function must quotthinkquot and manage all other functions, i. e. call them when needed.


No comments:

Post a Comment