MetaTrader 5 - Trading Systems 80-20 stratégie de négociation Introduction 80-20 est un nom de l'une des stratégies de négociation décrites dans le livre Street Smarts: Haute probabilité à court terme Trading Strategies par Linda Raschke et Laurence Connors. Semblable aux stratégies discutées dans mon article précédent. Les auteurs l'attribuent à l'étape où le prix teste les frontières de la gamme. Il est également axé sur le bénéfice de fausses évasions et roll-backs des frontières. Mais cette fois, nous analysons le mouvement des prix sur un intervalle historique significativement plus court impliquant le jour précédent seulement. La durée de vie d'un signal obtenu est également relativement courte, puisque le système est destiné à la négociation intraday. Le premier objectif de l'article est de décrire le développement du module de signal de stratégie commerciale 80-20 utilisant le langage MQL5. Ensuite, nous allons relier ce module à la version légèrement éditée du robot commercial de base développé dans l'article précédent de la série. En outre, nous allons utiliser le même module pour le développement d'un indicateur pour le commerce manuel. Comme il a déjà été dit, le code fourni dans la série d'articles s'adresse principalement aux programmeurs novices légèrement avancés. Par conséquent, en plus de son objectif principal, le code est conçu pour aider à passer de la programmation procédurale à l'objet orienté. Le code ne comportera pas de classes. Au lieu de cela, il sera pleinement mettre en œuvre des structures qui sont plus faciles à maîtriser. Un autre objectif de l'article est de développer des outils qui nous permettent de vérifier si la stratégie est encore viable aujourd'hui, puisque Raschke et Connors utilisé le comportement du marché à la fin du siècle dernier lors de sa création. Quelques tests EA basés sur les données d'historique mises à jour sont présentés à la fin de l'article. 80-20 système commercial Les auteurs nommer George Taylors La Taylor Trading Technique. Ainsi que Steve Moores travaille sur l'analyse informatique des marchés à terme et Derek Gipsons trading expérience comme base théorique pour leur propre travail. L'essence de la stratégie commerciale peut être brièvement décrite comme suit: si les jours précédents Open et Close prix sont situés dans les zones de la plage quotidienne opposée, alors la probabilité d'un renversement vers l'ouverture jours précédents est très élevé aujourd'hui. Les jours précédents Les prix d'ouverture et de fermeture devraient être situés à proximité des limites de la zone. L'inversion doit commencer le jour en cours (pas avant les jours précédents la bougie est fermée). Les règles de stratégie pour l'achat sont les suivantes: 1. Assurez-vous que le marché a ouvert dans la 20 supérieure et fermé dans la partie inférieure 20 de la fourchette quotidienne hier 2. Attendre jusqu'à aujourd'hui Basse pauses les jours précédents un au moins de 5 ticks 3. Placez un ordre d'achat en attente sur le bord inférieur de la portée d'hier. 4. Une fois que l'ordre en attente déclenche, définissez son StopLoss initial aux jours Bas 5. Utilisez l'arrêt de fuite pour protéger le profit obtenu Les règles d'entrée de vente sont similaires, Être haussier, un ordre d'achat doit être situé à la limite supérieure de la barre, tandis que StopLoss devrait être placé à la haute aujourd'hui. Un autre détail important est la taille d'une barre quotidienne fermée. Selon Linda Raschke, il devrait être assez grand - plus que la taille moyenne des barres quotidiennes. Cependant, elle ne précise pas combien de jours d'histoire doivent être pris en considération lors du calcul de la plage quotidienne moyenne. Nous devons également garder à l'esprit que le TS est conçu exclusivement pour les exemples de négociation intraday montré dans le livre utiliser M15 graphiques. Le bloc de signal et l'indicateur faisant une mise en page selon la stratégie sont décrits ci-dessous. Vous pouvez également voir quelques captures d'écran avec les résultats de l'opération de l'indicateur. Ils illustrent clairement les modèles correspondant aux règles du système et aux niveaux de négociation liés aux modèles. L'analyse des modèles devrait aboutir à placer un ordre d'achat en attente. Les niveaux de négociation appropriés sont mieux vus sur le temps M1: Un modèle similaire avec l'orientation de marché opposée sur le calendrier M5: Ses niveaux de négociation (M1 calendrier): Module de signal Permet d'ajouter Take Profit niveau de calcul pour illustrer l'ajout de nouvelles options à un TS personnalisé. Il n'y a pas un tel niveau dans la version d'origine car seul un arrêt de fuite est utilisé pour fermer une position. Permet de prendre Take Profit en fonction du niveau d'enfoncement minimum personnalisé (TS8020ExtremumBreak), nous allons le multiplier par le ratio personnalisé TS8020TakeProfitRatio. Nous aurons besoin des éléments suivants de la fonction principale des modules de signal feGetEntrySignal: état du signal actuel, niveaux d'entrée et de sortie calculés (Stop Loss et Take Profit), ainsi que les limites de la gamme hierdays. Tous les niveaux sont reçus via des liens vers les variables passées à la fonction, tandis que l'état de retour des signaux utilise la liste des options de l'article précédent: énum ENUMENTRYSIGNAL ENTRYBUY, acheter signal ENTRYSELL, vendre signal ENTRYNONE, aucun signal ENTRYUNKNOWN état non défini ENUMENTRYSIGNAL feGetEntrySignal D1 analyse de deux boules datetime tTime, temps courant double amp dEntryLevel, niveau d'entrée (lien vers la variable) double amp dSL, niveau StopLoss (lien vers la variable) double ampli dTP, niveau TakeProfit (lien vers la variable) double amp dRangeHigh , Haut des modèles 1 st bar (lien vers la variable) double amp dRangeLow Bas des patterns 1 st bar (lien vers la variable)) Pour détecter un signal, il faut analyser les deux dernières barres de D1. Commençons à partir de la première si elle ne répond pas aux critères TS, il n'est pas nécessaire de vérifier la deuxième barre. Il y a deux critères: 1. La taille des barres (différence entre les valeurs Haute et Basse) doit dépasser la valeur moyenne pour les derniers XX jours (définie par le paramètre personnalisé TS8020D1AvantPériode) 2. Les niveaux Barre Ouverte et Fermer doivent être situés à l'opposé de La gamme de barres Si ces conditions sont remplies, les prix Haut et Bas devraient être enregistrés pour une utilisation ultérieure. Comme les paramètres de la première barre ne changent pas dans la journée entière, il est inutile de les vérifier à chaque appel de fonction. Laisser les stocker dans des variables statiques: entrée des paramètres personnalisés uint TS8020D1AveragePeriod 20 80-20: Nombre de jours pour calculer l'entrée de la plage quotidienne moyenne uint TS8020ExtremumBreak 50 80-20: Déclenchement minimum des hierons extremum (en points) statique ENUMENTRYSIGNAL sePossibleSignal ENTRYUNKNOWN patterns first SdRangeHigh 0. sdRangeLow 0 vérifiez la barre des motifs sur D1: if (SePossibleSignal ENTRYUNKNOWN) stLastD1Bar tCurrD1Bar La 1ère barre ne change pas la moyenne de ce jour Intervalle quotidien double dAverageBarRange fdAverageBarRange (TS8020D1AveragePeriod, PERIODD1. TTime) if (maRates 0.high maRates 0.low lt dAverageBarRange) 1 st bar n'est pas assez grand sePossibleSignal ENTRYNONE signifie aucun signal today return (sePossibleSignal) double d20Percents 0.2 (maRates 0.high () () () () () () () () () () () () () () () () () () () () () 0) (Haussier: maRates 0.close gt maRates 0.high d20Percent bar fermé dans le haut 20 ampamp maRates 0.open lt maRates 0.low d20Percents et ouvert dans le bas 20)) 1 st bar correspond aux conditions définir aujourd'hui négociation direction pour Les modèles 1 st bar: sePossibleSignal maRates 0.open gt maRates 0.close. ENTRYBUY. ENTRYSELL entrée sur le marché: sdEntryLevel dEntryLevel sePossibleSignal ENTRYBUY. MaRates 0.low. MaRates 0.high patterns 1 st bar range limites: sdRangeHigh dRangeHigh maRates 0.high sdRangeLow dRangeLow maRates 0.low else 1 st bar ouvert close niveaux ne correspondent pas aux conditions sePossibleSignal ENTRYNONE signifie aucun signal today return (sePossibleSignal) Liste de la fonction pour la définition La plage de la barre moyenne dans le nombre spécifié de barres sur le délai spécifié à partir de la fonction de temps spécifiée: double fdAverageBarRange (Calcule la taille de la barre moyenne int iBarsLimit, combien de barres à considérer) timeTime WRONGVALUE quand commencer le calcul) Double dAverageRange 0 variable pour les valeurs de sommation if (iBarsLimit lt 1) retour (dAverageRange) MqlRates maRates bar info tableau obtient les informations de la barre à partir de l'intervalle d'historique spécifié: if (tTime WRONGVALUE) tTime TimeCurrent () int iPriceBars CopyRates (symbole eTF, tTime, IBarsLimit, maRates) si (iPriceBars WRONGVALUE) si (LogLevel gt LOGLEVELNONE) PrintFormat (s: CopyRates: error u. FONCTION. (S): Copier les barres de U. FUNCTION: iPriceBars, iBarsLimit) somme des plages: int iBar iPriceBars while (iBar-- gt 0) ) DAverageRange maRatesiBar. high valeur moyenne maRatesiBar. low: return (dAverageRange double (iPriceBars)) Il n'y a qu'un seul critère pour les patterns seconde (current) bar breakout de la frontière de la gamme yesterdays ne doit pas être inférieure à celle spécifiée dans les paramètres TS8020ExtremumBreak). Dès que le niveau est atteint, un signal pour placer un ordre en attente apparaît: vérifiez les motifs 2 ème (actuelle) bar sur D1: if (sePossibleSignal ENTRYBUY) sdSL dSL maRates 1.low StopLoss à l'actuel High if (TS8020TakeProfitRatio gt 0 ) SdTP dTP dEntryLevel Point TS8020ExtremumBreak TS8020TakeProfitRatio Retrait de TakeProfit (est l'évènement descendant clairement vu maRates 1.close lt maRates 0.low Point TS8020ExtremumBreak ENTRYBUY. ENTRYNONE) if (SEPossibleSignal ENTRYSELL) sdSL dSL maRates 1.High StopLoss à l'actuel Low if (TS8020TakeProfitRatio Gt 0) sdTP dTP dEntryLevel Point TS8020ExtremumBreak TS8020TakeProfitRatio Retournement TakeProfit (est l'évènement ascendant clairement vu maRates 1.close gt maRates 0.high Point TS8020ExtremumBreak ENTRYSELL. ENTRYNONE) Enregistrez les deux fonctions mentionnées ci-dessus (feGetEntrySignal et fdAverageBarRange) et les paramètres personnalisés liés à Recevant un signal au fichier de bibliothèque mqh. La liste complète est jointe ci-dessous. Permet de nommer le fichier Signal80-20.mqh et de le placer dans le répertoire approprié du dossier de données du terminal (MQL5IncludeExpertSignal). Indicateur pour le commerce manuel Tout comme l'EA, l'indicateur est d'utiliser le module de signal décrit ci-dessus. L'indicateur doit informer un commerçant sur la réception d'un signal de placement de commande en attente et de fournir les niveaux calculés ordre placement, prendre Profit et Stop Loss niveaux. Un utilisateur peut sélectionner une méthode de notification, une fenêtre pop-up standard, une alerte par courrier électronique ou une notification push. Il est possible de choisir tous à la fois ou n'importe quelle combinaison que vous aimez. Un autre objectif de l'indicateur est un plan d'historique de transaction selon 80-20 TS. L'indicateur doit mettre en évidence les barres quotidiennes correspondant aux critères du système et calculer les niveaux de négociation calculés. Les lignes de niveau montrent comment la situation a évolué au fil du temps. Pour plus de clarté, faisons comme suit: lorsque le prix touche la ligne de signal, ce dernier est remplacé par une ligne de commande en attente. Lorsque l'ordre en attente est activé, sa ligne est remplacée par les lignes Take Profit et Stop Loss. Ces lignes sont interrompues lorsque le prix touche l'une d'entre elles (l'ordre est fermé). Cette disposition facilite l'évaluation de l'efficacité des règles du système de négociation et définit ce qui peut être amélioré. Commençons par déclarer les tampons et leurs paramètres d'affichage. Tout d'abord, nous devons déclarer les deux tampons avec le remplissage de la zone verticale (DRAWFILLING). La première consiste à mettre en évidence la plage quotidienne complète des barres de la journée précédente, tandis qu'une autre est de mettre en évidence la zone interne uniquement pour la séparer de la plage supérieure et inférieure 20 de la plage utilisée dans TS. Après cela, déclarer les deux tampons pour la ligne de signal multicolore et la ligne de commande en attente (DRAWCOLORLINE). Leur couleur dépend de la direction commerciale. Il ya deux autres lignes (Take Proft et Stop Loss) avec leur couleur restant la même (DRAWLINE) qu'ils doivent utiliser les mêmes couleurs standard qui leur sont assignées dans le terminal. Tous les types d'affichage sélectionnés, à l'exception d'une ligne simple, nécessitent deux tampons, donc le code ressemble à ceci: property indicatorchartwindow property indicatorbuffers 10 propriété indicatorplots 6 property indicatorlabel1 1 st bar de la propriété pattern indicatortype1 DRAWFILLING property indicatorcolor1 clrDeepPink. Propriété clrDodgerBlue indicatorwidth1 1 indicatorlabel2 propriété 1 st bar de la propriété pattern indicatortype2 DRAWFILLING property indicatorcolor2 clrDeepPink. Propriété clrDodgerBlue indicatorwidth2 1 propriété indicatorlabel3 Propriété du niveau de signal indicatortype3 DRAWCOLORLINE propriété indicatorstyle3 STYLESOLID propriété indicatorcolor3 clrDeepPink. Propriété clrDodgerBlue indicatorwidth3 2 propriété indicatorlabel4 Propriété entry level indicatortype4 DRAWCOLORLINE propriété indicatorstyle4 STYLEDASHDOT propriété indicatorcolor4 clrDeepPink. clrDodgerBlue propriété indicatorwidth4 2 bien indicatorlabel5 Arrêter la propriété de perte de propriété indicatortype5 DrawLine indicatorstyle5 propriété STYLEDASHDOTDOT indicatorcolor5 clrCrimson propriété indicatorwidth5 1 propriété indicatorlabel6 Take Profit propriété indicatortype6 propriété DrawLine indicatorstyle6 propriété STYLEDASHDOTDOT indicatorcolor6 clrLime propriété indicatorwidth6 1 permet de fournir aux traders la possibilité de désactiver le remplissage des motifs quotidiens Première barre, sélectionnez les options de notification du signal et limitez la profondeur de la structure historique. Tous les paramètres du système de négociation à partir du module de signal sont également inclus ici. Pour ce faire, nous devons énumérer de façon préliminaire les variables utilisées dans le module même si certaines d'entre elles doivent être utilisées uniquement dans l'EA et ne sont pas nécessaires dans l'indicateur: include ltExpertSignalSignal80- 20.mqhgt 80-20 Entrée du module de signal TS Bool ShowOuter true 1 st bar du motif: Affiche l'entrée de gamme complète bool ShowInner true 1 st bar du motif: Affiche l'entrée de zone interne bool AlertPopup true Alert: Affiche une fenêtre pop-up bool AlertEmail false Alerte: Envoyez un e-mail AlertEmailSubj Alert: entrée du sujet eMail bool AlertPush true Alert: Envoyer une entrée de notification push uint BarsLimit 2000 Profondeur de l'historique (dans les barres TF actuelles) ENUMLOGLEVEL LogLevel LOGLEVELNONE Mode d'enregistrement double buff1stBarOuter, buff1stBarOuterZero, buffers pour tracer toute la gamme des motifs 1 er bar buff1stBarInner, buff1stBarInnerZero, tampons pour tracer l'intérieur 60 des motifs 1 er bar buffSignal, buffSignalColor, ligne de signal tampons buffEntry, buffEntryColor, dans l'attente ligne de commande tamponne lignes buffSL, buffTP, StopLoss et TakeProfit tampons gdExtremumBreak 0 TS8020ExtremumBreak des prix de symbole int giD1AveragePeriod 1. valeur correcte pour TS8020D1AveragePeriod giMinBars wrongValue nombre de barres pour re-calcul int OnInit minimum requis () vérifier le paramètre entré TS8020D1AveragePeriod: giD1AveragePeriod int (fmin (1. TS8020D1AveragePeriod)) la conversion des points à des prix de symboles: gdExtremumBreak TS8020ExtremumBreak point nombre minimum requis De barres pour recalculer le nombre de barres de la TF courante dans un jour giMinBars int (86400 PériodeSecondes) indicateur buffers objectif: 1 st bars rectangle de la gamme complète SetIndexBuffer (0. buff1stBarOuter, INDICATORDATA) PlotIndexSetDouble (0. PLOTEMPTYVALUE. 0) SetIndexBuffer (1. buff1stBarOuterZero, INDICATORDATA) 1ère barres zone intérieure rectangle SetIndexBuffer (2. buff1stBarInner, INDICATORDATA) PlotIndexSetDouble (1. PLOTEMPTYVALUE. 0) SetIndexBuffer (3. buff1stBarInnerZero, INDICATORDATA) ligne de signal SetIndexBuffer (4. buffSignal, INDICATORDATA) PlotIndexSetDouble (2. PLOTEMPTYVALUE. 0) SetIndexBuffer (5. buffSignalColor, INDICATORCOLORINDEX) en attente de ligne de placement d'ordre SetIndexBuffer (6. buffEntry, INDICATORDATA) PlotIndexSetDouble (3. PLOTEMPTYVALUE. 0) SetIndexBuffer (7. buffEntryColor, INDICATORCOLORINDEX) buffSL, INDICATORDATA) PlotIndexSetDouble (4. PLOTEMPTYVALUE. 0) ligne TP SetIndexBuffer (9. buffTP, INDICATORDATA) PlotIndexSetDouble (5. PLOTEMPTYVALUE. 0) IndicatorSetInteger (INDICATORDIGITS. Digits) IndicatorSetString (INDICATORSHORTNAME. 80-20 TS) Placez le code principal de programmes À la fonction OnCalculate intégrée arranger la boucle pour itérer sur les barres de temps actuelles des barres du passé à l'avenir en les recherchant un signal en utilisant la fonction à partir du module de signal. Déclarez et initialisez les variables nécessaires en utilisant les valeurs initiales. Définit la barre de boucle la plus ancienne pour le premier calcul compte tenu d'une limite de profondeur d'historique définie par l'utilisateur (BarsLimit). Pour les appels ultérieurs, toutes les barres de la journée courante (plutôt que la dernière barre) sont recalculées, car le motif à deux barres appartient en fait au diagramme D1 quel que soit l'intervalle de temps actuel. En outre, nous devrions protéger contre les soi-disant fantômes: si nous n'effectuons pas un tampon d'indicateur forcé de compensation lors de la réinitialisation, alors les zones remplies ne plus pertinents restent sur l'écran lors de la commutation temporelles ou des symboles. La compensation de tampon doit être liée au premier appel de fonction OnCalculate après l'initialisation de l'indicateur. Cependant, la variable prévalue standard ne suffit pas à définir si l'appel est le premier, puisqu'il peut contenir zéro non seulement lors de la première appel de fonction mais également lors de la modification de la somme de contrôle. Permet de passer un certain temps à résoudre correctement ce problème en créant la structure non affectée en définissant la variable calculée à zéro. La structure est de stocker et de traiter les données fréquemment utilisées dans les indicateurs: - drapeau de la fonction OnCalculate premier lancement - le compteur de barres calculées qui n'est pas mis à zéro lors de la modification de la somme de contrôle - drapeau de changer la somme de contrôle - drapeau du début de Une nouvelle barre - heure de début de barre actuelle. La structure combinant toutes ces données doit être déclarée au niveau global. Il devrait être en mesure de recueillir ou de présenter des données à partir de toutes les fonctions intégrées ou personnalisées. Permet de nommer cette structure Brownie. Il peut être placé à la fin du code indicateur. Un objet global de structure de type global nommé goBrownie doit être déclaré là aussi: struct BROWNIE datetime tLastBarTime heure de la dernière barre traitée int iPrewCalculated nombre de barres calculées bool bFirstRun premier drapeau de lancement bool bHistoryUpdated historique update flag bool bIsNewBar nouveau bar ouverture flag BROWNIE ) les valeurs par défaut: tLastBarTime 0 iPrewCalculated wrongValue bFirstRun bIsNewBar vrai bHistoryUpdated faux vide fReset (bool bResetFirstRun true) les valeurs par défaut: tLastBarTime 0 iPrewCalculated wrongValue if (bResetFirstRun) bFirstRun vrai jeu à zéro s'il y a la permission bIsNewBar vrai bHistoryUpdated fUpdate false void (int iNewPrewCalculated wrongValue ) drapeau de la fonction intégrée OnCalculate premier appel, si (bFirstRun ampamp iPrewCalculated gt 0) bFirstRun fausse nouvelle barre datetime tThisBarTime TimeCurrent () - TimeCurrent () PeriodSeconds () bIsNewBar tLastBarTime tThisBarTime mettre à jour le temps de la barre actuelle si (bIsNewBar) tLastBarTime tThisBarTime si (iNewPrewCalculated gt - 1) y at-il des changements dans l'histoire bHistoryUpdated iNewPrewCalculated 0 ampamp iPrewCalculated utilisation gt wrongValue prewcalculated en cas d'OnCalculate 1 er appel if (iPrewCalculated wrongValue) iPrewCalculated iNewPrewCalculated ou s'il n'y avait aucune mise à jour else if (iNewPrewCalculated gt 0) iPrewCalculated historique INewPrewCalculated BROWNIE goBrownie Permet d'informer le Brownie de l'événement de désinitialisation de l'indicateur: void OnDeinit (const int raison) goBrownie. fReset () informer Brownie Si nécessaire, la quantité de données stockées par le Brownie peut être augmentée si des fonctions personnalisées ou des classes ont besoin de prix , Les volumes ou la valeur courante des barres (Open, High, Low, Close, tickvolume, volume, spread). Il est plus pratique d'utiliser des données prêtes à l'emploi à partir de la fonction OnCalculate et de les transmettre via Brownie plutôt que d'utiliser les fonctions de copie de séries temporelles (CopyOpen, CopyHigh, etc. ou CopyRates), ce qui permet d'économiser les ressources du CPU et d'éliminer le traitement des erreurs De ces fonctions linguistiques. Permet de revenir à la fonction indicateur principal. La déclaration des variables et la préparation des tableaux à l'aide de la structure goBrownie sont les suivantes: goBrownie. fUpdate (prevcalculated) les données d'alimentation à Brownie int iPeriodBar 0. compteur auxiliaire iCurrentTFBar ratestotal - int (BarsLimit) index de barre de la boucle TF actuelle start static datetime stLastD1Bar 0 time De la dernière barre traitée du couple de barres D1 (patterns 2 nd bar) static int si1stBarofDay 0 index de la première barre de jours courants si (goBrownie. bFirstRun) efface les tampons pendant la réinitialisation: ArrayInitialize (buff1stBarInner, 0) ArrayInitialize ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffSignalColor, 0) ArrayInitialize (buffEntryColor, 0) ArrayInitialize (buffEntryColor, 0) stLastD1Bar 0 si1stBarofDay 0 autre datetime tTime TimeCurrent () profondeur minimale de recalcul - à partir du jour précédent: iCurrentTFBar ratestotal - Bars (Symbol. PERIODCURRENT. TTime - tTime 86400. tTime) - 1 ENUMENTRYSIGNAL eSignal ENTRYUNKNOWN signal double dSL WRONGVALUE. Niveau SL dTP WRONGVALUE. Niveau TP dEntryLevel WRONGVALUE. Entrée dRangeHigh WRONGVALUE. DRangeLow WRONGVALUE fronts des motifs 1 st bar date date tCurrD1Bar 0. courant D1 bar time (motifs 2 nd bar) tD1BarToFill 0 D1 bar temps à remplir (patterns 1 st bar) assurez-vous que l'indice de barre de re-calcul initial est acceptable : ICurrentTFBar int (fmax (0.fmin (iCurrentTFBar, ratestotal - giMinBars))) tandis que (iCurrentTFBar lt ratestotal ampamp. IsStopped ()) la boucle du programme principal doit être localisée ici Vérifier la présence d'un signal lors de l'itération sur le courant (ESignal gt 1) ne continue pas de signal pendant le jour où la barre appartient Si un signal sur une nouvelle barre de jours est détecté, la plage de valeurs de La barre quotidienne précédente doit être remplie. La valeur de la variable tD1BarToFill du type datetime est utilisée comme indicateur. Si elle est égale à WRONGVALUE, aucun remplissage n'est requis sur cette barre. La ligne de signal devrait commencer à la même première barre, mais permet de l'étendre à la dernière barre de la veille pour une meilleure perception de disposition. Étant donné que les calculs d'une ligne de signal, ainsi que les couleurs de ligne et de remplissage pour les barres haussière et baissière sont différents, permet de faire deux blocs similaires: tCurrD1Bar Temps iCurrentTFBar Temps iCurrentTFBar 86400 début de la journée appartient à if (stLastD1Bar lt tCurrD1Bar) tD1BarToFill (TD1BarToFill WRONGVALUE) Remplissage des jours précédents Barre D1: iPeriodBar iCurrentTFBar if (dEntryLevel lt dRangeHigh) if (ShowOuter) tandis que (- - iPeriodBar gt 0) if (tD1BarToFill lt temps iPeriodBar) briser buff1stBarOuterZeroiPeriodBar dRangeLow buff1stBarOuteriPeriodBar dRangeHigh if (ShowInner) iPeriodBar iCurrentTFBar tout (--iPeriodBar gt 0) if (tD1BarToFill lt temps iPeriodBar) briser buff1stBarInnerZeroiPeriodBar dRangeLow 0,2 (dRangeHigh dRangeLow) buff1stBarInneriPeriodBar dRangeHigh 0,2 ( dRangeHigh dRangeLow) début de la ligne de signal depuis les jours précédents dernière barre buffSignaliCurrentTFBar buffSignaliCurrentTFBar 1 dRangeLow gdExtremumBreak buffSignalColoriCurrentTFBar buffSignalColoriCurrentTFBar 1 0 else if (ShowOuter) tandis que (--iPeriodBar gt 0) si (Time iPeriodBar lt tD1BarToFill) briser buff1stBarOuterZeroiPeriodBar dRangeHigh buff1stBarOuteriPeriodBar dRangeLow if ( ShowInner) iPeriodBar iCurrentTFBar tout (--iPeriodBar gt 0) si (Time iPeriodBar lt tD1BarToFill) briser buff1stBarInnerZeroiPeriodBar dRangeHigh 0,2 (dRangeHigh dRangeLow) buff1stBarInneriPeriodBar dRangeLow 0,2 (dRangeHigh dRangeLow) début de la ligne de signal depuis les jours précédents dernière barre buffSignaliCurrentTFBar buffSignaliCurrentTFBar 1 dRangeHigh gdExtremumBreak BuffSignalColoriCurrentTFBar buffSignalColoriCurrentTFBar 1 1 else continue Toutes les lignes de mise en page restantes doivent être tracées dans la boucle d'itération des barres d'horaires actuelles. Comme déjà mentionné, la ligne de signal devrait se terminer à la barre où le prix touché. La ligne de commande en attente doit commencer à la même barre et terminer sur la barre, à laquelle le contact avec le prix se produit. Take Profit et Stop Loss lignes devraient commencer à la même barre. La disposition du motif est terminée à la barre, à laquelle le prix touche l'un d'eux: Ligne de signal jusqu'à croisée par une barre: iPeriodBar iCurrentTFBar si (dEntryLevel lt dRangeHigh) while (iPeriodBar lt ratestotal) si (Time iPeriodBar gt tCurrD1Bar 86399) briser buffSignaliPeriodBar dRangeLow gdExtremumBreak buffSignalColoriPeriodBar 0 si (dRangeLow gdExtremumBreak gt Low iPeriodBar) briser d'autre pendant que (iPeriodBar lt ratestotal) si (Time iPeriodBar gt tCurrD1Bar 86399) briser buffSignaliPeriodBar dRangeHigh gdExtremumBreak buffSignalColoriPeriodBar 1 si (dRangeHigh gdExtremumBreak lt Haute iPeriodBar) ligne break d'entrée jusqu'à traversée par un bar: if (dEntryLevel lt dRangeHigh) tandis que (iPeriodBar lt ratestotal) si (Time iPeriodBar gt tCurrD1Bar 86399) briser buffEntryiPeriodBar dRangeLow buffEntryColoriPeriodBar 0 si (High iPeriodBar lt dRangeLow) si (. buffEntryiPeriodBar 1 0) de début et de fin sur une seule barre, (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) Terminer sur une barre unique, étendre de 1 bar à la buff précédenteEntryiPeriodBar 1 dRangeHigh buffEntryColoriPeriodBar 1 1 briser les lignes TP et SL jusqu'à ce qu'une d'elles soit croisée par une barre: if (dEntryLevel lt dRangeHigh) SL est égal au Low depuis le début de Par jour: dSL Low ArrayMinimum (Low. si1stBarofDay, iPeriodBar si1stBarofDay) tandis que (iPeriodBar lt ratestotal) si (Time iPeriodBar gt tCurrD1Bar 86399) briser buffSLiPeriodBar dSL buffTPiPeriodBar DTP if (Low iPeriodBar gt Haute iPeriodBar dSL DTP) si (buffSLiPeriodBar 1 0.) commencent et se terminent sur une seule barre, prolonger de 1 bar à l'buffSLiPeriodBar passé 1 dSL buffTPiPeriodBar 1 DTP briser le reste SL est égale à la haute depuis le début de la journée: dSL Haute ArrayMaximum (High si1stBarofDay, iPeriodBar si1stBarofDay.), tandis que (iPeriodBar lt ratestotal) si (Time iPeriodBar gt tCurrD1Bar 86399) briser buffSLiPeriodBar dSL buffTPiPeriodBar DTP if (Low iPeriodBar gt haute iPeriodBar DTP de dSL) si (buffSLiPeriodBar 1 0.) commencer et se terminer sur une seule barre, prolonger de 1 bar au passé buffSLiPeriodBar 1 dSL buffTPiPeriodBar 1 DTP pause Permet lieu Le code d'appel de la fonction de notification de signal fDoAlert hors de la boucle. En fait, il a légèrement plus de possibilités par rapport à ceux impliqués dans cet indicateur de la fonction est capable de travailler avec des fichiers audio ce qui signifie que cette option peut être ajoutée à des paramètres personnalisés. Il en va de même pour la possibilité de sélectionner des fichiers séparés pour acheter et vendre des signaux. Liste des fonctions: void fDoAlert (Fonction d'envoi des signaux et des notifications de la chaîne sMessage, message d'alerte bool bAlert true. afficher une fenêtre pop-up bool bSonné faux. play a sound file bool bEmail faux envoyer un eMail bool bNotification false. string sEmailSubject. eMail chaîne sujet sSound alert. wav fichier audio) chaîne statique ssPrevMessage le silence précédent message d'alerte statique datetime stPrevTime alerte précédente datetime time bar tThisBarTime TimeCurrent () PeriodSeconds () PeriodSeconds () en cours de temps de bar si (ssPrevMessage sMessage stPrevTime tThisBarTime) Un autre et ou 1 er à cette barre Rappelez-vous: sSPrevMessage sMessage stPrevTime tThisBarTime forme une chaîne de message: sMessage StringFormat (ssss, TimeToString (TimeLocal (), TIMESECONDS), heure locale Symbole. symbole StringSubstr (EnumToString (ENUMTIMEFRAMES (Période)), , TF message sMessage) activer le signal de notification: if (bAlert) Alert (sMessage) if (bEmail) SendMail (sEmailSubject Symbol. SMessage) if (bNotification) SendNotification (sMessage) if (bSound) PlaySound (sSound) Le code pour vérifier la nécessité d'appeler la fonction et de former le texte pour elle située dans le corps du programme avant l'achèvement du gestionnaire d'événement OnCalculate: alert iPeriodBar ratestotal 1 bar actuelle si (AlertPopup alertemail AlertPush 0) retour (ratestotal) tout est désactivé si (buffSignaliPeriodBar 0) retour (ratestotal) rien à attraper encore (ou déjà) si (Low iPeriodBar lt Haute iPeriodBar buffSignaliPeriodBar de buffSignaliPeriodBar) retour (ratestotal) pas Ligne de signal touchant le texte du message: chaîne sMessage StringFormat (TS 80-20: nécessaire ss, TP: s, SL: s, buffSignalColoriPeriodBar gt 0. BuyStop, DoubleToString (dEntryLevel, Digits), DoubleToString (dTP, Digits), DoubleToString DSL, Digits)) notification: fDoAlert (sMessage, AlertPopup, false) AlertEmail, AlertPush, AlertEmailSubj retourner (ratestotal) terminer l'opération OnCalculate Le code source complet de l'indicateur peut être trouvé dans les fichiers joints (TS80-20.mq5). Le plan de négociation selon le système est mieux vu sur les graphiques minute. Veuillez noter que l'indicateur utilise les données de la barre plutôt que de cocher les séquences à l'intérieur des barres. Cela signifie que si le prix a franchi plusieurs lignes de mise en page (par exemple, prendre les lignes Profit et Stop Loss) sur une seule barre, vous ne pouvez pas toujours définir lequel d'entre eux a été croisé en premier. Une autre incertitude vient du fait que les lignes de départ et de fin ne peuvent pas coïncider. Sinon, les lignes du tampon des types DRAWLINE et DRAWCOLORLINE seront simplement invisibles pour un utilisateur. Ces caractéristiques réduisent la précision de la mise en page, mais elles restent tout à fait claires. Expert Expert pour tester la stratégie de trading 80-20 L'EA de base pour tester les stratégies du livre Street Smarts: High Probability Stratégies de négociation à court terme a été décrite en détail dans le premier article. Ajoutons deux changements significatifs. First, the signal module is to be used in the indicator as well meaning it would be reasonable to set trading levels calculation in it. We have already done this above. Apart from the signal status, the feGetEntrySignal function returns order placement, Stop Loss and Take Profit levels. Therefore, lets remove the appropriate part of the code from the previous EA version adding the variables for accepting levels from the function and edit the function call itself. The listings of the old and new code blocks can be found in the attached file (strings 128-141). Another significant addition to the basic EA code is due to the fact that, unlike the previous two, this TS deals with a short-term trend. It assumes that the roll-back happens once a day and is unlikely to be repeated. This means that the robot has to make only one entry ignoring the existing signal all the rest of the time until the next day. The easiest way to implement that is to use a special flag static or global variable of bool type in the program memory. But if the EA operation is interrupted for some reason (the terminal is closed, the EA is removed from the chart, etc.), the flag value is lost as well. Thus, we should have the ability to check if todays signal was activated previously. To do this, we may analyze the history of trades for today or store the date of the last entry in the terminal global variables rather than in the program. Let us use the second option since it is much easier to implement. Provide users with the ability to manage one entry per day option and set an ID of each launched version of the robot it is needed to use global variables of the terminal level: input bool OneTrade false One position per day input uint MagicNumber 2016 EA magic number Lets add the variables necessary to implement one entry per day option to the programs global variables definition block. Initialize them in the OnInit function: string gsPrefix identifier of (super)global variables bool gbPositionToday false , gbPendingToday false Create a prefix of (super)global variable names: gsPrefix StringFormat ( SSB s u s. Symbol. MagicNumber, MQLInfoInteger ( MQLTESTER ). t . ) Has the robot worked with market or pending orders today gbPositionToday int ( GlobalVariableGet (gsPrefix LastPositionDate )) TimeCurrent () TimeCurrent () 86400 gbPendingToday int ( GlobalVariableGet (gsPrefix LastPendingDate )) TimeCurrent () TimeCurrent () 86400 Here the robot reads the values of global variables and compares the written time with the day start time, thus defining if the todays signal has already been processed. Time is written to the variables in two places lets add the appropriate block to the pending order installation code (additions highlighted): if (iTry - 10 ) if (LogLevel gt LOGLEVELNONE) Print ( Pending order placing error ) the distance from the current price is not enough :( if (LogLevel gt LOGLEVELERR) PrintFormat ( Pending order cannot be placed at the s level. Bid: s Ask: s StopLevel: s , DoubleToString (dEntryLevel, Digits ), DoubleToString (goTick. bid, Digits ), DoubleToString (goTick. ask, Digits ), DoubleToString (gdStopLevel, Digits ) ) else to update the flag: GlobalVariableSet ( in the terminal global variables gsPrefix LastPendingDate , TimeCurrent () TimeCurrent () 86400 ) gbPendingToday true in the program global variables The second block is placed after the code defining a newly opened position: if ( PositionSelect ( Symbol )) if ( PositionGetDouble ( POSITIONSL ) 0 .) if (gbPositionToday) update the flag: GlobalVariableSet ( in the terminal global variables gsPrefix LastPositionDate , TimeCurrent () TimeCurrent () 86400 ) gbPositionToday true in the program global variables . These are the only significant changes in the previous EA version code. The finalized source code of the new version is attached below. Strategy backtesting In order to illustrate the trading system viability, its authors use patterns detected on the charts from the end of the last century. Therefore, we need to check its relevance in todays market conditions. For testing, I took the most popular Forex pair EURUSD, the most volatile pair USDJPY and one of the metals XAUUSD. I increased the indents specified by Raschke and Connors 10 times, since four-digit quotes were used when the book was written, while I tested the EA on five-digit ones. Since there is no any guidance concerning the trailing parameters, I have selected the ones that seem to be most appropriate to daily timeframe and instrument volatility. The same applies to the Take Profit calculation algorithm added to the original rules the ratio for its calculation was chosen arbitrarily, without deep optimization. The balance chart when testing on the five-year EURUSD history with the original rules (no Take Profit): The same settings and Take Profit: The balance chart when testing the original rules on the five-year USDJPY history: The same settings and Take Profit: The balance chart when testing the original rules on the daily gold quotes for the last 4 years: The full data on the robot settings used in each test can be found in the attached archive containing the complete reports. Conclusion The rules programmed in the signal module match the 80-20 trading system description provided by Linda Raschke and Laurence Connors in their book Street Smarts: High Probability Short-Term Trading Strategies. However, we have extended the original rules a bit. The tools (the robot and the indicator) are to help traders draw their own conclusions concerning the TS relevance in todays market. In my humble opinion, the TS needs a serious upgrade. In this article, I have tried to make some detailed comments on developing the code of the signal module, as well as the appropriate robot and indicator. I hope, this will help those who decide to do the upgrade. Apart from modifying the rules, it is also possible to find trading instruments that fit better to the system, as well as signal detection and tracking parameters.80 trading strategies for novice One and done. 1 contract on the TF. 82 ticks. Incroyable. I love you. This thing is fking great. 0 today so far and playing by the rules. Forex Trading Strategy Session: The 80 20 Rule Explained: How To Hunt Stops 80 trading strategies for novice. Unlike some FCA firms, One Financial Markets does not mix client money with its own funds. One Financial Markets segregates client monies from its ownand does not use client funds for its own financing needs, thus providing additional comfort and protection to clients. 80 trading strategies for novice. 9 12 15, 7:55:48 AM ron covin: Scott Jaz is always a big help. She has a lot of patience, listens to the Nuances of your problem, knows how to9 12 15, 8:48:33 AM ron covin: Research solutions to your problem. We are testing a solution to my not receiving The Oil Money email. Jaz helped mewith better understanding Skype and general computer procedures. Jaz, as you well know, is a great asset to your organization. I really appreciate hertaking the time to help me. I really appreciate your taking the time to reply to my Skype message. Jaz spent two hours helping me. That is really atestimonial to your word about reading every email and going the extra mile to helping someone. I guess theres a message in all this about myignorance and maybe ineptitude however just having the opportunity to work with yourself and Jaz give me the inspiration and to work on and improve myweaknesses. I Learn something about myself, computers and your trading systems and philosophy each time I have the opportunity to experience yourinfluences. My many ways of showing my appreciation is just a small token of how much I appreciate my association with you and your staff. Thanksagain Scott. And also much thanks to Jaz. TTUL 9 12 15, 8:52:47 AM ron covin: The missing word in this dialogue is incentive. Thanks again forEVERYTHING. 80 trading strategies for novice - Read more Read more 80 trading strategies for novice The FCA is regarded by both consumers and financial service professionals as the pre-eminent financial regulatory body and is empowered under the UKGovernments Financial Services Markets Act to supervise and regulate financial services business in and from the United Kingdom. 80 trading strategies for novice. Forex Trading Strategies For Novice Traders. but if you want to make money you will have to spend much time to learn them and use in your trading strategy. All these properties contribute to form Fapturbo highly performing Forex trading autopilot tool. Traders are assured giant profitable rates methods, capitalization in the short term and long-term and thus success. I downloaded kstrat1 v3 yesterday and hit target real quick. this morning I turned it on around 807 and hit two winning trades and hit target. so intwo days made almost 4 on my account. needless to say I quit once goal was made. The most difficult part for me is quitting while winning buthaving done this for some time Ive had those days where I was way up and continued and finished down.80 trading strategies for novice. 80 trading strategies for novice. The address, which made its first appearance as the famous fictional detectives residence in the book A Study in Scarlet, doesnt appear in the recent BBC1 series. The actual 221B Baker Street is occupied by the Sherlock Holmes Museum, a small institution with awaxworks room, a drawing room well laid out in Victorian style, and a gift shop. This system is one among several forex robot software programs but the main big difference is truly that FAP Robot may be a foreign currency combinesoftware program which when it had been available came out with many other important options. The FAP Turbo48 is sometimes a abundant better releaseof the prior edition and also one among the encouraging software packages of its time. When it had been introduced its sales climbed to a lot of thanforty-three thousands copies. The particular bot was analyzed throughout the course of around six months. Watch 80 trading strategies for novice Final one for today. Just happened on DX - 90 Ticks - in the green box. 80 trading strategies for novice online. Just to let you know, I watched the 4 hrs of free instructions from The Oil Money over the weekend and traded sim on Monday. Ended up 0.00 after 2hrs. Tues I went live, but was cautious and made 0.00, Wed cleared .00 and Thurs 0.00. I have to go to my day job at 10:00 am central timeand have only a couple hrs to trade the usually crazy open on the Cl. I knew the information was making a difference in my trades and confidence inmaking those trades. By Fri I purchased the full program to get all I could to improve my knowledge. Im only on Day 2 as of now and am lookingforward to the next week of learning. I appreciate the 1 year membership here as part of the purchase of the program. Have not been to the chat orreally know what is available on this site yet. Thanks Scott for giving us all the opportunity to make a major change in our lives. Ive had myaccount for 3 or 4 months but have not been able to be truly profitable consistently. Im looking forward to financial freedom in My life. ThanksAgain.80 trading strategies for novice. Traded it live today by the bookscalped early in the day and after I had a good cushion took one last trade and allowed it to surf. Up ,070.00 onthe CL using 1 lot. I cant wait to get my hands on the Pivot Scalper. This program might just be the fix to my inconsistent trading behavior. 44 Eaton Square in well-to-do Belgravia serves for exterior shots of The Womans house. The interiors were, again, shot inNewport: in a private residence known as Fields House thats also been seen in episode Blink of Dr Who. Scott, you always have something new and informative. My account size is very small (2000.00) so Im working with currencies and only taking the bestfutures trades. Still taking one step forward one step backwards. Im thinking of taking a position trade for a few months or weeks and your teachingon fridays really help. Youre wonderful, keep up the great job of teaching. God bless.(80 trading strategies for novice online.) The phone box that you see in the image above was filled with hand-written notes commemorating the so-called death of Sherlock at theend of Series 2:
No comments:
Post a Comment