Mise à jour EA, Backtesting, erreurs courantes et quelques code de travail Inscrit en juil. 2008 Statut: Member 62 Messages Ce sujet pourrait être d'intérêt pour ceux d'entre vous qui veulent commencer ou ont déjà commencé à développer leur propre Custom Expert Advisor. Ce n'est pas un tutoriel quotMetaTrader 4 MQL Expert Tutorialquot ou quelque chose comme ça, mais pourrait être utile pour les débutants, empêche de faire quelques erreurs et fournir un code de travail pour certaines des fonctions les plus courantes. Il ya quelques mois, j'ai écrit ma première EA très simple à des fins d'apprentissage et je l'ai posté dans ce fil. J'ai essayé de le garder aussi simple que possible et ai fourni de nombreux commentaires pour faciliter aux débutants de suivre la stratégie de mon EA et comment je l'ai implémenté. Au cours des dernières semaines, j'ai beaucoup lu sur l'analyse des graphiques, l'analyse des intermarques et la prévision des prix avec les réseaux de neurones. En plus de cela, j'ai développé quelques bibliothèques qui contiennent souvent des fonctionnalités nécessaires comme moneymanagement, ordermanagement, la gestion des erreurs et l'enregistrement des erreurs. Et j'ai aussi appris beaucoup sur backtesting, la validation et les problèmes d'ajustement de courbe. Erreur de backtesting commune J'ai fait au début Et thats déjà le point qui wasnt vraiment intelligent avec ma dernière approche: J'ai optimisé l'EA pour une période donnée et puis backtested l'EA pour la même période. Ne faites pas cela et si vous faites - ne prenez pas ces résultats et croyez que vous avez trouvé l'ultime Saint-Grail-EA Nous voulons développer une EA qui ne crée pas seulement de belles courbes d'équité pour notre période optimisée, Mais aussi pour l'avenir. Image nous voulons écrire une EA qui utilise le graphique journalier comme période et nous avons les données de séries temporelles suivantes disponibles: Nous faisons maintenant le backtesting et l'optimisation de l'EA. Cela signifie que nous déterminons les moyennes mobiles, le risque, la taille de l'arrêt de fuite (ou les variables que nous utilisons dans notre évaluation environnementale) qui se traduisent par le bilan le plus élevé (baisse plus faible, rendement attendu). Si nous faisons cela pour toute la période de 2003 à 2008, nous pouvons obtenir une très belle courbe, mais nous n'avons aucune idée de la façon dont l'évaluation environnementale serait réalisable en 2009. Une solution possible serait de diviser les données de séries chronologiques en deux parties: Une pour l'optimisation et une partie pour validationtesting: Maintenant, nous aurions une optimisation pour 2003-2005 et utiliser ces valeurs pour les tests en 2006. Si nous obtenons encore de bons résultats, notre EA aurait été un succès à l'avenir, même si nous l'avons testé pour le passé. Parce que l'évaluation environnementale n'a pas été optimisée pour l'année 2006. Nous pouvons répéter cela pour les prochaines années et essayer de trouver ces paramètres, qui a produit de bons résultats pour la plupart ou la plupart des périodes. Je ne sais pas quelle période vous devriez choisir pour l'optimisation et qui pour les tests. Il s'agit d'un essai et d'une erreur et dépend aussi du délai que vous choisissez de laisser fonctionner votre EA. Obtenir une meilleure qualité de modélisation Plus vous disposez de données, mieux (signifie plus exactement) les résultats de backtesting. Voici un moyen d'améliorer la qualité de la modélisation: Dans le menu d'options de MetaTrader 4 (appuyez sur CtrlO), sélectionnez l'onglet quotChartsquot et définissez cette valeur pour quotMax bars dans historyquot et quotMax bars dans chartquot: 2147483647 - cliquez sur ok. Ensuite, ouvrez le centre d'historique dans MT4 (appuyez sur F2), sélectionnez la paire de devises dans la liste des symboles sur la gauche et sélectionnez l'intervalle de temps le plus bas, 1 minute (double-cliquez dessus). Appuyez sur quotDownloadquot et répondez quotOKquot lorsque vous recevez l'avertissement. Cela peut prendre quelques minutes jusqu'à ce que toutes les valeurs historiques aient été téléchargées. J'ai 3,5 Mio 1-Minute bougies, thats les 10 dernières années en minutes Doit être suffisant. Vous pouvez le faire avec chaque période et devise, ou utiliser le script inclus quotperiodconverterquot, qui est livré avec MT4. Ensuite, je vais vous fournir quelques bibliothèques que j'ai écrit et qui m'aident à ne pas réécrire chaque petit peu que j'ai souvent besoin. Je sauvegarde tous les ordres ouverts dans un tableau (seulement les ordres que l'EA a ouverts de cource) de sorte que je puisse voir combien d'ordres sont ouverts au total. Et j'ai écrit une petite fonction qui simplifie l'ouverture d'une position. Définissez MAGICNUMBER 29031985 Maximum de slipage autorisé pour l'exécution d'un ordre définissez SLIPAGE 5 Enregistrez tous les ordres ouverts dans ce tableau int Billet 9193 Comptez les positions ouvertes pour une devise donnée et enregistrez nos ordres dans le tableau de tickets. Nous ne pouvons pas simplement retourner ArraySize (Ticket), car certains ordres ont déjà pu être arrêtés. Int countOpenOrders () return (updateOrderManager ()) Ouvre une nouvelle position et renvoie la paire de devises paires de paramètres, utilisez la commande EURUSD ou Symbol () param VENDRE ou VENDRE - ne pas utiliser OPBUY ou OPSELL param taille de lot dans le lot param stoploss Acheter commande envoyer si (commande acheter commande acheter) retour (OrderSend (paire) OPBUY. Lot. Demandez, SLIPAGE. () () () () () () () () () () () () () () () (2) ) Met à jour toutes les informations sur les commandes actuellement ouvertes. Surtout regarde à travers tous les ordres s'ils sont encore actifs ou peut-être ont été arrêtés par des pertes d'arrêt et enregistre leur numéro de billet dans le tableau de billet. Int updateOrderManager () int count 0 Redimensionner le tableau des tickets à zéro ArrayResize (Ticket. 0) Passer toutes les commandes pour (int i 0 i lt OrdersTotal () i) Vous êtes intéressé uniquement par les transactions qui sont dans le pool de trading (OrderMagicNumber () MAGICNUMBER)) Redimensionnement du tableau des tickets et enregistrement du ticket ArrayResize (Compte 1 du ticket) Compte du ticket 91 93 OrderTicket () Retourne les positions ouvertes return (count) Ticket - enregistre tous les numéros de ticket des EAs commandes ouvertes actuelles updateOrderManager () - doit être appelé chaque tick ou avant de vouloir utiliser Ticket, car il aurait pu être qu'une commande a été Closedtopped. Cette fonction permet de mettre à jour le tableau de tickets countOpenOrders () - compte le nombre d'ordres ouverts, simplement un sous-produit de la fonction précédemment mentionnée newMarketOrder (paire de chaînes, commande de chaîne, double lot, double stoploss, double takeprofit) - facilite l'ouverture Un nouvel ordre. La paire peut être quotEURUSDquot par exemple ou utiliser Symbol () pour utiliser le symbole courant du graphique joint. Command est soit quotBUYquot ou quotSELLquot, lot, stoploss et takeprofit sont explicites. Le slipage est défini au début du code, seules les commandes sur le marché sont possibles. Mais ce n'est pas un problème pour écrire une fonction newPendingOrder. Il s'agit d'une bibliothèque très simple qui peut être utilisé pour calculer la marge libre actuelle et utilisée, l'équité, l'équilibre et le profit. Plus important est la fonction pour calculer la taille de lot optimale pour un risque donné et arrêter la perte. Variables externes extern double Risque 0,02 double solde 0,00 double capital 0,00 double margeFree 0,00 double margeUtilisé 0,00 double margeUtiliséPercent 0,00 double margeUtilisablePercent 0,00 double profitLossPercentage 0,00 Calculer la taille optimale du lot Si sl a été défini, calculer la taille du lot en fonction de la perte d'arrêt, sinon utiliser le risque de marge En tant que taille de lot Paramètre: sl, Stop Perte en valeur-point (par exemple 0,0050 50 pips) double lotOptimisé (double stoploss) double lot Définir le risque dans les limites correctes si (risque lt 0,001) Risque 0,001 si (risque gt 0,50) Risque 0,50 double effet de levier Calculer la marge utilisée en fonction du risque si la perte d'arrêt est trop petite si ((Stoploss lt MarketInfo (Symbole () (MODESTOPLEVEL)) ampamp (stoploss gt 0)) lots Calculer le lot, de sorte que seul le risque d'équité peut être perdu autrement Traduire le stoploss aux valeurs de pip si stoploss le négatif, le rendent positif si (stoploss lt 0) stoploss - Stoploss MarketInfo (Symbol () Calculer la valeur d'un pip par lot double PipValuePerLot MarketInfo (Symbole (), MODELOTSIZE) MarketInfo (Symbol (), MODEPOINT) Calculer la valeur nécessaire par pip à risque () Montant correct du capital en fonction de la taille du sl double NeededPipValue AccountEquity () Risk stoploss Calculez les lots de lot de lot optimaux NeededPipValue PipValuePerLot Vérifiez si la taille du lot est dans les limites correctes if (lot lt MarketInfo (Symbol () MODEMINLOT) (MODEMXLOT)) lots MarketInfo (Symbol (), MODEMAXLOT) Recalcule la valeur courante, la marge utilisée et les autres valeurs double updateMoneyManager () balance AccountBalance () equity AccountEquity () marginFree AccountFreeMargin () ) MarginUsed equity - marginFree marginUsedPercent marginUsed capital 100 marginUsablePercent marginFree equity 100 profitLossPercentage AccountProfit () balance 100 updateMoneyManager () - recalcule la marge actuelle libre et utilisée, enregistre l'équité, l'équilibre et le profit dans les variables. LotsOptimized (double stoploss) - calcule la taille de lot optimale pour un ordre sous le risque donné et stop loss. Le risque est défini au début du dossier: 0,02 signifie: ne risque pas plus de 2 du montant total des capitaux propres. Risque de compte 10.000 Risque 0.02 2 Perte de stop à EURUSD est fixé à 0.0100 100 Pips Nous ne risquons 2 de 10.000 200 Pip valeur par lot: 100.000 x 0.0001 10 Stop loss 100 Pips, nous voulons une valeur pip par lot de 200 100 2 Cela signifie une taille de lot de 2 10 0.2 Si nous sommes arrêtés maintenant avec une perte de 100 pip, nous perdons seulement 200 ou 2. Simple. Si aucune perte d'arrêt n'est donnée, la taille de la position sera calculée en fonction du montant des capitaux propres, du risque et de l'effet de levier. Ce n'est pas une bibliothèque de gestion de l'argent. Ce n'est qu'une base qui peut et doit être élargie. Quelques idées: Définir une limite du capital investi maximum en pourcentage, comme 2 par position ET pas plus que (par exemple) 10 - 20 investi tous ensemble Sauver la balance, l'équité et la courbe de profit dans un tableau. Utilisez ensuite ces données pour voir si les derniers métiers ont été rentables ou non. Peut être utilisé pour le mode quotpanique ou pour réduire le risque lorsque les derniers métiers ont produit des pertes Si vous avez une EA multi-devises, il pourrait être utile de définir également combien vous voulez investir non seulement par position et au total, mais aussi comment Beaucoup par marché. Comme: 2 risques par commande, 10 par marché et 20 au total. Il s'agit d'une bibliothèque de consignation très simple, utile pour créer des journaux qui peuvent être écrits sur le terminal MT4 et enregistrés sur un fichier. string extern logFile log. txt extern bool loggingActive false extern bool logToFile false Définissez la position du chemin et le fichier param du fichier journal nom de notre fichier journal setLogFile void (fichier string) fichier logFile Permet la connexion à déposer sur diskspace enableFileLogging void () logToFile true Désactive la connexion à déposer sur diskspace disableFileLogging void () LogToFile faux Imprime le journal à la revue et enregistre le journal pour déposer est sélectionné vide PRINTLOG (journal de chaîne) Seulement imprimer ou sauvegarder les journaux, si loging est activée si (loggingActive) Si la connexion à déposer est sélectionné, enregistrez vous connecter chaîne à disque si (logToFile) int gérer FileOpen (logFile FILEBIN FILEREAD FILEWRITE..) si (poignée lt 1) Imprimer (LOGGING: fichier d'ouverture d'erreur).. retour (0) FileWriteString (poignée log StringLen (log )) FileClose (handle) Imprimez la chaîne de journal au journal Print (log) Je pense que ces fonctions devraient être toutes explicites. Vous pouvez activer ou désactiver la fonctionnalité de journalisation et activer ou désactiver séparément la journalisation dans un fichier. Les messages de journal ne seront écrits qu'au Terminal et non au disque. PRINTLOG (journal des string) - Imprime la chaîne au journal lors de la connexion est activée et également le fichier si la connexion au fichier est activé, je sais theres le stderror. mqh venir avec metratrader, mais je l'ai écrit ma propre version. Thats parce que je peux inclure mes propres codes d'erreur un messages très simplement. Mais pour l'instant, seules les erreurs d'exécution MQL et les erreurs de serveur sont implémentées. ---- erreurs renvoyées par le serveur de commerce définissent ERRNOERROR 0 définir ERRNORESULT 1 définir ERRCOMMONERROR 2 définissent ERRINVALIDTRADEPARAMETERS 3 définissent ERRSERVERBUSY 4 définissent ERROLDVERSION 5 définissent ERRNOCONNECTION 6 définissent ERRNOTENOUGHRIGHTS 7 définissent ERRTOOFREQUENTREQUESTS 8 définissent ERRMALFUNCTIONALTRADE 9 définissent ERRACCOUNTDISABLED 64 définissent ERRINVALIDACCOUNT 65 définir ERRTRADETIMEOUT 128 définir ERRINVALIDPRICE 129 définissent ERRINVALIDSTOPS 130 définissent ERRINVALIDTRADEVOLUME 131 définissent ERRMARKETCLOSED 132 définissent ERRTRADEDISABLED 133 définissent ERRNOTENOUGHMONEY 134 définissent ERRPRICECHANGED 135 définissent ERROFFQUOTES 136 définissent ERRBROKERBUSY 137 définissent ERRREQUOTE 138 définissent ERRORDERLOCKED 139 définissent ERRLONGPOSITIONSONLYALLOWED 140 définissent ERRTOOMANYREQUESTS 141 définissent ERRTRADEMODIFYDENIED 145 définissent ERRTRADECONTEXTBUSY 146 définissent ERRTRADEEXPIRATIONDENIED 147 définissent ERRTRADETOOMANYORDERS 148 - --- erreurs de temps MQL4 d'exécution définissent ERRNOMQLERROR 4000 définir ERRWRONGFUNCTIONPOINTER 4001 définir ERRARRAYINDEXOUTOFRANGE 4002 définir ERRNOMEMORYFORCALLSTACK 4003 définir ERRRECURSIVESTACKOVERFLOW 4004 définir ERRNOTENOUGHSTACKFORPARAM 4005 définir ERRNOMEMORYFORPARAMSTRING 4006 définir ERRNOMEMORYFORTEMPSTRING 4007 définir ERRNOTINITIALIZEDSTRING 4008 définir ERRNOTINITIALIZEDARRAYSTRING 4009 définir ERRNOMEMORYFORARRAYSTRING 4010 définir ERRTOOLONGSTRING 4011 définir ERRREMAINDERFROMZERODIVIDE 4012 définir ERRZERODIVIDE 4013 définir ERRUNKNOWNCOMMAND 4014 définir ERRWRONGJUMP 4015 définir ERRNOTINITIALIZEDARRAY 4016 définir ERRDLLCALLSNOTALLOWED 4017 définir ERRCANNOTLOADLIBRARY 4018 définir ERRCANNOTCALLFUNCTION 4019 définir ERREXTERNALCALLSNOTALLOWED 4020 définir ERRNOMEMORYFORRETURNEDSTR 4021 définir ERRSYSTEMBUSY 4022 définir ERRINVALIDFUNCTIONPARAMSCNT 4050 définir ERRINVALIDFUNCTIONPARAMVALUE 4051 définir ERRSTRINGFUNCTIONINTERNAL 4052 définir ERRSOMEARRAYERROR 4053 définir ERRINCORRECTSERIESARRAYUSING 4054 définir ERRCUSTOMINDICATORERROR 4055 définir ERRINCOMPATIBLEARRAYS 4056 définir ERRGLOBALVARIABLESPROCESSING 4057 définir ERRGLOBALVARIABLENOTFOUND 4058 définir ERRFUNCNOTALLOWEDINTESTING 4059 définir ERRFUNCTIONNOTCONFIRMED 4060 définir ERRSENDMAILERROR 4061 définir ERRSTRINGPARAMETEREXPECTED 4062 définir ERRINTEGERPARAMETEREXPECTED 4063 définir ERRDOUBLEPARAMETEREXPECTED 4064 définir ERRARRAYASPARAMETEREXPECTED 4065 définir ERRHISTORYWILLUPDATED 4066 définir ERRTRADEERROR 4067 définir ERRENDOFFILE 4099 définir ERRSOMEFILEERROR 4100 définir ERRWRONGFILENAME 4101 définir ERRTOOMANYOPENEDFILES 4102 définir ERRCANNOTOPENFILE 4103 définir ERRINCOMPATIBLEFILEACCESS 4104 définir ERRNOORDERSELECTED 4105 définir ERRUNKNOWNSYMBOL 4106 définir ERRINVALIDPRICEPARAM 4107 définir ERRINVALIDTICKET 4108 définir ERRTRADENOTALLOWED 4109 définir ERRLONGSNOTALLOWED 4110 définir ERRSHORTSNOTALLOWED 4111 définissent ERROBJECTALREADYEXISTS 4200 définir ERRUNKNOWNOBJECTPROPERTY 4201 définir ERROBJECTDOESNOTEXIST 4202 définir ERRUNKNOWNOBJECTTYPE 4203 définir ERRNOOBJECTNAME 4204 définir ERROBJECTCOORDINATESERROR 4205 définir ERRNOSPECIFIEDSUBWINDOW 4206 définir ERRSOMEOBJECTERROR 4207 chaîne ErrorDescription (code int) commutateur (Code) cas ERRNOERROR. Imprimer (Pas d'erreur renvoyée) break case ERRNORESULT. Imprimer (Aucune erreur retournée, mais le résultat est inconnu) break case ERRCOMMONERROR. Imprimer (Erreur commune) break case ERRINVALIDTRADEPARAMETERS. Imprimer (Paramètres commerciaux non valides) break case ERRSERVERBUSY. Imprimer (serveur de commerce est occupé) cas de rupture ERROLDVERSION. Imprimer (Ancienne version du terminal client) break case ERRNOCONNECTION. Imprimer (Pas de connexion avec le serveur commercial) break case ERRNOTENOUGHRIGHTS. Imprimer (Pas assez de droits) break case ERRTOOFREQUENTREQUESTS. Print (Demandes trop fréquentes) break case ERRMALFUNCTIONALTRADE. Imprimer (Malfunctional trade operation) cas de rupture ERRACCOUNTDISABLED. Imprimer (Compte désactivé) break case ERRINVALIDACCOUNT. Imprimer (compte non valide) break case ERRTRADETIMEOUT. Impression (délai d 'expiration du contrat) ERRINVALIDPRICE. Imprimer (Invalid price) cas de rupture ERRINVALIDSTOPS. Imprimer (arrêts non valides) break case ERRINVALIDTRADEVOLUME. Imprimer (volume de commerce non valide) break case ERRMARKETCLOSED. Imprimer (Le marché est fermé) break case ERRTRADEDISABLED. Imprimer (Le commerce est désactivé) break case ERRNOTENOUGHMONEY. Imprimer (Pas assez d'argent) break case ERRPRICECHANGED. Imprimer (Prix modifié) break case ERROFFQUOTES. Imprimer (Off quotes) cas de rupture ERRBROKERBUSY. Imprimer (le courtier est occupé) cas de rupture ERRREQUOTE. Imprimer (Requête) break case ERRORDERLOCKED. Imprimer (L'ordre est verrouillé) break case ERRLONGPOSITIONSONLYALLOWED. Impression (positions longues autorisées seulement) cas de rupture ERRTOOMANYREQUESTS. Imprimer (Demandes trop nombreuses) break case ERRTRADEMODIFYDENIED. Imprimer (Modification refusée parce que l'ordre est trop proche du marché) break case ERRTRADECONTEXTBUSY. Print (Le contexte commercial est occupé) break case ERRTRADEEXPIRATIONDENIED. Print (Expirations sont refusées par le courtier) break case ERRTRADETOOMANYORDERS. Imprimer (Le montant des commandes ouvertes et en attente a atteint la limite fixée par le courtier.) Break case ERRNOMQLERROR. Imprimer (Pas d'erreur) break case ERRWRONGFUNCTIONPOINTER. Imprimer (pointeur de fonction erroné) break case ERRARRAYINDEXOUTOFRANGE. Imprimer (l'index du tableau est hors de portée) break case ERRNOMEMORYFORCALLSTACK. Imprimer (Pas de mémoire pour la pile des appels de fonction) break case ERRRECURSIVESTACKOVERFLOW. Impression (Décompte récursif de pile) cas de rupture ERRNOTENOUGHSTACKFORPARAM. Print (Pas assez de pile pour le paramètre) break case ERRNOMEMORYFORPARAMSTRING. Imprimer (Pas de mémoire pour la chaîne de paramètres) break case ERRNOMEMORYFORTEMPSTRING. Imprimer (Pas de mémoire pour la chaîne temporaire) break case ERRNOTINITIALIZEDSTRING. Cas d'arrêt d'impression (chaîne non initialisée) ERRNOTINITIALIZEDARRAYSTRING. Print (chaîne non initialisée dans le tableau) break case ERRNOMEMORYFORARRAYSTRING. Imprimer (Aucune mémoire pour la chaîne de tableau) break case ERRTOOLONGSTRING. Imprimer (chaîne trop longue) break case ERRREMAINDERFROMZERODIVIDE. Imprimer (Reste de zéro diviser) cas de cassure ERRZERODIVIDE. Imprimer (Zero diviser) break cas ERRUNKNOWNCOMMAND. Imprimer (commande inconnue) break case ERRWRONGJUMP. Imprimer (Saut erroné (erreur jamais générée)) break case ERRNOTINITIALIZEDARRAY. Boîte d'impression (non initialisée) ERRDLLCALLSNOTALLOWED. Imprimer (les appels DLL ne sont pas autorisés) break case ERRCANNOTLOADLIBRARY. Imprimer (Impossible de charger la bibliothèque) break case ERRCANNOTCALLFUNCTION. Imprimer (Fonction impossible d'appeler) cas de coupure ERREXTERNALCALLSNOTALLOWED. Imprimer (Les appels de fonction expert ne sont pas autorisés) break case ERRNOMEMORYFORRETURNEDSTR. Print (Mémoire insuffisante pour la chaîne temporaire renvoyée par la fonction) break case ERRSYSTEMBUSY. Imprimer (Le système est occupé (erreur jamais produite)) break case ERRINVALIDFUNCTIONPARAMSCNT. Imprimer (nombre de paramètres de fonction non valide) break case ERRINVALIDFUNCTIONPARAMVALUE. Imprimer (valeur de paramètre de fonction non valide) break case ERRSTRINGFUNCTIONINTERNAL. Print (Erreur interne de fonction de chaîne) break case ERRSOMEARRAYERROR. Imprimer (Quelque erreur de tableau) break case ERRINCORRECTSERIESARRAYUSING. Imprimer (système de série incorrect utilisant) break case ERRCUSTOMINDICATORERROR. Erreur d 'impression (Erreur d' indicateur personnalisé) ERRINCOMPATIBLEARRAYS. Imprimer (Les tableaux sont incompatibles) break case ERRGLOBALVARIABLESPROCESSING. Imprimer (Erreur de traitement des variables globales) break case ERRGLOBALVARIABLENOTFOUND. Imprimer (variable globale non trouvée) break case ERRFUNCNOTALLOWEDINTESTING. Imprimer (La fonction n'est pas autorisée en mode test) break case ERRFUNCTIONNOTCONFIRMED. Imprimer (La fonction n'est pas confirmée) break case ERRSENDMAILERROR. Imprimer (Envoyer un message d'erreur) break case ERRSTRINGPARAMETEREXPECTED. Print (paramètre String attendu) break case ERRINTEGERPARAMETEREXPECTED. Print (paramètre entier attendu) break case ERRDOUBLEPARAMETEREXPECTED. Imprimer (Double paramètre prévu) break case ERRARRAYASPARAMETEREXPECTED. Imprimer (Array comme paramètre prévu) break case ERRHISTORYWILLUPDATED. Imprimer (données d'historique demandées en état de mise à jour) break case ERRTRADEERROR. Imprimer (Une erreur dans la fonction de trading) break case ERRENDOFFILE. Imprimer (Fin de fichier) break case ERRSOMEFILEERROR. Imprimer (erreur de fichier) break case ERRWRONGFILENAME. Imprimer (nom de fichier erroné) break case ERRTOOMANYOPENEDFILES. Imprimer (Trop de fichiers ouverts) break case ERRCANNOTOPENFILE. Imprimer (Impossible d'ouvrir le fichier) break case ERRINCOMPATIBLEFILEACCESS. Imprimer (Accès incompatible à un fichier) break case ERRNOORDERSELECTED. Imprimer (Pas de commande sélectionnée) break case ERRUNKNOWNSYMBOL. Imprimer (symbole inconnu) break case ERRINVALIDPRICEPARAM. Print (Invalid price) casse break ERRINVALIDTICKET. Imprimer (cas non valide) break case ERRTRADENOTALLOWED. Imprimer (Le commerce n'est pas autorisé - Activer la case à cocher - Autoriser la négociation en direct - dans les propriétés expertes) break case ERRLONGSNOTALLOWED. Imprimer (Longs are not allowed - Vérifier les propriétés expertes) break case ERRSHORTSNOTALLOWED. Imprimer (Les shorts ne sont pas autorisés - Vérifier les propriétés expertes) break case ERROBJECTALREADYEXISTS. Imprimer (l'objet existe déjà) break case ERRUNKNOWNOBJECTPROPERTY. Imprimer (propriété objet inconnu) break case ERROBJECTDOESNOTEXIST. Imprimer (l'objet n'existe pas) break case ERRUNKNOWNOBJECTTYPE. Imprimer (Type d'objet inconnu) break case ERRNOOBJECTNAME. Imprimer (Pas de nom d'objet) break case ERROBJECTCOORDINATESERROR. Imprimer (Erreur de coordonnées objet) break case ERRNOSPECIFIEDSUBWINDOW. Imprimer (Pas de sous-fenêtre spécifiée) break case ERRSOMEOBJECTERROR. Erreur dans la fonction objet) break ErrorDescription (code int) - renvoie la description de l'erreur pour le code spécifié Et voici une autre EA simple qui utilise certaines des fonctions qui ont été fournies dans les messages précédents. Voici comment cela fonctionne. Il utilise 3 moyennes mobiles exponentielles - rapide, moyen et lent dans les graphiques quotidiens hebdomadaires. Et seulement quelques règles simples: Acheter quand nous sommes en tendance haussière Vendre quand nous sommes dans la tendance baissière Tendance haussière. MA rapide est plus grand que MA moyen, MA moyen est plus grand que MA lente pour la tendance actuelle de la tendance haussière de la barre hebdomadaire. MA rapide est inférieure à moyenne MA, moyenne MA est inférieure à MA lente pour la barre hebdomadaire actuelle Cela devrait nous empêcher de vendre, lorsque nous sommes dans un marché haussier et d'acheter tandis que dans le marché baissier. Achat et vente de signaux sont également générés avec les mêmes 3 moyennes mobiles: Acheter le signal. Moyenne MA traverse MA lente de bas en haut et MA rapide est au-dessus de MA moyen dans le diagramme quotidien Vente du signal. Moyenne MA croise MA lente de plus haut à plus bas et MA rapide est inférieure à moyenne MA dans le graphique quotidien Si nous sommes dans une tendance haussière, la veille pour acheter des signaux. Et si nous sommes dans la tendance baissière, ne regardez que pour vendre des signaux. En plus de cela, cette EA utilise des arrêts de fuite pour conserver les profits une fois qu'ils ont été faits. Et il est également possible d'ouvrir plus d'une position en même temps (voir définition MAXORDERS). Définir MAXORDERS 5 Indicateur technique Variables extern int FastMA 8 externe int MediumMA 21 externe int SlowMA 55 externe int TrailStop 200 extern int InitialSL 200 Vérifier les conditions de marché haussier bool isBullishMarket () double rapide iMA (symbole (), PERIODW1. 0) double moyen iMA (symbole (), PERIODW1, moyenne 0), MODEEMA, PRICECLOSE, 0) double lent iMA (symbole () Gt lent dans le diagramme HEBDOMADAIRE si ((support gt moyen) ampamp (moyen gt lent)) return (true) else return (false) Vérifiez les conditions baissières du marché bool isBearishMarket () double rapide iMA (Symbol (), PERIODW1. 0) double moyen iMA (symbole (), PERIODW1, moyenne 0), MODEEMA, PRICECLOSE 0) double lent iMA (symbole () Lt lt lent dans le diagramme HEBDOMADAIRE si ((lt medium rapide) ampamp (medium lt lent)) return (true) else return (false) Attention à un signal d'achat bool buySignalOccured () double currentFast iMA (Symbol (), PERIODD1. FastMA. 0. MODEEMA. PRICECLOSE. 0) double previousMedium iMA (symbole (), PERIODD1, moyenne 1) double courantMedium iMA (symbole (), PERIODD1, 0) if (currentFast gt currentMedium) if ((previousMedium lt previousSlow) ampamp (currentMedium gt currentSlow 0) double précédentMedium iMA (symbole (), PERIODD1)) retourne (true) return (false) Attention pour un signal de vente bool sellSignalOccured () double currentFast iMA (Symbol (), PERIODD1. 1) double courantMedium iMA (Symbole (), PERIODD1, MediumMA, 0. MODEEMA, PRICECLOSE, 0) double précédentSlow iMA (Symbol (), PERIODD1, SlowMA 0. MODEEMA, 0) if (currentFast lt currentMedium) if ((previousMedium gt previousSlow) ampamp (currentMedium lt currentSlow)) return (true) return (false) Vérifier les conditions (Volume 91 0 93 gt 1) return Vérifier l'état d'achat sur la paire sélectionnée if (isBullishMarket ()) if (buySignalOccured ()) lot LotsOptimized (Point InitialSL) newMarketOrder (Symbol (), ACHETER. lot. Demandez - Point InitialSL. 0) Vérifier la condition de vente sur la paire sélectionnée if (isBearishMarket ()) si (sellSignalOccured ()) lot lotsOptimized (Point InitialSL) newMarketOrder (Symbol (), VENDRE. Double stoploss Iterate dans chaque ordre et choisissez ceux qui appartiennent à notre EA pour (int j 0 j lt OrdersTotal () j) si (OrderSelect (j SELECTBYPOS. MODETRADES) false) break if (OrderMagicNumber () MAGICNUMBER OrderSymbol () () - Ordre déjà dans la zone de profit si (Ask - TrailStop Point gt OrderOpenPrice ()) Est une nouvelle perte au-dessus des ordres actuels stoploss if (Ask - TrailStop Point gt OrderStopLoss ()) OrderModify (OrderTicket ) OrderOpenPrice (), Ask - TrailStop Point 0. 0. Bleu) continue si (OrderType () OPSELL) L'ordre est déjà dans la zone de profit si (BidStop Point lt OrderOpenPrice () Bid TrailStop Point lt OrderStopLoss ()) OrderModify (OrderTicket (), OrderOpenPrice (), Bid Trailtop Point. 0. 0. Blue) continue Point de départ de l'expert void start () si (MediumMA lt FastMA) retourner si (SlowMA lt MediumMA) retour Mettre à jour nos gestionnaires de commandes et d'argent updateMoneyManager () updateOrderManager () Signal pour fermer une position, cela pourrait être implémenté plus tard. Mais les arrêts à la fin devraient donner de bons résultats, soit updateTrailingStops () Vérifier l'ouverture d'une position if (countOpenOrders () lt MAXORDERS) checkForOpen () Voici la partie qui peut être optimisée: extern int FastMA 8 extern int MediumMA 21 externe int SlowMA 55 extern int TrailStop 200 extern int InitialSL 200 FastMA, MediumMA et SlowMA sont les périodes pour les moyennes mobiles exponentielles. InitialSL définit la perte d'arrêt initiale qui sera utilisée lorsqu'une nouvelle position est ouverte. TrailingStop définit la taille de l'arrêt de fuite en pips. Quelques améliorations possibles Ce système est à des fins d'apprentissage et devrait mieux ne pas être utilisé dans le commerce en direct - vous pouvez l'optimiser et le tester sur un compte démo si vous le souhaitez. Son simple et il ya beaucoup de choses qui devraient être améliorées avant de l'utiliser sur un compte réel comme par exemple: Une meilleure détection de la tendance globale du marché - une amélioration simple serait de ne pas utiliser les mêmes périodes moyennes mobiles pour le quotidien et le graphique hebdomadaire Open Plus de positions lorsque le marché se déplace dans la direction souhaitée. Ne pas attendre qu'un autre signe d'achat se produise, mais ouvrir une nouvelle position si nous sommes déjà dans la zone de profit avec la première commande et les chances sont que theres aucun changement de tendance en vue Utiliser une meilleure gestion de l'argent et des risques. Backtesting and Optimization J'ai pris 2007 comme backtesting période et utilisé ces valeurs: Parmi tous les résultats que j'ai obtenu, j'ai choisi un avec un bon résultat (gt 26.000 profit) et un rabat de Puis j'ai utilisé ces valeurs pour backtesting il 2008: gt 40.000 profit Mais ce fut une chance. Autres configurations avec différentes valeurs effectuées de mauvais à vraiment, vraiment mauvais. Il ya donc encore beaucoup à faire: améliorer la gestion des risques et de l'argent améliorer la gestion des commandes besoin d'une meilleure détection des tendances globales développer de meilleurs signaux d'ajouter à des positions rentables. Permettent d'ouvrir plus d'ordres et ne pas attendre un autre signal mais ouvert quand déjà de grands bénéfices sont faits coupés perd rapidement. N'utilisez pas l'arrêt initial fixe mais le calculez (en utilisant ATR par exemple) meilleur backtesting et optimisation: optimisez pour 2002 et backtest lui pour 2003. sélectionnez quelques arrangements et backtest eux aussi pour 2004. déchargez des arrangements exécutés pauvres et backtest pour 2005 avec Les paramètres restants et ainsi de suite. Jusqu'à ce que vous avez une bonne configuration qui a bien performé pendant une période plus longue Si vous avez des questions ou des améliorations, faites-le moi savoir. Any comment welcome 3ma. mq4 6 KB 321 téléchargements Combien de travail vous avez mis ici. Merci pour votre effort. Je n'ai pas vos compétences en programmation. Un couple de commentaires: Cela peut être ma faute en raison d'une installation incorrecte. L'EA envoie une taille de lot incorrecte. Je recevais 131 erreurs donc j'ai mis quelques commandes d'impression dans le code pour voir ce que la taille de lot était. Les commandes d'impression sont sur la ligne avant les lignes newMarketOrder. Ensuite, ouvrez le centre d'historique dans MT4 (appuyez sur F2), sélectionnez la paire de devises dans la liste des symboles sur la gauche et sélectionnez l'intervalle de temps le plus bas, 1 minute (double-cliquez dessus). Appuyez sur quotDownloadquot et répondez quotOKquot lorsque vous recevez l'avertissement. Cela peut prendre quelques minutes jusqu'à ce que toutes les valeurs historiques aient été téléchargées. J'ai 3,5 Mio 1-Minute bougies, thats les 10 dernières années en minutes Doit être suffisant. Vous pouvez le faire avec chaque période et devise, ou utiliser le script inclus quotperiodconverterquot, qui est fourni avec MT4. Je ne pense pas que vous avez besoin de télécharger pour chaque période ou utiliser le convertisseur périodique si les données d'historique est téléchargé par le centre d'historique. Lorsque je télécharge 1 min pour une paire de devises avec le centre d'historique tous les délais par défaut sont remplis et disponibles quand il se termine. Le convertisseur de périodes ne sera utilisé que pour les cadres de temps personnalisés. Si vous importez des données qui ont été téléchargées à l'externe (comme Alpari), le convertisseur de périodes doit être utilisé pour tous les délais autres que 1min. Je suis tout simplement étonné quand j'ai lu votre quotMon premier EAquot thread. Lire API Hier, et publier la première EA aujourd'hui. C'est la capacité d'un programmeur qualifié réel Et comme un commerçant, vous procédez dans la bonne direction. You have noticed general mistakes soon and are trying to correct them soon. Your quotto doquot list is perfect also. You are so capable enough to do most anything you want, but never forget to be simple. This is a statement that is posted in other forex forum recently and I totally agree. quotI know many who are real PRO traders and they say K. I.S. S Keep it simple system. quot Most trading system that has too many parameters that can quotadjustquot to the market (its what HAPPEND in the past) doesnt work well. Keep your eye on risk management and how to exit the market, then you will be successfull. The reasons why most traders will fail are 1) overtrade (risk too much at a time) 2) predict the future too much (especially by indicators) and underestimate randomness of the market 3) take profit too early and stop loss too late (both are related to the exit) 4) too complicated minded and just cant be consistent Thank you for posting and Good luck. Ive got a small present for you. These are the codes to autodetect and correct a problem of the broker that has quotone more digitquot. For example, most brokers have 4 price digits for EURUSD. (example 1.2345) But Alpari (I dont know whether there are another brokers or not) has 5 digits (example 1.23456) For JPY cross, most brokers gives 123.45 and Alpari gives 123.456. This causes an error when you use pips based integer value (stoploss or takeprofit etc.). Worst of all, if you calculate lot size from pips based stoploss, It returns wrong lot size. It will cause fatal malfunction for risk management. It can be used like this. (Maybe you can do it more sophisticated and universal way) int DQADJ DeciQuoteAdjuster() SL by pips int SLpips StopLossDQADJ SL decision double SL Ask - StopLossDQADJPoint lot size decision double RiskAmount AccountFreeMargin() (RiskRate100) double lot RiskAmount (PipValueStopLossDQADJ) StopLoss is pips based integer. PipValue means PL value for 1lot and 1pip. return(DeciQuoteADJ) return 1 or 10 I wanted to test EA 2 but the file common. mqh is missing. where can I find it One more question. I am new to all this. I use IMA function in the code as below. It seems to me that the IMA call does not return current values I want it to buy or sell when after the gold cross but it seems to do it elsewhere. Am I missing something. Maybe someone wants to cooperate on the project Order details extern int Slippage 3 How much slip can we accept extern double Lots 0.01 extern int MagicNumber 0 Stops extern bool UseStopLoss False No stops for the Axitrader extern int StopLoss 30 extern bool UseTakeProfit False extern int TakeProfit 60 extern bool UseTrailingStop True extern int TrailingStop 30 extern bool EachTickMode True extern bool OrderNoLossProfit True for axitrader ------------------------------------------------------------------ expert initialization function ------------------------------------------------------------------ int init() ---- Ticks back int BuyBackTicks 2 back ticks to check if time low lt high to buy int CloseBuyBackTicks 0 int SellBackTicks 2 back ticks to check if time low lt high to buy int CloseSellBackTicks 0 MA int MALow 5 int MAHigh 8 int Current 0 Current Bar int Order 0 int Ticket 0 int BarCount double StopLossLevel, TakeProfitLevel double BuyBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current BuyBackTicks) double BuyBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current BuyBackTicks) double BuyNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double BuyNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) double SellBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current SellBackTicks) double SellBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current SellBackTicks) double SellNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double SellNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) double CloseBuyBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current CloseBuyBackTicks) double CloseBuyBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current CloseBuyBackTicks) double CloseBuyNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double CloseBuyNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) double CloseSellBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current CloseSellBackTicks) double CloseSellBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current CloseSellBackTicks) double CloseSellNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double CloseSellNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) Alert(quotBuyBackLow, BuyBackHighquot, BuyBackLow, quot quot, BuyBackHigh) Alert(quotSellBackLow, SellBackHighquot, SellBackLow, quot quot, SellBackHigh) Check position bool IsTrade False for (int i 0 i lt OrdersTotal() i ) OrderSelect(i, SELECTBYPOS, MODETRADES) Select order by position in the trading pool bool OrderSelect( int index, int select, int poolMODETRADES) The function selects an order for further processing. It returns TRUE if the function succeeds. It returns FALSE if the function fails. To get the error information, one has to call the GetLastError() function. The pool parameter is ignored if the order is selected by the ticket number. The ticket number is a unique order identifier. To find out from what list the order has been selected, its close time must be analyzed. If the order close time equals to 0, the order is open or pending and taken from the terminal open positions list. One can distinguish an open position from a pending order by the order type. If the order close time does not equal to 0, the order is a closed order or a deleted pending order and was selected from the terminal history. They also differ from each other by their order types. Parameters: index - Order index or order ticket depending on the second parameter. select - Selecting flags. It can be any of the following values: SELECTBYPOS - index in the order pool, SELECTBYTICKET - index is order ticket. pool - Optional order pool index. Used when the selected parameter is SELECTBYPOS. It can be any of the following values: MODETRADES (default)- order selected from trading pool(opened and pending orders), MODEHISTORY - order selected from history pool (closed and canceled order). Closing existing orders if (OrderType() OPSELL ampamp OrderSymbol() Symbol()) Sell order found for currency pair same as chart close existing order if condition fulfilled(to be specified below) Closing Strategy here if (CloseSellBackLow lt CloseSellBackHigh ampamp CloseSellNowLow gt CloseSellNowHigh) Order SIGNALCLOSESELL if (CloseSellBackLow lt CloseSellBackHigh ampamp CloseSellNowLow gt CloseSellNowHigh)Order SIGNALCLOSEBUY if (Order SIGNALCLOSEBUY) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange) continue Trailing stop if(UseTrailingStop ampamp TrailingStop gt 0) if(Bid - OrderOpenPrice() gt Point TrailingStop) if(OrderStopLoss() lt Bid - Point TrailingStop) OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen) if (EachTickMode) BarCount Bars continue if (OrderType() OPBUY ampamp OrderSymbol() Symbol()) close existing order if condition fulfilled (to be specified below) Closing Strategy here if (CloseSellBackLow lt CloseSellBackHigh ampamp CloseSellNowLow gt CloseSellNowHigh) Order SIGNALCLOSESELL if (Order SIGNALCLOSESELL) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen) if (Order SIGNALBUY) if (AccountFreeMargin() lt (1000 Lots)) Alert(quotWe have no money. Free Margin quot, AccountFreeMargin()) return(0) StopLossLevel FuncStopLossLevel(UseStopLoss, StopLoss) TakeProfitLevel FuncTakeProfitLevel(UseTakeProfit, TakeProfit) Ticket OrderSend(Symbol(), OPBUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, quotBuy(quot MagicNumber quot)quot, MagicNumber, 0, DodgerBlue) Alert(quotBuying ticket quot, Ticket, quotError code quot, GetLastError() ) if(Ticket gt 0) if (OrderSelect(Ticket, SELECTBYTICKET, MODETRADES)) Alert(quotBUY order opened. quot, OrderOpenPrice()) if (OrderNoLossProfit) if (StopLoss gt 0 TakeProfit gt0) xxx OrderModify(OrderTicket(), OrderOpenPrice(), Ask Point StopLoss, Ask TakeProfit Point, 0, DarkOrange) else Alert(quotError opening BUY order. quot, GetLastError()) SELL SELL SELL Found gold cross: Insert Selling Strategy if (SellBackLow gt SellBackHigh ampamp SellNowLow lt SellNowHigh) Order SIGNALSELL if (Order SIGNALSELL) Check free margin if (AccountFreeMargin() lt (1000 Lots)) Alert(quotWe have no money. Free Margin quot, AccountFreeMargin()) return(0) if (UseStopLoss) StopLossLevel Bid StopLoss Point else StopLossLevel 0.0 if (UseTakeProfit) TakeProfitLevel Bid - TakeProfit Point else TakeProfitLevel 0.0 Ticket OrderSend(Symbol(), OPSELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, quotSell(quot MagicNumber quot)quot, MagicNumber, 0, DeepPink) if(Ticket gt 0) if (OrderSelect(Ticket, SELECTBYTICKET, MODETRADES)) Alert(quotSELL order opened. quot, OrderOpenPrice()) modify order with stoploss, take profit for axitrader xxx if (OrderNoLossProfit) if (StopLoss gt 0 TakeProfit gt0) OrderModify(OrderTicket(), OrderOpenPrice(), Ask Point StopLoss, Ask TakeProfit Point, 0, DarkOrange) else Alert(quotError opening SELL order. quot, GetLastError()) Alert(quotSelling Ticket quot, Ticket, quotError code quot, GetLastError()) double FuncStopLossLevel(bool UseStopLoss, double StopLoss) double StopLossLevel if (UseStopLoss) StopLossLevel Ask - StopLoss Point else StopLossLevel 0.0 return (StopLossLevel) double FuncTakeProfitLevel(bool UseTakeProfit, double TakeProfit) double TakeProfitLevel if (UseTakeProfit) TakeProfitLevel Ask - TakeProfit Point else TakeProfitLevel 0.0Opening a Trade Using OrderSend In the last module, we went over the basic Expert Advisor and how to create input parameters. If you8217d like to review that module, click here: The Expert Advisor. Today we are going to do something more useful with an Expert Advisor: open a trade. The MetaTrader function used to open a trade is called 8220OrderSend8221. This table details each of the parameters required to set when using the function. The symbol of the currency. The type of order to open. See the table below. The number of lots to open. The preferred open price. The number of points the preferred open price may slip. The stoploss set in the order on the brokers server. This value must be calculated using the price and the currency point value. The takeprofit set in the order on the brokers server. This value must be calculated using the price and the currency point value. A text comment that can be seen from within the MetaTrader platform when viewing open orders. The color of the arrow that will appear on the price chart when the OrderSend function is successful. Most of these parameters are pretty straight forward, but a few require a bit of an explanation. The 8220 symbol 8221 parameter is the name of the currency pair. You can use the MT function 8220Symbol()8221 which will automatically use the currency of the chart that the EA is running on. Or you can even define any name in quotes, for example 8220EURUSD8221. (Note: Opening a currency different than the one that the EA is running requires some special techniques which I8217ll cover in a later module.) The 8220 cmd 8221 parameter is the command that tells the broker8217s server what you want to do. The choices for a market order are OPBUY or OPSELL 8211 open a Buy or Sell trade. The 8220 volume 8221 parameter is the number of lots you8217d like to open or close. The 8220 price 8221 parameter is the preferred price. On MT, I8217ve found this value should be set to the 8220Ask8221 price for opening Buy orders and the 8220Bid8221 price for opening Sell orders. Any other values seem to cause the function to fail. The 8220 slippage 8221 parameter is how many points you8217ll allow the trade to slip and still complete the order. For example, suppose you8217d like to buy the EURUSD at 1.3595 and the slippage is set to 3 8211 you might pay as much as 1.359531.3598. (This may look bad, but if you set your slippage too small you may not get the trade at all.) The 8220 stoploss 8221 parameter is the limit for how far the trade can go against you before the broker8217s server closes the position. (Note: Your EA does not need to be running for the stoploss to work. This is a value stored on the broker8217s system.) This value will be lower than your open price for Buy orders and greater than the open price for Sell orders. Both the stoploss and takeprofit parameters must be in exact terms of the price, so you need to do some math here. For example, if you8217d like a stoploss of 15 points, you need to subtract 15 from the open price (for an open price of 1.3595): stoploss 1.3595 8211 0.0015 1.3580 Fortunately, there is an easy way to get the 0.0015 number using the 8220Point8221 function: 15 Point 0.0015 This way, you can work with a number like 15 instead of 0.0015. (I personally think the OrderSend function could have been written to simply accept a relative value like 15 for the stoploss instead of requiring an absolute price value like 1.3580). The 8220 takeprofit 8221 parameter is the limit of how far a trade can go in your direction before it closes for a profit. This value will be higher than your open price for Buy orders and less than the open price for Sell orders. The rest of this parameter is just like the stoploss. The 8220 comment 8221 parameter can be any text. It is saved with the trade and appears in the comment window in the trading terminal. I usually put the name of the EA in this field so when I look at my open trades I can see what EA has opened each. The 8220 magic 8221 parameter is a number that you can assign to the trade so that you can identify it later. We8217ll see exactly how in a later module on the OrderSelect function. The 8220 expiration 8221 parameter holds an expiration time for pending orders. It has no meaning for market orders. (In my experience it does not work for pending orders either.) The 8220 arrowcolor 8221 parameter allows you to choose the color of the arrow that is drawn on the chart when the trade is opened. Now that we have described all of the input parameters, I8217ll make a quick note about the 8220return value8221. The OrderSend function will return a value back after it has finished running. In MQL, like most languages, a negative number is a bad thing and zero or a positive number is usually a good thing 8211 indicating the function executed successfully. We8217ll capture and check the value return from the OrderSend function so we8217ll know if it worked and actually opened a trade successfully. Note: All of the information about the OrderSend function is available from within the MetaEditor. The help file is very useful. Even as an experienced MQL programmer, I refer to the help often. (From within the MetaEditor, select View-gtNavigator and then use the search option to find your information.) So, let8217s see what the MQL code looks like. Here is the MQL code for the OrderSend function. extern int stoploss200 the takeprofit extern int takeprofit200 the number of lots extern double lots 1.0 this function will be called each time new price data arrives from the broker int start() int status OrderSend( Symbol(), the synbol for this chart OPBUY, a buy order lots, number of lots Ask, use the ask price for a BUY 3, allow the price up to move 3 points Ask 8211 (stoplossPoint), stop Bid (takeprofitPoint), limit 8220My Simple EA8221, comment to see in TerminalCompany 8675309, a unique to id this trade 0, expiration, doesn8217t work Blue a blue arrow ) if( status lt 0 ) Comment(8220OrderSend Failed. Error8221, GetLastError()) return(0) Here are some common error codes returned from the OrderSend function that you may come across as you develop your EA8217s: ERRINVALIDPRICE 8211 usually the wrong preferred price: For Buy, use Ask, for. use Bid. ERRINVALIDSTOPS 8211 usually bad math with the stoploss or takeprofit values, or they are zero and the broker will not accept zero. ERRINVALIDTRADEVOLUME 8211 the lot value is invalid, usually a problem with mini or micro lots. If you have trouble, try setting this to 1.0 to see if the error goes away. ERRNOTENOUGHMONEY 8211 self explanatory, if you are testing using a demo account this can happen often 8211 just open another demo account. This wraps up our lesson on opening a trade with an Expert Advisor. (To open a Sell trade, change the 8220cmd8221 parameter to OPSELL and reverse the math on the stoploss and takeprofit.) This limited amount of information is dangerous, so be careful with this code and please, only run this on a demo account Next module we8217ll learn how to use technical indicatorsMQL4 Reference MetaQuotes Language 4 (MQL4) is a built-in language for programming trading strategies. This language is developed by MetaQuotes Software Corp. based on their long experience in the creation of online trading platforms. Using this language, you can create your own Expert Advisors that make trading management automated and are perfectly suitable for implementing your own trading strategies. Besides, using MQL4 you can create your own technical indicators (custom indicators), scripts and libraries. MQL4 contains a large number of functions necessary for analyzing current and previously received quotes, and has built-in basic indicators and functions for managing trade orders and controlling them. The MetaEditor (text editor) that highlights different constructions of MQL4 language is used for writing the program code. It helps users to orientate themselves in the expert system text quite easily. The brief guide contains functions, operations, reserved words, and other language constructions divided into categories, and allows finding the description of every used element of the language. Programs written in MetaQuotes Language 4 have different features and purposes: Expert Advisor is a mechanical trading system linked up to a certain chart. An Expert Advisor starts to run when an event happens that can be handled by it: events of initialization and deinitialization, event of a new tick receipt, a timer event, depth of market changing event, chart event and custom events. An Expert Advisor can both inform you about a possibility to trade and automatically trade on an account sending orders directly to a trade server. Expert Advisors are stored in terminaldirectoryMQL4Experts. Custom Indicator is a technical indicator written independently in addition to those already integrated into the client terminal. Like built-in indicators, they cannot trade automatically and are intended for implementing of analytical functions only. Custom indicators are stored in terminaldirectory MQL4Indicators Script is a program intended for a single execution of some actions. Unlike Expert Advisors, scripts do not process any actions, except for the start event (this requires the OnStart handler function in a script). Scripts are stored in terminaldirectoryMQL4Scripts Library is a set of custom functions intended for storing and distributing frequently used blocks of custom programs. Libraries cannot start executing by themselves. Libraries are stored in terminaldirectoryMQL4Libraries Include File is a source text of the most frequently used blocks of custom programs. Such files can be included into the source texts of Expert Advisors, scripts, custom indicators, and libraries at the compiling stage. The use of included files is more preferable than the use of libraries because of additional burden occurring at calling library functions. Include files can be stored in the same directory as a source file - in this case the include directive with double quotes is used. Another place to store include files is terminaldirectoryMQL4Include, in this case the include directive is used with angle brackets.
No comments:
Post a Comment