Nun, ich glaube nicht ;). Die Standardabweichung ist die RMS (root-mean-square deviation) des beobachteten Preises von der Prognose. Das heißt, man berechnet die Vorhersage, sieht, was dabei herauskommt, vergleicht es mit dem, was die Vorhersage sein sollte, und zieht erst dann seine Schlüsse. Dies ist einer der Gründe, warum der Prozess iterativ ist. Wenn Sie den in MT4 integrierten Indikator verwenden, wählen Sie automatisch den gleitenden Durchschnitt als Prognosepreis. Sie können etwas anderes auswählen. Der Algorithmus zur Berechnung des RMS selbst ist korrekt: die Quadratwurzel aus der Summe der Quadrate geteilt durch die Anzahl der Freiheitsgrade.
Vladislav, ausgehend von meinen auf der vorigen Seite dargelegten Annahmen, die von Ihnen noch nicht widerlegt wurden, suchen wir, um die optimale Parabel zu finden, die kürzesten Entfernungen von den Punkten der Preisreihen zu eben dieser Parabel (die Längen der von den Punkten der Preisreihen zur Parabel gezogenen Senkrechten), wobei wir davon ausgehen, dass das Preisfeld potenziell relativ zur Parabel ist. Dies erschwert verständlicherweise die Berechnungen, da wir die kubische Gleichung lösen müssen. Ich möchte nur noch einmal verstehen, inwieweit diese Methode zur Ermittlung der optimalen Parabel im Vergleich zur Ermittlung der optimalen Parabel durch die Regressionsmethode gerechtfertigt ist, wenn die Summe der Quadrate der Differenzen zwischen den Punkten der Preisreihen und der Parabel zum gleichen Zeitpunkt berechnet wird? Können Sie abschätzen, wie praktikabel die Regressionsmethode ist, um die optimale Parabel zu finden? Wurde diese Methode von Ihnen als Ergebnis einiger experimenteller Untersuchungen aus irgendwelchen Gründen verworfen (aus welchen Gründen denn?), oder sind Sie zu dem Schluss gekommen, dass die komplexere Methode zur Ermittlung der optimalen Parabel genauere Rückschlüsse auf die Umkehrbereiche zulässt, während es keinen grundlegenden Unterschied zwischen den Methoden gibt? Schließlich ist es auf den ersten Blick schwierig festzustellen, inwieweit sich die Anwendung verschiedener Methoden zur Bestimmung der optimalen Parabel auf das Endergebnis auswirkt. Natürlich verstehe ich, dass die Koeffizienten der Parabeln, die mit verschiedenen Methoden ermittelt wurden, unterschiedlich sind, aber ich würde gerne verstehen, um wie viel und, was noch wichtiger ist, um wie viel mehr sich die Endergebnisse unterscheiden werden.
Was die Konvergenz betrifft, so darf man nicht vergessen, dass es Terme der Reihe gibt, um den Näherungsfehler zu schätzen - man braucht also nicht unendlich viele Terme.
Vladislav, ich möchte auch klären, ob ich Ihre Empfehlung richtig verstehe. Wir geben Ihnen die Taylor-Formel: Betrachten Sie die Ableitungen der Parabel f(x)=Ax^2+B f'(x)=2Ax, f''(x)=2A, f''(x)=0, alle Ableitungen ab dem dritten und darüber gehen nach 0. Nach der Taylor-Formel haben wir dann eine Reihe, die nur aus den ersten drei Termen besteht. In diesem Fall wird die Entwicklung der Funktion f(x)=Ax^2+B in der Taylor-Reihe exakt sein (d. h. der letzte Term für den Expansionsfehler wird zu Null). Als nächstes müssen wir die Qualität der Annäherung der Preisreihen durch die optimale Parabel bewerten. Das heißt, unsere Hauptanforderung ist, dass die Reihe der Approximationsfehler konvergent sein muss (d.h. die Summe der Fehler konvergiert zu einer endlichen Zahl). Dies lässt sich einfach feststellen, indem man den berechneten Näherungsfehler mit dem dritten Term der Expansion vergleicht. Habe ich Recht oder nicht? Wenn wir also eine Parabel und die Stichprobe selbst auswählen, verwenden wir das Kriterium, dass der Effektivwert der Approximationsfehler den Wert des dritten Terms der Reihe nicht überschreiten sollte, für eine Stichprobe von Werten, die im Intervall von a bis x? liegen. Verfolgen Sie bei Ihrer Strategie das gleiche Prinzip oder nicht? Übrigens gibt es hier einige Ungereimtheiten. Wir optimieren die Parabel mit Hilfe der Eigenschaft des Preispotentials (durch die Senkrechte zur Parabel) und schätzen die Approximationsfehler auf die übliche Weise. Was ist hier falsch? Wie lassen sich die Suche nach der optimalen Parabel und die Schätzung des Approximationsfehlers miteinander vereinbaren?
Gehen wir es noch einmal durch - Sie entfernen sich von der integralen Lösung. Dass die Flugbahn eine Parabel ist, ergibt sich aus der Potenzialität des Feldes, aber wie kommen Sie auf die Idee, dass ich eine kubische Gleichung löse? Ich habe geschrieben, dass ich Integralmethoden verwende, deren Schätzungen die Besonderheiten des Potentialfeldes berücksichtigen, was den Ansatz eigentlich nur vereinfacht. Ich werde Ihnen nun einige Fragen stellen, auf die Sie selbst eine Antwort finden müssen. Wonach suchen Sie und in welcher Form möchten Sie das Ergebnis erhalten? Ich habe mir die Aufgabe gestellt, den Vorsprung der Landzunge zu finden. Folglich war es notwendig, eine Methode der Annäherung (vernünftig zu wählen) und eine Methode zur Schätzung des Fehlers dieser Annäherung zu wählen. Diese Methoden sind miteinander verwandt. Bitte verzeihen Sie mir, aber ich werde nicht den Algorithmus beschreiben, den ich entwickelt habe und auf dem mein System basiert, sondern nur die Grundprinzipien, bitte. Hier geht es also um Prinzipien - die Konstruktion einer Projektion (eigentlich ist es eine Extrapolation, die wiederum auf der aktuellen Approximation basiert) begründet lediglich eine Ordnung von Approximationsfunktionen, und diese wiederum ist eine Möglichkeit, Fehler zu definieren. Aus den Überlegungen zur Feldpotenzialität leiten wir die Ordnung der Annäherung und die grundlegenden Gesetze ab, denen unsere Annäherung genügen muss, und schätzen gleichzeitig den maximal zulässigen Fehler ab, bei dem unsere Annäherung noch als angemessen betrachtet werden kann. Wenn Sie mit Ihren Untersuchungen beginnen, werden Sie mit einer gewissen Ungewissheit konfrontiert - das Problem ist, dass die Grundlage für die Annäherungen nicht unbedingt auf die einzige Art und Weise ausgewählt werden kann (ich denke, dies spiegelt die Realität wider, dass ein Trend höherer Ordnung in Trends niedrigerer Ordnung zerlegt werden kann und umgekehrt - Trends niedrigerer Ordnung können zu einem Trend höherer Ordnung werden) - hier brauchen Sie ein Qualitätskriterium, auf dessen Grundlage Sie die beste Annäherung im Sinne der Extrapolation auswählen können (es kann mehrere Annäherungen geben, die im Sinne der Extrapolation gleich gut sind). Ich habe als ein solches Kriterium das Minimum des potenziellen Energiefunktionals gewählt (und dies ist auch eine Folge der Potenzialität des Preisfeldes). Wie man Näherungen bildet - Sie haben bereits herausgefunden, dass es sich um eine quadratische Form handelt - Sie können nach einer Parabel suchen, oder Sie können nach einem anderen Weg suchen - denken Sie darüber nach. Wenn Sie nach einer Parabel suchen (was ich nicht tue), können Sie den Algorithmus der Standardabweichung des Standardangebots verwenden - dann müssen Sie die realen Preise von den Parabelwerten abziehen. Und dann braucht man drei Punkte, um die Parabel zu bilden - und man muss wahrscheinlich die Spline-Approximation durch quadratische Funktionen verwenden, denn es ist nicht sicher, dass alle Preise während des gesamten Stichprobenzeitraums auf der gleichen Parabel liegen werden. Sie können sich auch mit einem Muvin annähern - Sie müssen schätzen, das könnte besser sein. Und schätzen Sie dann das Konfidenzintervall. Ich denke, die Bolinger-Linien können hier als Konfidenzintervall betrachtet werden. Im Allgemeinen gibt es eine ganze Reihe von Fragen. Bei diesem Ansatz können Sie zwar einige der bereits verfügbaren Algorithmen verwenden. Wenn Sie sich für einen Näherungswert entschieden haben, können Sie diesen Weg in die Zukunft fortsetzen (je weiter Sie gehen, desto unzuverlässiger wird das Ergebnis). Ich tue auch, was ich tue - ich wähle einen Näherungszeitraum (nicht die gesamte Stichprobe, sondern etwa 2/3, extrapoliere das letzte Drittel und vergleiche es mit den erhaltenen realen Preisen, wenn es nicht aus dem Konfidenzintervall fällt, dann verwende ich diese Näherung für weitere Extrapolationen, aber das gehört zur Implementierung und zu den Methoden zur Erhöhung der Stabilität von iterativen Algorithmen).
A mozet sdelajem v all vmeste konstruktivnuju rabotu? Say, napisat' sovmestno indikator, katoryj beget 4erez vs vs istoriju do teku4ej ceny i s4ityvajet Elliot waves :))) Developery MT4 tol'ko pablogodorit za takoje.
Neskol'ko moix idej dlia na4ala:
1) Gleich zu Beginn istoriji opredelit' v kakuju toru cena ili FLAT 2) if FLAT, zdiom poka probivajutsia granitsia flata, tokda smotrim v kakuju storonu dvigajetsia cena, tak opredelajem na4alo ods4iota, s4itajem tol'ko 1-2-3 i A-B-C volny 3) is4em tol'ko "grundlegende" Elliot Wave Muster 1-2-3 i 1-2-3-4-5 + A-B-C volny nach okon4anija dvizenija ceny(Trend) 4) Jesli imejem "failed Elliot Wave", zna4it ploxoj ods4iot i tot kusok istroriji nada jes4io raz peresmatret' nas4iot v kakuju storonu dvigajetsia cena intervale pabolshe teku4evo. 5) K etim grafikam xorosho godosho cifra Fibonacci, sami lookit s indikator MT4 v istoriji ot Elliot Wave 1 na4ala do na4ala Elliot Wave 4 - http://www.market-harmonics.com/elliott_wave2.htm
Es geht also um Prinzipien - die Erstellung einer Projektion (eigentlich ist es eine Extrapolation, die wiederum auf der aktuellen Approximation basiert) begründet lediglich die Reihenfolge der approximierenden Funktionen, und dies wiederum ist eine Möglichkeit, die Fehler zu bestimmen.
Sie tun also wahrscheinlich Folgendes. Schritt 1. Nehmen Sie eine Probe Schritt 2. Annäherung mit einem linearen Regressionskanal Schritt 3. Finden Sie Näherungsfehler. Schritt 4. Analysieren Sie das Diagramm der Fehler. Die Vermutung, dass die Ordnung der approximierenden Funktion höher sein sollte oder die gegebene Stichprobe überhaupt nicht durch eine kontinuierliche Funktion approximiert werden kann, ergibt sich, wenn die Fehlerreihe divergiert oder einige starke, mit dem Auge erkennbare Abweichungen aufweist, die aus dem akzeptablen Konfidenzintervall herausfallen (der Algorithmus zur Automatisierung der Berechnung ist noch nicht ganz klar). Schritt 5. Wiederholen Sie die Schritte 1-4 für die Approximation durch eine Parabel (oder etwas anderes) Schritt 6. Bewerten Sie die Fehler; wenn die Fehler eine angemessene Grenze überschreiten, verwerfen Sie einfach die betreffende Stichprobe. Wenn der Fehlergraph eine vernünftige Struktur hat, dann speichern wir die Informationen über die Stichprobe, die Näherungsmethode und zusätzliche Informationen über die Näherungsfunktionen in einem Feld. Schritt 7. Nachdem wir wiederholt alle möglichen Stichproben ausprobiert und für jede Stichprobe die optimalen Varianten von Näherungsfunktionen gesucht haben, bleiben wir bei den Stichproben stehen, die unsere Anforderungen am besten erfüllen. Es ist natürlich auch wünschenswert, die von Ihnen empfohlene Methode der Funktionsannäherung nicht für die gesamte Stichprobe anzuwenden, sondern nur für 2/3, wobei das letzte Drittel zum Testen der Annäherungsergebnisse übrig bleibt (dies ist ein sehr wertvoller Vorschlag!). Schritt 8. Zeichnen Sie Extremwertannäherungen auf dem Preisdiagramm mit Fortschreibung in die Zukunft. Es versteht sich von selbst, dass für jede Annäherung ein Konfidenzintervall eingezeichnet wird. Schritt 9. Wir werden also sehen, wo sich die Grenzen der Intervalle schneiden. Dann legen wir die ungefähren Daten fest. Schritt 10. Während der Annäherung der Kurse an die Wendepunkte berechnen wir die Wahrscheinlichkeit einer Trendumkehr mit Hilfe der Methode der integralen Fehlerschätzung. Es wird wahrscheinlich notwendig sein, die Pivot-Schätzungen für alle Näherungskanäle zu mitteln. Für den linearen Regressionskanal muss auch der Hearst-Koeffizient berechnet werden, um ihn als zusätzlichen Parameter zu haben. Es ist auch gut, sich die Murray-Ebenen anzuschauen. Auf diese Weise können wir mit hoher Wahrscheinlichkeit eine Entscheidung über die Platzierung schwebender Aufträge und die Festlegung von Stopps mit minimalem Risiko treffen. Natürlich wird der Expert Advisor, der all das berechnet, sehr umfangreich sein (Sie sagten, er enthält 6000 Zeilen)! Und bis jetzt ist noch nicht alles klar, was die automatische Entscheidungsfindung für jede der Proben betrifft. Nun, ich denke, man muss einfach versuchen, diesen Algorithmus zu programmieren, und dann kann man beim Experimentieren etwas herausfinden, das selbst auf theoretischer Ebene schwer zu verstehen ist, das aber während des Experiments von selbst klar wird. Und in der Tat wird die Berechnungszeit beträchtlich sein. Sie sagten, dass die ersten Varianten 30-40 Minuten lang auf einer schwachen Maschine funktionierten. Nun, auf einem P4 2,4 GHz sollten Sie etwa 10 Minuten Rechenzeit erwarten.
Zum Thema Näherungsmethoden habe ich das folgende interessante Tutorial gefunden.
Richtig. Ich denke, den Rest werden Sie im Laufe der Implementierung des Algorithmus herausfinden.
Da man die Parabel selbst nicht braucht, kann man die Ableitungen gleich approximieren. Der Regressionskoeffizient ist das, was Sie brauchen (daher die Taylor-Reihe ;) ). Dann ist es egal, welche Form die Trajektorie hat - Hauptsache, das Konfidenzintervall wird richtig geschätzt. Bitte lesen Sie die empfohlene Literatur sorgfältig durch, sie enthält genügend Informationen.
Wenn Sie den in MT4 integrierten Indikator verwenden, wählen Sie automatisch den gleitenden Durchschnitt als Prognosepreis. Sie können etwas anderes auswählen. Der Algorithmus zur Berechnung des RMS selbst ist korrekt: die Quadratwurzel aus der Summe der Quadrate geteilt durch die Anzahl der Freiheitsgrade.
Viel Glück und viel Erfolg mit den Trends.
Vladislav, ich möchte auch klären, ob ich Ihre Empfehlung richtig verstehe.
Wir geben Ihnen die Taylor-Formel:
Betrachten Sie die Ableitungen der Parabel f(x)=Ax^2+B
f'(x)=2Ax,
f''(x)=2A,
f''(x)=0, alle Ableitungen ab dem dritten und darüber gehen nach 0.
Nach der Taylor-Formel haben wir dann eine Reihe, die nur aus den ersten drei Termen besteht. In diesem Fall wird die Entwicklung der Funktion f(x)=Ax^2+B in der Taylor-Reihe exakt sein (d. h. der letzte Term für den Expansionsfehler wird zu Null). Als nächstes müssen wir die Qualität der Annäherung der Preisreihen durch die optimale Parabel bewerten. Das heißt, unsere Hauptanforderung ist, dass die Reihe der Approximationsfehler konvergent sein muss (d.h. die Summe der Fehler konvergiert zu einer endlichen Zahl). Dies lässt sich einfach feststellen, indem man den berechneten Näherungsfehler mit dem dritten Term der Expansion vergleicht. Habe ich Recht oder nicht? Wenn wir also eine Parabel und die Stichprobe selbst auswählen, verwenden wir das Kriterium, dass der Effektivwert der Approximationsfehler den Wert des dritten Terms der Reihe nicht überschreiten sollte, für eine Stichprobe von Werten, die im Intervall von a bis x? liegen. Verfolgen Sie bei Ihrer Strategie das gleiche Prinzip oder nicht?
Übrigens gibt es hier einige Ungereimtheiten. Wir optimieren die Parabel mit Hilfe der Eigenschaft des Preispotentials (durch die Senkrechte zur Parabel) und schätzen die Approximationsfehler auf die übliche Weise.
Was ist hier falsch? Wie lassen sich die Suche nach der optimalen Parabel und die Schätzung des Approximationsfehlers miteinander vereinbaren?
Viel Glück und viel Erfolg mit den Trends.
A mozet sdelajem v all vmeste konstruktivnuju rabotu?
Say, napisat' sovmestno indikator, katoryj beget 4erez vs vs istoriju do teku4ej ceny i s4ityvajet Elliot waves :)))
Developery MT4 tol'ko pablogodorit za takoje.
Neskol'ko moix idej dlia na4ala:
1) Gleich zu Beginn istoriji opredelit' v kakuju toru cena ili FLAT
2) if FLAT, zdiom poka probivajutsia granitsia flata, tokda smotrim v kakuju storonu dvigajetsia cena, tak opredelajem na4alo ods4iota, s4itajem tol'ko 1-2-3 i A-B-C volny
3) is4em tol'ko "grundlegende" Elliot Wave Muster 1-2-3 i 1-2-3-4-5 + A-B-C volny nach okon4anija dvizenija ceny(Trend)
4) Jesli imejem "failed Elliot Wave", zna4it ploxoj ods4iot i tot kusok istroriji nada jes4io raz peresmatret' nas4iot v kakuju storonu dvigajetsia cena intervale pabolshe teku4evo.
5) K etim grafikam xorosho godosho cifra Fibonacci, sami lookit s indikator MT4 v istoriji ot Elliot Wave 1 na4ala do na4ala Elliot Wave 4 - http://www.market-harmonics.com/elliott_wave2.htm
Dopolnitel'no doli poniatija o 4iom re4' pro4itaite http://www.elliottician.com/showpage.asp?p=47 i postaraites' ponat' kak kotritsia "bassic Elliot Wave pattern". Polnoje opisanije na ruskom ses' : http://www.alpari-idc.ru/ru/textbook/tech_an/ew/
V rezultat kod indikatora patom mozno podkrutit' k novojiji versi MT4 kak standartnyj indikator :)
Sie tun also wahrscheinlich Folgendes.
Schritt 1. Nehmen Sie eine Probe
Schritt 2. Annäherung mit einem linearen Regressionskanal
Schritt 3. Finden Sie Näherungsfehler.
Schritt 4. Analysieren Sie das Diagramm der Fehler. Die Vermutung, dass die Ordnung der approximierenden Funktion höher sein sollte oder die gegebene Stichprobe überhaupt nicht durch eine kontinuierliche Funktion approximiert werden kann, ergibt sich, wenn die Fehlerreihe divergiert oder einige starke, mit dem Auge erkennbare Abweichungen aufweist, die aus dem akzeptablen Konfidenzintervall herausfallen (der Algorithmus zur Automatisierung der Berechnung ist noch nicht ganz klar).
Schritt 5. Wiederholen Sie die Schritte 1-4 für die Approximation durch eine Parabel (oder etwas anderes)
Schritt 6. Bewerten Sie die Fehler; wenn die Fehler eine angemessene Grenze überschreiten, verwerfen Sie einfach die betreffende Stichprobe. Wenn der Fehlergraph eine vernünftige Struktur hat, dann speichern wir die Informationen über die Stichprobe, die Näherungsmethode und zusätzliche Informationen über die Näherungsfunktionen in einem Feld.
Schritt 7. Nachdem wir wiederholt alle möglichen Stichproben ausprobiert und für jede Stichprobe die optimalen Varianten von Näherungsfunktionen gesucht haben, bleiben wir bei den Stichproben stehen, die unsere Anforderungen am besten erfüllen. Es ist natürlich auch wünschenswert, die von Ihnen empfohlene Methode der Funktionsannäherung nicht für die gesamte Stichprobe anzuwenden, sondern nur für 2/3, wobei das letzte Drittel zum Testen der Annäherungsergebnisse übrig bleibt (dies ist ein sehr wertvoller Vorschlag!).
Schritt 8. Zeichnen Sie Extremwertannäherungen auf dem Preisdiagramm mit Fortschreibung in die Zukunft. Es versteht sich von selbst, dass für jede Annäherung ein Konfidenzintervall eingezeichnet wird.
Schritt 9. Wir werden also sehen, wo sich die Grenzen der Intervalle schneiden. Dann legen wir die ungefähren Daten fest.
Schritt 10. Während der Annäherung der Kurse an die Wendepunkte berechnen wir die Wahrscheinlichkeit einer Trendumkehr mit Hilfe der Methode der integralen Fehlerschätzung. Es wird wahrscheinlich notwendig sein, die Pivot-Schätzungen für alle Näherungskanäle zu mitteln. Für den linearen Regressionskanal muss auch der Hearst-Koeffizient berechnet werden, um ihn als zusätzlichen Parameter zu haben. Es ist auch gut, sich die Murray-Ebenen anzuschauen. Auf diese Weise können wir mit hoher Wahrscheinlichkeit eine Entscheidung über die Platzierung schwebender Aufträge und die Festlegung von Stopps mit minimalem Risiko treffen.
Natürlich wird der Expert Advisor, der all das berechnet, sehr umfangreich sein (Sie sagten, er enthält 6000 Zeilen)! Und bis jetzt ist noch nicht alles klar, was die automatische Entscheidungsfindung für jede der Proben betrifft. Nun, ich denke, man muss einfach versuchen, diesen Algorithmus zu programmieren, und dann kann man beim Experimentieren etwas herausfinden, das selbst auf theoretischer Ebene schwer zu verstehen ist, das aber während des Experiments von selbst klar wird. Und in der Tat wird die Berechnungszeit beträchtlich sein. Sie sagten, dass die ersten Varianten 30-40 Minuten lang auf einer schwachen Maschine funktionierten. Nun, auf einem P4 2,4 GHz sollten Sie etwa 10 Minuten Rechenzeit erwarten.
Zum Thema Näherungsmethoden habe ich das folgende interessante Tutorial gefunden.
Da man die Parabel selbst nicht braucht, kann man die Ableitungen gleich approximieren. Der Regressionskoeffizient ist das, was Sie brauchen (daher die Taylor-Reihe ;) ). Dann ist es egal, welche Form die Trajektorie hat - Hauptsache, das Konfidenzintervall wird richtig geschätzt. Bitte lesen Sie die empfohlene Literatur sorgfältig durch, sie enthält genügend Informationen.
Viel Glück und gute Trends.
Ich hab's... :)
Vot odin iz moix staryx mql3:
/*[[ Name := Elliot wave recognization Author := Copyright © 2004, T-1000, Lithuania Notes := Searches for Elliot wave patterns and places markers on chart Link := irc://irc.omnitel.net/forex Update on every tick := Yes Enable Alerts := Yes Disable alert once hit := Yes Lots := 0.1 Stop Loss := 70 Take Profit := 150 Trailing Stop := 35 ]]*/ /* An Impulse pattern moves in the direction of the underlying trend and is made up of five waves, or moves. Each wave is labeled at its endpoint. The Elliott Wave Principle identifies an Impulse wave when: 1. Wave 2 does not fall below the starting price of wave 1. 2. Wave 3 is not the shortest wave by price movement when comparing to wave 1 and wave 5. 3. Wave 4 does not overlap the range of wave 1. */ Defines: MaxBars(200),RetracementBars(100),EWPeriod(10),NoisePips(30),MinTakeProfit(50),SARstep(0.0015),SARmax(0.0100); Defines: MaxTrades(1),AntiStopLoss(0),Slippage(5),DelayedBidsTimeout(172800),BidStopPoints(60),BidLimitPoints(50),TrailingStep(10),IncrementLots(1),MinMoney(0),MiniForexMode(1); vars: counter(0),counter2(0),ComputedPricesCount(0),StartMoney(0); vars: EW1(0),EW2(0),EW3(0),EW4(0),EW5(0); vars: LastEW1(0),LastEW2(0),LastEW3(0),LastEW4(0),LastEW5(0); vars: EW0MARK(0),EW1MARK(0),EW2MARK(0),EW3MARK(0),EW4MARK(0),EW5MARK(0),EW3ORDERMARK(0),ORDERMARK(0),ORDERANGLE(0),ORDERSKIP(0),ORDERPRICE(0),ORDERCOUNT(0),MinTakeProfitPtS(0); vars: MaxPrice(0),MinPrice(0),WaveAngle(0),tempval(0),tempval2(""); vars: EW1MARKTIME(0),EW2MARKTIME(0),EW3MARKTIME(0),EW4MARKTIME(0),EW5MARKTIME(0),EW5PRICE(0),ENTRYPRICE(0),LASTENTRYPRICE(0); vars: EW1MARKARROW(0),EW2MARKARROW(0),EW3MARKARROW(0),EW4MARKARROW(0),EW5MARKARROW(0); vars: EW1MARKBAR(0),EW2MARKBAR(0),EW3MARKBAR(0),EW4MARKBAR(0),EW5MARKBAR(0); vars: MaxPriceBar(0),MinPriceBar(0),BarsShift(0),BarsCount(0),init(0),prevbars(0),CalcBarDiff(0); vars: ParabolicSAR(0),SARAngle(0),MA(0),MA2(0),ShortMA(0),LongMA(0),TrailingStopPoint(0),Trace(0),MACD(0),ShortMACD(0),MACDAngle(0),ShortMACDAngle(0); vars: TradingPrice(0),TotalLots(0),TradesCount(0),StartDeposit(0),BuyStopLoss(0),SellStopLoss(0),BuyBidStopLoss(0),SellBidStopLoss(0); vars: BuyLimitStopLoss(0),SellLimitStopLoss(0),TrailingStopLoss(0),BidStopPts(0),BidLimitPts(0),OrderType(0),LastBidTime(0),BadOrder(0),CloseBadOrder(0); vars: LastBadTime(0),OrderRecovery(0),LastOp(0),LastOldOp(0),BuyOp(0),SellOp(0),EntryTrail(0),StopLossTrail(0); vars: Bears(0),Bulls(0),BearsAngle(0),BullsAngle(0); vars: Pivot(0),SupportLevel1(0),SupportLevel2(0),ResistanceLevel1(0),ResistanceLevel2(0); vars: tmpPivot(0),tmpSupportLevel1(0),tmpSupportLevel2(0),tmpResistanceLevel1(0),tmpResistanceLevel2(0); vars: RSI(0),CCI(0),ShortRSI(0),PriceLevel(0),LastPriceLevel(0),FiboLevel(0); vars: EWOscillator(0),EWLevel(0),ShortPeriod(0),LongPeriod(0),LastEW(0); if Bars < MaxBars * 2 + RetracementBars + 1 then exit; if init = 0 then { EW0MARK = 0; EW1MARK = 0; EW2MARK = 0; EW3MARK = 0; EW4MARK = 0; EW5MARK = 0; ORDERMARK = 0; TotalLots = Lots; prevbars = 0; if BidStopPts < BidStopPoints then BidStopPts = BidStopPoints; if BidLimitPts < BidLimitPoints then BidLimitPts = BidLimitPoints; BidStopPts = BidStopPts * Point; BidLimitPts = BidLimitPts * Point; StartDeposit = MinMoney; if StartDeposit = 0 then StartMoney=Balance else StartMoney = StartDeposit; Print(AccountName,"(#",AccountNumber,") ",Symbol," Elliot Wave Retracement analizer loaded."); init = 1; } if StopLoss > 0 then { BuyStopLoss=PriceAsk- StopLoss * Point; SellStopLoss=PriceBid + StopLoss * Point; BuyBidStopLoss = BuyStopLoss + BidstopPts; SellBidStopLoss = SellStopLoss - BidstopPts; BuyLimitStopLoss=PriceAsk - StopLoss * Point - BidLimitPts; SellLimitStopLoss=PriceBid + StopLoss * Point + BidLimitPts; } // Adjust remaining money in loss if Balance < StartMoney then { //StartMoney=Balance; TotalLots = Lots; } // Check if we have automated incremental Lots calculation if IncrementLots > 0 and (FreeMargin / StartMoney > 2) then { if MiniForexMode = 1 then TotalLots = Normalize(FreeMargin / StartMoney * Lots - 0.1,1); if MiniForexMode = 0 then TotalLots = Normalize(FreeMargin / StartMoney * Lots - 1,0); // forex type account cannot have part of lots if TotalLots < Lots then TotalLots = Lots; } /**************************************************** Indicators ********************************************************/ if Bars != prevbars // Save extra CPU when making signals because we do not have new price in chart in test mode then { Bears=iBearsPower(RetracementBars,MODE_HIGH,0); Bulls=iBullsPower(RetracementBars,MODE_LOW,0); RSI=iRSI(RetracementBars,0); CCI=iCCI(MaxBars,0); ShortRSI=iRSI(RetracementBars/5,0); ParabolicSAR=iSAR(SARstep,SARmax,0); MA=iMA(MaxBars,MODE_EMA,0); MA2=iMA(MaxBars,MODE_SMA,0); ShortMA=iMA(RetracementBars,MODE_EMA,0); LongMA=iMA(MaxBars*2,MODE_LWMA,0); MACD=iMACD(RetracementBars,MaxBars,RetracementBars,MODE_EMA,0); ShortMACD=iMACD(RetracementBars/5,RetracementBars,RetracementBars/5,MODE_EMA,0); MaxPriceBar = Highest (MODE_CLOSE,MaxBars+1, MaxBars*2); MinPriceBar = Lowest (MODE_CLOSE, MaxBars+1, MaxBars*2); if MaxPriceBar < MinPriceBar //and EW0MARK = 0 // first Elliot Wave would be UP then WaveAngle = 1; if MinPriceBar < MaxPriceBar //and EW0MARK = 0 // first Elliot Wave would be DOWN then WaveAngle = 2; MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if WaveAngle = 1 then FiboLevel = (MaxPrice - MinPrice) / (Open - MinPrice) * 100 else FiboLevel = (MaxPrice - MinPrice) / (MaxPrice - Open ) * 100; //LastPriceLevel=0; if Bars > prevbars then { ORDERANGLE = 0; Pivot=0; SupportLevel1=0; SupportLevel2=0; ResistanceLevel1=0; ResistanceLevel2=0; LastPriceLevel=PriceLevel; for counter=RetracementBars downto 0 Begin MaxPriceBar = Highest (MODE_CLOSE,MaxBars+1+counter, MaxBars); MinPriceBar = Lowest (MODE_CLOSE, MaxBars+1+counter, MaxBars); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; /* Pivot point (Pivot) = (H + L + C) / 3 First resistance level (R1) = (2 * P) - L First support level (S1) = (2 * P) - H Second resistance level (R2) = P + (R1 - S1) Second support level (S2) = P - (R1 - S1) H, L, C are the previous High, Low and Close. */ tmpPivot=(MaxPrice+MinPrice+Open[counter+MaxBars]) / 3; tmpResistanceLevel1=(2 * tmpPivot) - MinPrice; tmpSupportLevel1=(2 * tmpPivot) - MaxPrice; tmpResistanceLevel2=tmpPivot + (tmpResistanceLevel1 - tmpSupportLevel1); tmpSupportLevel2=tmpPivot - (tmpResistanceLevel1 - tmpSupportLevel1); Pivot=Pivot + tmpPivot; ResistanceLevel1=ResistanceLevel1 + tmpResistanceLevel1; SupportLevel1=SupportLevel1 + tmpSupportLevel1; ResistanceLevel2=ResistanceLevel2 + tmpResistanceLevel2; SupportLevel2=SupportLevel2 + tmpSupportLevel2; if counter < MaxBars then { Pivot=Pivot / 2; ResistanceLevel1=ResistanceLevel1 / 2; SupportLevel1=SupportLevel1 / 2; ResistanceLevel2=ResistanceLevel2 / 2; SupportLevel2=SupportLevel2 / 2; } End; if WaveAngle = 1 then PriceLevel = (Open / Point - SupportLevel2 / Point) / (ResistanceLevel2 / Point - SupportLevel2 / Point) * 100; if WaveAngle = 2 then PriceLevel = -(ResistanceLevel2 / Point - Open / Point) / (ResistanceLevel2 / Point - SupportLevel2 / Point) * 100 ; if PriceLevel >151 or PriceLevel < -151 then { ComputedPricesCount=Normalize(PriceLevel / 100,0); if ComputedPricesCount < 0 then ComputedPricesCount = -ComputedPricesCount; ComputedPricesCount=(2 + ComputedPricesCount) * MaxBars; //Print(TimeToStr(time[shift]),": ",Symbol," Price Level is over limit:",PriceLevel," Increasing Prices Count to:",ComputedPricesCount); if Bars <= ComputedPricesCount + MaxBars + 1 then exit;//Avoid out of range computing ORDERANGLE = 0; Pivot=0; SupportLevel1=0; SupportLevel2=0; ResistanceLevel1=0; ResistanceLevel2=0; for counter=RetracementBars downto 0 Begin MaxPriceBar = Highest (MODE_CLOSE,ComputedPricesCount+1+counter, ComputedPricesCount); MinPriceBar = Lowest (MODE_CLOSE, ComputedPricesCount+1+counter, ComputedPricesCount); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; /* Pivot point (Pivot) = (H + L + C) / 3 First resistance level (R1) = (2 * P) - L First support level (S1) = (2 * P) - H Second resistance level (R2) = P + (R1 - S1) Second support level (S2) = P - (R1 - S1) H, L, C are the previous High, Low and Close. */ tmpPivot=(MaxPrice+MinPrice+Open[counter+ComputedPricesCount]) / 3; tmpResistanceLevel1=(2 * tmpPivot) - MinPrice; tmpSupportLevel1=(2 * tmpPivot) - MaxPrice; tmpResistanceLevel2=tmpPivot + (tmpResistanceLevel1 - tmpSupportLevel1); tmpSupportLevel2=tmpPivot - (tmpResistanceLevel1 - tmpSupportLevel1); Pivot=Pivot + tmpPivot; ResistanceLevel1=ResistanceLevel1 + tmpResistanceLevel1; SupportLevel1=SupportLevel1 + tmpSupportLevel1; ResistanceLevel2=ResistanceLevel2 + tmpResistanceLevel2; SupportLevel2=SupportLevel2 + tmpSupportLevel2; if counter < MaxBars then { Pivot=Pivot / 2; ResistanceLevel1=ResistanceLevel1 / 2; SupportLevel1=SupportLevel1 / 2; ResistanceLevel2=ResistanceLevel2 / 2; SupportLevel2=SupportLevel2 / 2; } End; if WaveAngle = 1 then PriceLevel = (Open / Point - SupportLevel2 / Point) / (ResistanceLevel2 / Point - SupportLevel2 / Point) * 100; if WaveAngle = 2 then PriceLevel = -(ResistanceLevel2 / Point - Open / Point) / (ResistanceLevel2 / Point - SupportLevel2 / Point) * 100 ; } MoveObject("Pivot",OBJ_HLINE,Time,Pivot,Time[MaxBars],Pivot,White,1,STYLE_SOLID); MoveObject(" ResistanceLevel2",OBJ_HLINE,Time,ResistanceLevel2,Time[MaxBars],ResistanceLevel2,Blue,1,STYLE_SOLID); MoveObject(" SupportLevel2",OBJ_HLINE,Time,SupportLevel2,Time[MaxBars],SupportLevel2,Blue,1,STYLE_SOLID); MoveObject(" ResistanceLevel1",OBJ_HLINE,Time,ResistanceLevel1,Time[MaxBars],ResistanceLevel1,Red,1,STYLE_SOLID); MoveObject(" SupportLevel1",OBJ_HLINE,Time,SupportLevel1,Time[MaxBars],SupportLevel1,Red,1,STYLE_SOLID); if MaxPriceBar < MinPriceBar then MoveObject("Fibo",OBJ_FIBO,Time,ResistanceLevel2,Time[MaxBars],SupportLevel2,Green,1,STYLE_DOT) else MoveObject("Fibo",OBJ_FIBO,Time,SupportLevel2,Time[MaxBars],ResistanceLevel2,Green,1,STYLE_DOT); } /* if WaveAngle = 1 and PriceLevel > 0 and PriceLevel < 50 then WaveAngle = 2; if WaveAngle = 2 and PriceLevel < 0 and PriceLevel > -50 then WaveAngle = 1; */ /* if EW3MARK = 1 then { //Print("EW0MARK:",EW0MARK," EW1MARK:",EW1MARK," EW2MARK:",EW2MARK," EW3MARK:",EW3MARK," EW3MARKBAR=",EW3MARKBAR," EW4MARK:",EW4MARK," EW0:",EW5PRICE," EW1:",EW1," EW2:",EW2," EW3:",EW3); //Print("EW1MARKBAR:",EW1MARKBAR," EW2MARKBAR:",EW2MARKBAR," EW3MARKBAR:",EW3MARKBAR," EW3MARKBAR=",EW3MARKBAR," EW4MARK:",EW4MARK," EW0:",EW5PRICE," EW1:",EW1," EW2:",EW2," EW3:",EW3); Print(TimeToStr(time), ": EW0=",TimeToStr(EW5MARKTIME), " ",EW5, " EW1=",TimeToStr(EW1MARKTIME), " ",EW1, " EW2=",TimeToStr(EW2MARKTIME), " ",EW2, " EW3=",TimeToStr(EW3MARKTIME), " ",EW3 ); } */ // Reallign Elliot Wave marked bars if EW0MARK > 0 then EW5MARKBAR = 0; if EW1MARK > 0 then EW1MARKBAR = 0; if EW2MARK > 0 then EW2MARKBAR = 0; if EW3MARK > 0 then EW3MARKBAR = 0; if EW4MARK > 0 then EW4MARKBAR = 0; if EW5MARK > 0 then EW5MARKBAR = 0; if EW0MARK > 0 or EW5MARK > 0 then for counter = 0 to Bars -1 { if EW5MARKBAR > 0 then break; // reallign finished tempval = time[counter]; if EW5MARK = 0 and tempval = EW5MARKTIME then EW5MARKBAR = counter; if EW1MARK > 0 and tempval = EW1MARKTIME then EW1MARKBAR = counter; if EW2MARK > 0 and tempval = EW2MARKTIME then EW2MARKBAR = counter; if EW3MARK > 0 and tempval = EW3MARKTIME then EW3MARKBAR = counter; if EW4MARK > 0 and tempval = EW4MARKTIME then EW4MARKBAR = counter; if EW5MARK > 0 and tempval = EW5MARKTIME then EW5MARKBAR = counter; } CalcBarDiff=(time[0]-time[Bars-1])/60/Period - Bars + 1; if Bars < MaxBars+2 or (EW1MARK = 1 and EW1MARKBAR = 0) or (EW2MARK = 1 and EW2MARKBAR = 0) or (EW3MARK = 1 and EW3MARKBAR = 0) or (EW4MARK = 1 and EW4MARKBAR = 0) or (EW0MARK = 1 and EW5MARKBAR = 0) or (EW5MARK = 1 and EW5MARKBAR = 0) or EW1MARKBAR > Bars - 1 or EW2MARKBAR > Bars - 1 or EW3MARKBAR > Bars - 1 or EW4MARKBAR > Bars - 1 or EW5MARKBAR > Bars - 1 then { if Bars > MaxBars+2 and prevbars < Bars then { //prevbars=Bars; /* Print("Bars:",Bars," EW1MARKBAR:",EW1MARKBAR," EW2MARKBAR:",EW2MARKBAR," EW3MARKBAR:",EW3MARKBAR," EW3MARKBAR=",EW3MARKBAR," EW4MARKBAR:",EW4MARKBAR," EW5MARKBAR:",EW5MARKBAR); Print(TimeToStr(time), ": EW0=",TimeToStr(EW5MARKTIME), " ",EW5, " EW1=",TimeToStr(EW1MARKTIME), " ",EW1, " EW2=",TimeToStr(EW2MARKTIME), " ",EW2, " EW3=",TimeToStr(EW3MARKTIME), " ",EW3 ); //print(time[1]," ",time[Bars-1]," ",time[100]," ",time[1]-time[Bars-1]," ",(time[1]-time[Bars-1])/60/Period, " ", time[0] - EW5MARKTIME); */ if EW0MARK = 1 and EW1MARK = 0 then print("ERROR: Bars:",Bars-1," EW0 Bar:", EW5MARKBAR, " EW0 Time:",TimeToStr(EW5MARKTIME), " Calculated EW0 Time:",TimeToStr(time[EW5MARKBAR])," EW0 Bars Diff:",(EW5MARKTIME-time[EW5MARKBAR])/60/Period); if EW1MARK = 1 and EW2MARK = 0 then print("ERROR: Bars:",Bars-1," EW1 Bar:", EW1MARKBAR, " EW1 Time:",TimeToStr(EW1MARKTIME), " Calculated EW1 Time:",TimeToStr(time[EW1MARKBAR])," EW1 Bars Diff:",(EW1MARKTIME-time[EW1MARKBAR])/60/Period); if EW2MARK = 1 and EW3MARK = 0 then print("ERROR: Bars:",Bars-1," EW2 Bar:", EW2MARKBAR, " EW2 Time:",TimeToStr(EW2MARKTIME), " Calculated EW2 Time:",TimeToStr(time[EW2MARKBAR])," EW2 Bars Diff:",(EW2MARKTIME-time[EW2MARKBAR])/60/Period); if EW3MARK = 1 and EW4MARK = 0 then print("ERROR: Bars:",Bars-1," EW3 Bar:", EW3MARKBAR, " EW3 Time:",TimeToStr(EW3MARKTIME), " Calculated EW3 Time:",TimeToStr(time[EW3MARKBAR])," EW3 Bars Diff:",(EW3MARKTIME-time[EW3MARKBAR])/60/Period); if EW4MARK = 1 and EW5MARK = 0 then print("ERROR: Bars:",Bars-1," EW4 Bar:", EW4MARKBAR, " EW4 Time:",TimeToStr(EW4MARKTIME), " Calculated EW4 Time:",TimeToStr(time[EW4MARKBAR])," EW4 Bars Diff:",(EW4MARKTIME-time[EW4MARKBAR])/60/Period); if EW5MARK = 1 and EW0MARK = 0 then print("ERROR: Bars:",Bars-1," EW5 Bar:", EW5MARKBAR, " EW5 Time:",TimeToStr(EW5MARKTIME), " Calculated EW5 Time:",TimeToStr(time[EW5MARKBAR])," EW5 Bars Diff:",(EW5MARKTIME-time[EW5MARKBAR])/60/Period); } EW0MARK=0; EW1MARK=0; EW1=0; EW1MARKTIME=0; EW1MARKBAR=0; EW2MARK=0; EW2=0; EW2MARKTIME=0; EW2MARKBAR=0; EW3MARK=0; EW3=0; EW3MARKTIME=0; EW3MARKBAR=0; EW4MARK=0; EW4=0; EW4MARKTIME=0; EW4MARKBAR=0; EW5MARK=0; EW5=0; EW5MARKTIME=0; EW5MARKBAR=0; ORDERMARK=0; exit; } if EW0MARK = 0 and EW1MARK = 0 then { EW0MARK = 0; EW1MARK = 0; EW1MARKBAR = 0; EW1MARKTIME = 0; EW2MARK = 0; EW2MARKBAR = 0; EW2MARKTIME = 0; EW3MARK = 0; EW3MARKBAR = 0; EW3MARKTIME = 0; EW4MARK = 0; EW4MARKBAR = 0; EW4MARKTIME = 0; EW5MARK = 0; EW5MARKBAR = 0; EW5MARKTIME = 0; } MaxPriceBar = Highest (MODE_CLOSE,MaxBars+1, MaxBars); MinPriceBar = Lowest (MODE_CLOSE, MaxBars+1, MaxBars); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; //MaxPriceBar=time[MaxPriceBar]; //MinPriceBar=time[MinPriceBar]; if EW0MARK = 1 and EW2MARK = 0 and EW3MARK = 0 // Recalculate EW entry point while have only Elliot Wave [I] then { MaxPriceBar = Highest (MODE_CLOSE,MaxBars+1, MaxBars); MinPriceBar = Lowest (MODE_CLOSE, MaxBars+1, MaxBars); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if (WaveAngle = 1 and MinPrice < EW5PRICE) or (WaveAngle = 2 and MaxPrice > EW5PRICE) then { if EW5MARKBAR <= MaxBars then { DelArrow(EW5MARKTIME,EW5PRICE + StopLoss / 2 * Point); DelArrow(EW5MARKTIME,EW5PRICE - StopLoss / 2 * Point); } EW0MARK=0; } } /* if WaveAngle = 1 and Close[counter] > MaxPrice then print("Counter:",counter, " MaxPrice:",MaxPrice); if WaveAngle = 2 and Close[counter] < MaxPrice then print("Counter:",counter, " MinPrice:",MinPrice); /* //Reallign Elliot wave entry point if WaveAngle = 1 and MaxPriceBar < RetracementBars then WaveAngle = 2 else if WaveAngle = 2 and MinPriceBar < RetracementBars then WaveAngle = 1; */ //print("PriceLevel:",PriceLevel); if (EW0MARK = 0) //or (MaxPriceBar > MinPriceBar and WaveAngle = 1) //or (MaxPriceBar < MinPriceBar and WaveAngle = 2) then { EW0MARK=1; EW1MARK=0; EW2MARK=0; EW3MARK=0; EW4MARK=0; EW5MARK=0; if WaveAngle = 1 // try to mark first Elliot Wave then { EW5=MinPrice; EW5MARKBAR=MinPriceBar; EW5MARKTIME=time[MinPriceBar]; EW5PRICE=MinPrice; EW1=MinPrice; //SetArrow(EW5MARKTIME,EW5PRICE,128,White); SetArrow(EW5MARKTIME,EW5PRICE - StopLoss / 2 * Point,384,White); Comment("\nEWTrend=Possible UP", "\nLastTime=",TimeToStr(time[0]), "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print(Symbol," EW0 Time:",TimeToStr(EW5MARKTIME),": EW0:",EW5," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } if WaveAngle = 2 // try to mark first reversed Elliot Wave then { EW5=MaxPrice; EW5MARKBAR=MaxPriceBar; EW5MARKTIME=time[MaxPriceBar]; EW5PRICE=MaxPrice; EW1=MaxPrice; //SetArrow(EW5MARKTIME,EW5PRICE,128,Violet); SetArrow(EW5MARKTIME,EW5PRICE + StopLoss / 2 * Point,384,Violet); Comment("\nEWTrend=Possible DOWN", "\nLastTime=",TimeToStr(time[0]), "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print(Symbol," EW0 Time:",TimeToStr(EW5MARKTIME),": EW0:",EW5," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } //print ("waveangle=",WaveAngle); } //if IsTesting and EW3MARK = 1 then print("EW0MARK:",EW0MARK," EW1MARK:",EW1MARK," EW2MARK:",EW2MARK," EW3MARK:",EW3MARK," EW4MARK:",EW4MARK); BarsShift=EW5MARKBAR; /* if EW5MARKBAR > MaxBars then // reset EW count start entry { EW0MARK=0; if WaveAngle = 1 then DelArrow(EW5MARKTIME,EW5PRICE + StopLoss / 2 * Point); if WaveAngle = 2 then DelArrow(EW5MARKTIME,EW5PRICE - StopLoss / 2 * Point); } */ if EW0MARK=1 and EW2MARK=0 and EW3MARK=0 // and EW5MARKBAR > BarsCount then for counter=BarsShift - 1 downto 1 Begin BarsCount = BarsShift - counter; MaxPriceBar = Highest (MODE_CLOSE,EW5MARKBAR , BarsCount); MinPriceBar = Lowest (MODE_CLOSE,EW5MARKBAR , BarsCount); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if WaveAngle = 1 and MaxPrice > EW1 and MaxPriceBar < EW5MARKBAR then { EW1 = MaxPrice; if EW1MARKBAR <= MaxBars then DelArrow(EW1MARKTIME , Open[counter] + StopLoss / 2 * Point); EW1MARKTIME=time[MaxPriceBar]; //print("EW1=",EW1); } if WaveAngle = 2 and MinPrice < EW1 and MinPriceBar < EW5MARKBAR then { if EW1MARKBAR <= MaxBars then DelArrow(EW1MARKTIME , Open[counter] - StopLoss / 2 * Point); EW1MARKTIME=time[MinPriceBar]; EW1 = MinPrice; //print("EW1=",EW1); } /* if IsTesting and (counter = BarsShift-1 or counter = 1) then { if WaveAngle = 1 then print("BarCount:",BarsCount ," Counter:",counter," Price:",Close[counter]," MaxPrice: ",MaxPrice," MaxPriceBar:",MaxPriceBar); if WaveAngle = 2 then print("BarCount:",BarsCount ," Counter:",counter," Price:",Close[counter]," MinPrice:",MinPrice," MinPriceBar:",MinPriceBar); print("Bars:",Bars-1," EW0 Bar:", EW5MARKBAR, " EW0 Time:",TimeToStr(EW5MARKTIME), " Calculated EW0 Time:",TimeToStr(time[EW5MARKBAR])," EW0 Bars Diff:",(EW5MARKTIME-time[EW5MARKBAR])/60/Period); print("Bars:",Bars-1," EW1 Bar:", EW1MARKBAR, " EW1 Time:",TimeToStr(EW1MARKTIME), " Calculated EW1 Time:",TimeToStr(time[EW1MARKBAR])," EW1 Bars Diff:",(EW1MARKTIME-time[EW1MARKBAR])/60/Period); print("WaveAngle:",WaveAngle," EW1MARK:",EW1MARK," EW0:",EW5PRICE," EW1:",EW1); } */ if WaveAngle = 1 and Close[EW5MARKBAR] + NoisePips * Point < Close[counter] and MaxPrice <= Close[counter] and EW1 > Close[EW5MARKBAR] + NoisePips * Point and EW1 <= close[counter] then { if EW1MARKBAR <= MaxBars then DelArrow(EW1MARKTIME , Open[counter] + StopLoss / 2 * Point); if Close[counter] > MaxPrice then { EW1 = Close[counter]; EW1MARKTIME=time[counter]; } EW1MARK=1; EW2=EW1; EW1MARKTIME=time[counter]; EW1MARKBAR=counter; //SetArrow(EW1MARKTIME,Open[counter] + StopLoss / 2 * Point,129,White); Comment("\nEWTrend=Possible UP", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print("EW1 Time:",TimeToStr(EW1MARKTIME),": EW1:",EW1," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } if WaveAngle = 2 and Close[EW5MARKBAR] - NoisePips * Point > Close[counter] and MinPrice >= Close[counter] and EW1 < Close[EW5MARKBAR] - NoisePips * Point and EW1 >= close[counter] then { if EW1MARKBAR <= MaxBars then DelArrow(EW1MARKTIME , Open[counter] - StopLoss / 2 * Point); if Close[counter] < MinPrice then { EW1 = Close[counter]; EW1MARKTIME=time[counter]; } EW1MARK=1; EW2=EW1; EW1MARKBAR=counter; //SetArrow(EW1MARKTIME,Open[counter] - StopLoss / 2 * Point,129,Violet); Comment("\nEWTrend=Possible DOWN", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print("EW1 Time:",TimeToStr(EW1MARKTIME),": EW1:",EW1," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } if EW1MARK = 1 and counter < EW1MARKBAR and (WaveAngle = 1 and Close[counter] < EW1 - NoisePips * Point or (WaveAngle = 2 and Close[counter] > EW1 + NoisePips * Point)) then // Wave 1 ended { EW3MARK=1; break; } End; if EW0MARK=1 and EW2MARK=0 and EW3MARK=1 then { EW3MARK=0; if WaveAngle = 1 then { if EW1MARKBAR <= MaxBars then DelArrow(EW1MARKTIME, EW1 + StopLoss / 2 * Point); SetArrow(EW1MARKTIME, EW1 + StopLoss / 2 * Point,129,White); } else { if EW1MARKBAR <= MaxBars then DelArrow(EW1MARKTIME, EW1 - StopLoss / 2 * Point); SetArrow(EW1MARKTIME, EW1 - StopLoss / 2 * Point,129,Violet); } } BarsShift=EW1MARKBAR; if Bars < BarsShift then exit; // Check for failed Elliot Wave 1 if (EW3MARK=0 and EW1MARK=1 and EW2MARK=0 and WaveAngle = 1 and EW1 < EW5PRICE - NoisePips * Point) or (EW3MARK=0 and EW1MARK=1 and EW2MARK=0 and WaveAngle = 2 and EW1 > EW5PRICE + NoisePips * Point) then { for counter=1 to EW5MARKBAR { DelArrow(time[counter] , Close[counter] + StopLoss / 2 * Point); DelArrow(time[counter] , Close[counter] - StopLoss / 2 * Point); } EW0MARK=0; EW1MARK=0; EW2MARK=0; EW3MARK=0; EW4MARK=0; EW5MARK=0; } if EW1MARK=1 and EW3MARK=0 then for counter=BarsShift - 1 downto 1 Begin BarsCount = BarsShift - counter; MaxPriceBar = Highest (MODE_CLOSE,EW1MARKBAR , BarsCount); MinPriceBar = Lowest (MODE_CLOSE,EW1MARKBAR , BarsCount); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if WaveAngle = 1 and MinPrice < EW2 and MinPriceBar < EW5MARKBAR then { if EW2MARKBAR <= MaxBars then DelArrow(EW2MARKTIME , Open[counter] - StopLoss / 2 * Point); EW2 = MinPrice; EW2MARKTIME=time[MinPriceBar]; } if WaveAngle = 2 and MaxPrice > EW2 and MaxPriceBar < EW5MARKBAR then { if EW2MARKBAR <= MaxBars then DelArrow(EW2MARKTIME , Open[counter] + StopLoss / 2 * Point); EW2 = MaxPrice; EW2MARKTIME=time[MaxPriceBar]; } if WaveAngle = 1 and Close[EW1MARKBAR] - NoisePips * Point > Close[counter] and MinPrice >= Close[counter] and EW2 < Close[EW1MARKBAR] - NoisePips * Point and EW2 > close[counter] then { if EW2MARKBAR <= MaxBars then DelArrow(EW2MARKTIME , Open[counter] - StopLoss / 2 * Point); if Close[counter] < MinPrice then { EW2 = Close[counter]; EW2MARKTIME=time[counter]; } EW3=EW2; EW2MARK=1; EW2MARKBAR=counter; EW3MARKBAR=EW2MARKBAR; //SetArrow(EW2MARKTIME,Open[counter] - StopLoss / 2 * Point,130,White); Comment("\nEWTrend=Possible UP", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print("EW2 Time:",TimeToStr(EW2MARKTIME),": EW2:",EW2," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } if WaveAngle = 2 and Close[EW1MARKBAR] + NoisePips * Point < Close[counter] and MaxPrice <= Close[counter] and EW2 > Close[EW1MARKBAR] + NoisePips * Point and EW2 < close[counter] then { if EW2MARKBAR <= MaxBars then DelArrow(EW2MARKTIME , Open[counter] + StopLoss / 2 * Point); if Close[counter] > MaxPrice then { EW2 = Close[counter]; EW2MARKTIME=time[counter]; } EW3=EW2; EW2MARK=1; EW2MARKBAR=counter; EW3MARKBAR=EW2MARKBAR; //SetArrow(EW2MARKTIME,Open[counter] + StopLoss / 2 * Point,130,Violet); Comment("\nEWTrend=Possible DOWN", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print("EW2 Time:",TimeToStr(EW2MARKTIME),": EW2:",EW2," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } // Check for failed Elliot Wave 2 if (EW3MARK=0 and EW2MARK=1 and WaveAngle = 1 and EW2 < EW5 - NoisePips * Point) or (EW3MARK=0 and EW2MARK=1 and WaveAngle = 2 and EW2 > EW5 + NoisePips * Point) then { for counter=1 to EW5MARKBAR { DelArrow(time[counter] , Close[counter] + StopLoss / 2 * Point); DelArrow(time[counter] , Close[counter] - StopLoss / 2 * Point); } EW0MARK=0; EW1MARK=0; EW2MARK=0; EW3MARK=0; EW4MARK=0; EW5MARK=0; Comment("\nEWTrend=Recalculating..", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nEW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); /* Print(TimeToStr(time),": ",Symbol," Elliot Wave 2 failed, reverting retracement trend vector. "); Print("Old EW0=",TimeToStr(EW5MARKTIME), " ",EW5, " EW1=",TimeToStr(EW1MARKTIME), " ",EW1, " EW2=",TimeToStr(EW2MARKTIME), " ",EW2, " EW3=",TimeToStr(EW3MARKTIME), " ",EW3 ); */ /* MaxPriceBar = Highest (MODE_CLOSE,EW1MARKBAR + MaxBars+1 ,MaxBars); MinPriceBar = Lowest (MODE_CLOSE,EW1MARKBAR + MaxBars+1 ,MaxBars); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; tempval=EW5; EW3=EW2; EW2=EW1; if WaveAngle = 1 then EW5 = MinPrice; if WaveAngle = 2 then EW5 = MaxPrice; EW5PRICE=EW5; EW1=tempval; tempval=EW5MARKTIME; if WaveAngle = 1 then EW5MARKTIME = time[MinPriceBar]; if WaveAngle = 2 then EW5MARKTIME = time[MaxPriceBar]; EW3MARKTIME=EW2MARKTIME; EW2MARKTIME=EW1MARKTIME; EW1MARKTIME=tempval; tempval=EW5MARKBAR; if WaveAngle = 1 then EW5MARKBAR = MinPriceBar; if WaveAngle = 2 then EW5MARKBAR = MaxPriceBar; EW5MARKBAR=EW1MARKBAR; EW3MARKBAR=EW2MARKBAR; EW2MARKBAR=EW1MARKBAR; EW1MARKBAR=tempval; if Bars < EW1MARKBAR + MaxBars+1 then // Check if we have not enough prices for estimating EW0 { EW5=Close[Bars-1]; EW5PRICE=EW5; EW5MARKTIME=time[Bars-1]; EW5MARKBAR=Bars-1; } EW4=0; EW4MARKTIME=0; //print(TimeToStr(time),": ",TimeToStr(EW5MARKTIME)," ",EW5MARKBAR," ",EW5 + StopLoss / 2 * Point); //print(time, " ",EW1MARKTIME," ",EW5MARKTIME," ",Period); //print(TimeToStr(time), " ",TimeToStr(EW1MARKTIME)," ",TimeToStr(EW5MARKTIME)," ",Period); if WaveAngle = 1 then { // WaveAngle = 2; Comment("\nEWTrend=Recalculating..", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nEW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); SetArrow(EW5MARKTIME,EW5 + StopLoss / 2 * Point,128,Violet); SetArrow(EW1MARKTIME,EW1 - StopLoss / 2 * Point,129,Violet); SetArrow(EW2MARKTIME,EW2 + StopLoss / 2 * Point,130,Violet); SetArrow(EW3MARKTIME,EW3 - StopLoss / 2 * Point,131,Violet); } else { // WaveAngle = 1; Comment("\nEWTrend=Recalculating..", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nEW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); SetArrow(EW5MARKTIME,EW5 - StopLoss / 2 * Point,128,White); SetArrow(EW1MARKTIME,EW1 + StopLoss / 2 * Point,129,White); // print(TimeToStr(EW1MARKTIME)," ",TimeToStr(time[EW1MARKBAR])," ",EW1 + StopLoss / 2 * Point); // Print("EW0 Time:",TimeToStr(EW5MARKTIME),": EW0:",EW5," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); SetArrow(EW2MARKTIME,EW2 - StopLoss / 2 * Point,130,White); SetArrow(EW3MARKTIME,EW3 + StopLoss / 2 * Point,131,White); } /* Print("\nEWTrend=Recalculating..", "EW0=",TimeToStr(EW5MARKTIME), " ",EW5, " EW1=",TimeToStr(EW1MARKTIME), " ",EW1, " EW2=",TimeToStr(EW2MARKTIME), " ",EW2, " EW3=",TimeToStr(EW3MARKTIME), " ",EW3, " Pivot ",Pivot, " Resistance Level I ",ResistanceLevel1, " Support Level I ",SupportLevel1, " Resistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); */ break; } End; if EW2MARK=1 and EW3MARK=0 then { if WaveAngle = 2 then { if EW2MARKBAR <= MaxBars then DelArrow(EW2MARKTIME, EW2 + StopLoss / 2 * Point); SetArrow(EW1MARKTIME, EW1 - StopLoss / 2 * Point,129,Violet); SetArrow(EW2MARKTIME, EW2 + StopLoss / 2 * Point,130,Violet); } else { if EW2MARKBAR <= MaxBars then DelArrow(EW2MARKTIME, EW2 - StopLoss / 2 * Point); SetArrow(EW1MARKTIME, EW1 + StopLoss / 2 * Point,129,White); SetArrow(EW2MARKTIME, EW2 - StopLoss / 2 * Point,130,White); } } BarsShift=EW1MARKBAR; if Bars < BarsShift then exit; if EW2MARK = 1 and EW4MARK = 0 // and EW4MARK = 0 then for counter=BarsShift - 1 downto 1 Begin BarsCount = BarsShift - counter; MaxPriceBar = Highest (MODE_CLOSE,EW1MARKBAR , BarsCount); MinPriceBar = Lowest (MODE_CLOSE,EW1MARKBAR , BarsCount); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if WaveAngle = 1 and MaxPrice > EW3 and MaxPriceBar < EW2MARKBAR then { EW3 = MaxPrice; EW3MARKTIME=time[MaxPriceBar]; EW3MARKBAR=MaxPriceBar; if EW3MARKBAR <= MaxBars then DelArrow(EW3MARKTIME , Open[counter] + StopLoss / 2 * Point); //print("EW3=",EW3); } if WaveAngle = 2 and MinPrice < EW3 and MinPriceBar < EW2MARKBAR then { if EW3MARKBAR <= MaxBars then DelArrow(EW3MARKTIME , Open[counter] - StopLoss / 2 * Point); EW3MARKTIME=time[MinPriceBar]; EW3MARKBAR=MinPriceBar; EW3 = MinPrice; //print("EW3=",EW3); } /* if IsTesting and (counter = BarsShift-1 or counter = 1) then { if WaveAngle = 1 then print("BarCount:",BarsCount ," Counter:",counter," Price:",Close[counter]," MaxPrice: ",MaxPrice," MaxPriceBar:",MaxPriceBar); if WaveAngle = 2 then print("BarCount:",BarsCount ," Counter:",counter," Price:",Close[counter]," MinPrice:",MinPrice," MinPriceBar:",MinPriceBar); print("Bars:",Bars-1," EW2 Bar:", EW2MARKBAR, " EW2 Time:",TimeToStr(EW2MARKTIME), " Calculated EW2 Time:",TimeToStr(time[EW2MARKBAR])," EW2 Bars Diff:",(EW2MARKTIME-time[EW2MARKBAR])/60/Period); print("Bars:",Bars-1," EW3 Bar:", EW3MARKBAR, " EW3 Time:",TimeToStr(EW3MARKTIME), " Calculated EW3 Time:",TimeToStr(time[EW3MARKBAR])," EW3 Bars Diff:",(EW3MARKTIME-time[EW3MARKBAR])/60/Period); print("WaveAngle:",WaveAngle," EW3MARK:",EW3MARK," EW4MARK:",EW4MARK," EW0:",EW5PRICE," EW1:",EW1," EW2:",EW2," EW3:",EW3); } /* if WaveAngle = 1 and Close[counter] > MaxPrice then print("Counter:",counter, " MaxPrice:",MaxPrice); if WaveAngle = 2 and Close[counter] < MaxPrice then print("Counter:",counter, " MinPrice:",MinPrice); */ if WaveAngle = 1 and EW1 + NoisePips * Point < Close[counter] and MaxPrice <= Close[counter] and EW3 > EW2 + NoisePips * Point and EW3 < close[counter] then { if EW3MARKBAR <= EW5MARKBAR then DelArrow(EW3MARKTIME , Open[counter] + StopLoss / 2 * Point); EW3 = Close[counter]; EW3MARKTIME=time[counter]; EW3MARK=1; EW4=EW3; EW3MARKBAR=counter; //SetArrow(time[counter],Open[counter] + StopLoss / 2 * Point,131,White); //print("EW0 date:",TimeToStr(EW5MARKTIME)," EW1 date:",TimeToStr(EW1MARKTIME)," EW2 date:",TimeToStr(EW2MARKTIME)," EW3 date:",TimeToStr(EW3MARKTIME)); Comment("\nEWTrend=UP", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nEW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print("EW3 Time:",TimeToStr(EW3MARKTIME),": EW3:",EW3," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } if WaveAngle = 2 and EW1 - NoisePips * Point > Close[counter] and MinPrice >= Close[counter] and EW3 < EW2 - NoisePips * Point and EW3 > close[counter] then { if EW3MARKBAR <= EW5MARKBAR then DelArrow(EW3MARKTIME , Open[counter] - StopLoss / 2 * Point); EW3 = Close[counter]; EW3MARKTIME=time[counter]; EW3MARK=1; EW4=EW3; EW4MARKTIME=time[counter]; EW3MARKBAR=counter; //SetArrow(time[counter],Open[counter],131,Violet); Comment("\nEWTrend=DOWN", "\nEW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nEW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nEW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nEW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); //Print("EW3 Time:",TimeToStr(EW3MARKTIME),": EW3:",EW3," WaveAngle:",WaveAngle," MaxPriceBar:",MaxPriceBar," MinPriceBar:",MinPriceBar); } /* if EW3MARK = 1 and counter < EW3MARKBAR and (WaveAngle = 1 and Close[counter] < EW3 - NoisePips * Point or (WaveAngle = 2 and Close[counter] > EW3 + NoisePips * Point)) then // Wave 1 ended { EW4MARK=1; break; } */ End; //Check if we have failed EW 3 and it falls bellow EW Wave 1 if (EW3MARK=1 and WaveAngle = 1 and Open < EW2) or (EW3MARK=1 and WaveAngle = 2 and Open > EW2) then { Comment("\nEWTrend=Recalculating..", "\nLast EW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nLast EW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nLast EW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nLast EW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); EW0MARK=0; EW1MARK=0; EW2MARK=0; EW3MARK=0; EW4MARK=0; EW5MARK=0; ORDERMARK=0; for counter=1 to EW2MARKBAR { if close[counter] = EW3 then { DelArrow(time[counter] , Close[counter] + StopLoss / 2 * Point); DelArrow(time[counter] , Close[counter] - StopLoss / 2 * Point); break; } } if WaveAngle = 1 then SetArrow(time,Ask,251,Red); if WaveAngle = 2 then SetArrow(time,Bid,251,Red); LastEW5=EW5Price; LastEW1=EW1; LastEW2=EW2; LastEW3=EW3; //Print(TimeToStr(time),": ",Symbol," Elliot Wave 3 failed, recalculating EW0..."); } if EW3MARK = 1 and EW4MARK = 0 then { EWOscillator = iCustom("ElliotOscillator",EWPeriod,0,RetracementBars,MODE_FIRST,0); EWLevel = iCustom("ElliotWaves",EWPeriod,0,RetracementBars,MODE_FIRST,0); } if EWOscillator != 0 and EWLevel != 0 and EW3MARK = 1 and EW4MARK = 0 then { //print("EW0MARK:",EW0MARK," EW1MARK:",EW1MARK," EW2MARK:",EW2MARK," EW3MARK:",EW3MARK," EW4MARK:",EW4MARK); //Print(TimeToStr(time[0]),": EW1MARKBAR:",EW1MARKBAR," EW2MARKBAR:",EW2MARKBAR," EW3MARKBAR:",EW3MARKBAR," EW3MARKBAR=",EW3MARKBAR," EW4MARK:",EW4MARK); Print(TimeToStr(time[0]),": EW3 START - Open:",Open," EW0:",EW5PRICE," EW1:",EW1," EW2:",EW2," EW3:",EW3," WaveAngle:",WaveAngle," Price Level:",PriceLevel," Last Price Level:",LastPriceLevel," Max/Min Level:",FiboLevel); Print(TimeToStr(time[0]),": EW3 START - Pivot:",Pivot," Resistance Level I:",ResistanceLevel1," Support Level I:",SupportLevel1," Resistance Level II:",ResistanceLevel2," Support Level II:",SupportLevel2); EW3ORDERMARK=0; LastOp=0; if EW3 > Pivot then { if EW3MARKBAR <= MaxBars then DelArrow(EW3MARKTIME, EW3 + StopLoss / 2 * Point); SetArrow(EW3MARKTIME, EW3 + StopLoss / 2 * Point,131,White); DelArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point); if EW3 > ResistanceLevel1 and FiboLevel > 99 and ResistanceLevel2 - ResistanceLevel1 < SupportLevel1 - SupportLevel2 and BullsAngle = 1 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,246,White); //UP EW3ORDERMARK=1; LastOp=1; } else if EW3 > ResistanceLevel1 and FiboLevel > 100 and FiboLevel < 130 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,White); // UP EW3ORDERMARK=1; LastOp=2; } else if EW2 > SupportLevel1 and FiboLevel > 80 and FiboLevel < 130 and PriceLevel > 65 then { if Open > (MaxPrice + MinPrice) * 2 / 3 or (MACDAngle = 2 and FiboLevel > 100) then { if PriceLevel > 87.5 // Murrey 7/8 support/resistance line //and FiboLevel < 112.5 // Murrey 8/8+1 support/resistance line and BullsAngle = 1 and BearsAngle = 1 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,White); // UP EW3ORDERMARK=3; LastOp=3; } else { if MA < LongMA then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,White); // UNSTABLE UP EW3ORDERMARK=1; LastOp=4; } else { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,SkyBlue); // UNSTABLE DOWN, POSSIBLE UP EW3ORDERMARK=2; LastOp=5; }; }; } else if FiboLevel > 100 // Over Murrey 8/8 support/resistance line then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,SkyBlue); // POSSIBLE UP EW3ORDERMARK=1; LastOp=6; } else if FiboLevel = 100 // Murrey 8/8 support/resistance line then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,SkyBlue); // POSSIBLE RESIST DOWN EW3ORDERMARK=12; LastOp=7; }; } else if FiboLevel > 70 and FiboLevel < 150 and PriceLevel < 60 //and Bid > EW3 + Slippage * Point then { if (FiboLevel = 100) // Murrey 8/8 support/resistance line and MACDAngle = 1 then { SetArrow(EW3MARKTIME, EW3 - (StopLoss / 2 + NoisePips) * Point,196,SkyBlue); //TEMP UP, REVERT TO DOWN EW3ORDERMARK=13; LastOp=8; } else { SetArrow(EW3MARKTIME, EW3 - (StopLoss / 2 + NoisePips) * Point,198,White); //UP EW3ORDERMARK=3; LastOp=9; } } else if PriceLevel > 65 and MA < Open then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,White); // DOWN EW3ORDERMARK=4; LastOp=10; }; } else { if EW3MARKBAR <= MaxBars then DelArrow(EW3MARKTIME, EW3 - StopLoss / 2 * Point); SetArrow(EW3MARKTIME, EW3 - StopLoss / 2 * Point,131,Violet); DelArrow(EW3MARKTIME, EW3 - (StopLoss / 2 + NoisePips) * Point); if EW3 < SupportLevel1 and FiboLevel > 99 and ResistanceLevel2 - ResistanceLevel1 < SupportLevel1 - SupportLevel2 and BearsAngle = 2 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,248,Violet); // DOWN EW3ORDERMARK=11; LastOp=21; } else if EW3 < SupportLevel1 and FiboLevel < 130 and FiboLevel > 100 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,Violet); // DOWN EW3ORDERMARK=11; LastOp=22; } else if EW2 < ResistanceLevel1 and FiboLevel > 80 and FiboLevel < 130 and PriceLevel < -65 then { if Open < (MaxPrice + MinPrice) * 3 / 2 or (MACDAngle = 2 and FiboLevel > 100) then { if PriceLevel < -87.5 // Murrey 7/8 support/resistance line //and FiboLevel < 112/5 // Murrey 8/8+1 support/resistance line and BullsAngle = 2 and BearsAngle = 2 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,Violet); // DOWN EW3ORDERMARK=13; LastOp=23; } else { if MA > LongMA then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,Violet); // UNSTABLE DOWN EW3ORDERMARK=11; LastOp=24; } else { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,OrangeRed); // UNSTABLE UP, POSSIBLE DOWN EW3ORDERMARK=12; LastOp=25; }; }; } else if FiboLevel > 100 // Over Murrey 8/8 support/resistance line then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,202,OrangeRed); // POSSIBLE DOWN EW3ORDERMARK=11; LastOp=26; } else if FiboLevel = 100 // Murrey 8/8 support/resistance line then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,OrangeRed); // POSSIBLE RESIST AND UP EW3ORDERMARK=2; LastOp=27; }; } else if FiboLevel > 70 and FiboLevel < 150 and PriceLevel > -60 //and Ask < EW3 - Slippage * Point then { if (FiboLevel = 100) // Murrey 8/8 support/resistance line and MACDAngle = 2 then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,198,OrangeRed); //TEMP DOWN, REVERT TO UP EW3ORDERMARK=3; LastOp=28; } else { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,196,Violet); //DOWN EW3ORDERMARK=13; LastOp=29; } } else if PriceLevel < -65 and MA > Open then { SetArrow(EW3MARKTIME, EW3 + (StopLoss / 2 + NoisePips) * Point,200,Violet); // UP EW3ORDERMARK=14; LastOp=30; }; } EW4MARK=1; EW4MARKTIME=EW3MARKTIME; EW4MARKBAR=EW3MARKBAR; } if EW3MARK=1 and ((WaveAngle = 1 and EW3 - Open > EW1 - EW2 ) or (WaveAngle = 2 and Open - EW3 > EW2 - EW1 )) then { //Print(TimeToStr(time),": ",Symbol," Elliot Wave 3 retracement ended. Last EW3:",EW3," Last EW3 Time:",TimeToStr(EW3MARKTIME)," Order Stop:",TrailingStopPoint); //Alert(TimeToStr(time),": ",Symbol," Elliot Wave 3 retracement ended. Last EW3:",EW3," Last EW3 Time:",TimeToStr(EW3MARKTIME)," Order Stop:",TrailingStopPoint); Comment("\nEWTrend=Recalculating..", "\nLast EW0=",TimeToStr(EW5MARKTIME), " ",EW5, "\nLast EW1=",TimeToStr(EW1MARKTIME), " ",EW1, "\nLast EW2=",TimeToStr(EW2MARKTIME), " ",EW2, "\nLast EW3=",TimeToStr(EW3MARKTIME), " ",EW3, "\nPivot ",Pivot, "\nResistance Level I ",ResistanceLevel1, "\nSupport Level I ",SupportLevel1, "\nResistance Level II ",ResistanceLevel2, "\nSupport Level II ",SupportLevel2, "\nPrice Level ",PriceLevel,"%" ); EW0MARK=0; EW1MARK=0; EW2MARK=0; EW3MARK=0; EW4MARK=0; EW5MARK=0; ORDERMARK=0; } if prevbars > 0 and EW3ORDERMARK=99 and Bars != prevbars and ((PriceLevel > 0 and LastPriceLevel <= 0) or (PriceLevel < 0 and LastPriceLevel >= 0)) // and CCI < 200 then { ENTRYPRICE=Open; if ParabolicSAR < Open then { ORDERANGLE=1; ENTRYPRICE=Pivot;MinTakeProfitPtS=ResistanceLevel2;}; if ParabolicSAR > Open then { ORDERANGLE=11; ENTRYPRICE=Pivot;MinTakeProfitPtS=SupportLevel2;} Trace = 1; //print(TimeToStr(time),": Trace:",Trace," ORDERMARK:",ORDERMARK," ORDERANGLE:",ORDERANGLE," Price: ",Ask," Commodity Channel Index ",CCI," Pivot ",Pivot," Resistance Level I ",ResistanceLevel1," Support Level I ",SupportLevel1," Resistance Level II ",ResistanceLevel2," Support Level II ",SupportLevel2," Price Level ",PriceLevel," Last Price Level ",LastPriceLevel); LastOp=0; ORDERMARK=1; ORDERCOUNT=0; if WaveAngle = 1 then SARAngle = 1; if WaveAngle = 2 then SARAngle = 2; for counter = 1 to 10 Begin tempval =iSAR(SARstep,SARmax,counter); //print("Price:",Close[counter]," SAR:",tempval); if (WaveAngle = 1 and tempval > Close[counter]) then SARAngle = 2; if (WaveAngle = 2 and tempval < Close[counter]) then SARAngle = 1; End; if WaveAngle = 1 then print(TimeToStr(time),": Support/Resistance cross at price:",Open," WaveAngle: UP SAR:",ParabolicSAR, " SARAngle:",SarAngle," PriceLevel: ",PriceLevel," LastPriceLevel: ",LastPriceLevel); if WaveAngle = 2 then print(TimeToStr(time),": Support/Resistance cross at price:",Open," WaveAngle: DOWN SAR:",ParabolicSAR, " SARAngle:",SarAngle," PriceLevel: ",PriceLevel," LastPriceLevel: ",LastPriceLevel); Print(TimeToStr(time[0]),": Support/Resistance - Pivot:",Pivot," Resistance Level I:",ResistanceLevel1," Support Level I:",SupportLevel1," Resistance Level II:",ResistanceLevel2," Support Level II:",SupportLevel2); Print(" Support/Resistance - EW0MARK:",EW0MARK," EW1MARK:",EW1MARK," EW2MARK:",EW2MARK," EW3MARK:",EW3MARK," EW3MARKBAR=",EW3MARKBAR," EW4MARK:",EW4MARK," EW0:",EW5PRICE," EW1:",EW1," EW2:",EW2," EW3:",EW3); SetArrow(time,Open,254,Blue); if WaveAngle = 1 then { if EW0MARK = 1 and EW1MARK=1 and EW2MARK=0 then ORDERANGLE=2; if EW0MARK = 1 and EW1MARK=1 and EW2MARK=1 and EW3MARK=0 then ORDERANGLE=23; if EW0MARK = 1 and EW1MARK=1 and EW2MARK=1 and EW3MARK=1 then ORDERANGLE=4; } if WaveAngle = 2 then { if EW0MARK = 1 and EW1MARK=1 and EW2MARK=0 then ORDERANGLE=21; if EW0MARK = 1 and EW1MARK=1 and EW2MARK=1 and EW3MARK=0 then ORDERANGLE=22; if EW0MARK = 1 and EW1MARK=1 and EW2MARK=1 and EW3MARK=1 then ORDERANGLE=3; } LastOp = 1; } if ORDERMARK > 9990 then { ORDERANGLE=WaveAngle; if ORDERCOUNT > TradesCount and EW3 <= Open then ORDERCOUNT = TradesCount; if WaveAngle = 1 and Open - TakeProfit * Point > EW1 then ORDERMARK = 1; // Additional Orders handling if WaveAngle = 2 and Open + TakeProfit * Point < EW1 then ORDERMARK = 1; // Additional Orders handling } if WaveAngle = 1 then SARAngle = 1; if WaveAngle = 2 then SARAngle = 2; for counter = 1 to RetracementBars Begin tempval =iSAR(SARstep,SARmax,counter); //print("Price:",Close[counter]," SAR:",tempval); if (WaveAngle = 1 and tempval > Close[counter]) then SARAngle = 2; if (WaveAngle = 2 and tempval < Close[counter]) then SARAngle = 1; End; if WaveAngle = 1 then MACDAngle = 1; if WaveAngle = 2 then MACDAngle = 2; for counter = 1 to RetracementBars Begin tempval=iMACD(RetracementBars/5,RetracementBars,RetracementBars/5,MODE_EMA,counter); //print("MACD:",tempval); if WaveAngle = 1 then { if tempval > 0 and tempval < MACD then MACDAngle = 1; if tempval < 0 or tempval > MACD then MACDAngle = 2; } if WaveAngle = 2 then { if tempval > 0 or tempval < MACD then MACDAngle = 1; if tempval < 0 and tempval > MACD then MACDAngle = 2; } End; ShortMACDAngle = MACDAngle; if WaveAngle = 1 then MACDAngle = 1; if WaveAngle = 2 then MACDAngle = 2; for counter = 1 to RetracementBars Begin tempval=iMACD(RetracementBars,MaxBars,RetracementBars,MODE_EMA,counter); //print("MACD:",tempval); if WaveAngle = 1 then { if tempval > 0 and tempval < MACD then MACDAngle = 1; // if tempval < 0 or tempval > MACD then MACDAngle = 2; if tempval > MACD then MACDAngle = 2; } if WaveAngle = 2 then { if tempval > 0 or tempval < MACD then MACDAngle = 1; // if tempval < 0 and tempval > MACD then MACDAngle = 2; if tempval > MACD then MACDAngle = 2; } End; MaxPriceBar = Highest (MODE_CLOSE,MaxBars+1, RetracementBars); MinPriceBar = Lowest (MODE_CLOSE, MaxBars+1, RetracementBars); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if WaveAngle = 1 then { BearsAngle=1; BullsAngle=1; for counter=1 to RetracementBars { tempval=iBearsPower(RetracementBars,MODE_HIGH,counter); // if tempval < 0 or tempval > Bears then BearsAngle=2; if tempval > Bears then BearsAngle=2; tempval=iBullsPower(RetracementBars,MODE_LOW,counter); // if tempval < 0 or tempval > Bulls then BullsAngle=2; if tempval > Bulls then BullsAngle=2; } } if WaveAngle = 2 then { BearsAngle=2; BullsAngle=2; for counter=1 to RetracementBars { tempval=iBearsPower(RetracementBars,MODE_HIGH,counter); // if tempval > 0 or tempval < Bears then BearsAngle=1; if tempval < Bears then BearsAngle=1; tempval=iBullsPower(RetracementBars,MODE_LOW,counter); // if tempval > 0 or tempval < Bulls then BullsAngle=1; if tempval < Bulls then BullsAngle=1; } } if EW3ORDERMARK > 0 then { ORDERCOUNT=0; ORDERMARK=1; if EW3ORDERMARK = 1 // and Bid > EW3 + Slippage * Point // and Open >= EW3 // and Bid > EW3 + NoisePips * Point then { ORDERANGLE=4; } if EW3ORDERMARK = 2 // and Open >= EW3 // and Ask < EW3 - NoisePips * Point then { ORDERANGLE = 3; } if EW3ORDERMARK = 3 // and Open >= EW3 // and Bid > EW3 + NoisePips * Point then { ORDERANGLE = 2; } if EW3ORDERMARK = 4 // and Ask < EW3 - NoisePips * Point then { ORDERANGLE = 22; } if EW3ORDERMARK = 11 // and Ask < EW3 - Slippage * Point // and Open >= EW3 // and Ask < EW3 - NoisePips * Point then { ORDERANGLE = 23; } if EW3ORDERMARK = 12 // and Open >= EW3 // and Bid > EW3 + NoisePips * Point then { ORDERANGLE = 22; } if EW3ORDERMARK = 13 // and Open >= EW3 // and Ask < EW3 - NoisePips * Point then { ORDERANGLE = 21; } if EW3ORDERMARK = 14 // and Ask < EW3 - NoisePips * Point then { ORDERANGLE = 3; } //EW3ORDERMARK=0; } MaxPriceBar = Highest (MODE_CLOSE,MaxBars+1, MaxBars); MinPriceBar = Lowest (MODE_CLOSE, MaxBars+1, MaxBars); MaxPrice = Close[MaxPriceBar]; MinPrice = Close[MinPriceBar]; if EW2MARK = 1 and EW3MARK = 0 then { If WaveAngle = 1 and Bid > EW2 + NoisePips * Point and Bid > SupportLevel1 + NoisePips * Point and ((EW2 - SupportLevel1 > 0 and (EW2 - SupportLevel1) / 2 < NoisePips * 2 / 2) or (SupportLevel1 - EW2 > 0 and (SupportLevel1 - EW2) / 2 < NoisePips * 2 / 2)) and EW1 - Bid > MinTakeProfit * Point + NoisePips * Point + Slippage then { ENTRYPRICE=SupportLevel1; ORDERMARK=1; SetArrow(time,Low,196,Violet); Print(TimeToStr(time),": ",Symbol," Elliot Wave 2 collision with Support Level 1 detected. Last EW2:",EW2," Last EW2 Time:",TimeToStr(EW2MARKTIME)," Recommended action: BUYLIMIT at ", ENTRYPRICE, " with T/P at ",EW1 - NoisePips * Point); Alert(TimeToStr(time),": ",Symbol," Elliot Wave 2 collision with Support Level 1 detected. Last EW2:",EW2," Last EW2 Time:",TimeToStr(EW2MARKTIME)," Recommended action: BUYLIMIT at ", ENTRYPRICE, " with T/P at ",EW1 - NoisePips * Point); Print(TimeToStr(time[0]),Symbol," : Elliot Wave 2 collision - Pivot:",Pivot," Resistance Level I:",ResistanceLevel1," Support Level I:",SupportLevel1," Resistance Level II:",ResistanceLevel2," Support Level II:",SupportLevel2); } If WaveAngle = 2 and Ask < EW2 - NoisePips * Point and Ask < SupportLevel1 - NoisePips * Point and ((EW2 - SupportLevel1 > 0 and (EW2 - SupportLevel1) / 2 < NoisePips * 2 / 2) or (SupportLevel1 - EW2 > 0 and (SupportLevel1 - EW2) / 2 < NoisePips * 2 / 2)) and Ask - EW1 > MinTakeProfit * Point + NoisePips * Point + Slippage then { ENTRYPRICE=SupportLevel1; ORDERMARK=2; SetArrow(time,High,198,Violet); Print(TimeToStr(time),": ",Symbol," Elliot Wave 2 collision with Resistance Level 1 detected. Last EW2:",EW2," Last EW2 Time:",TimeToStr(EW2MARKTIME)," Recommended action: BUYLIMIT at ", ENTRYPRICE, " with T/P at ",EW1 - NoisePips * Point); Alert(TimeToStr(time),": ",Symbol," Elliot Wave 2 collision with Resistance Level 1 detected. Last EW2:",EW2," Last EW2 Time:",TimeToStr(EW2MARKTIME)," Recommended action: BUYLIMIT at ", ENTRYPRICE, " with T/P at ",EW1 - NoisePips * Point); Print(TimeToStr(time[0]),Symbol," : Elliot Wave 2 collision - Pivot:",Pivot," Resistance Level I:",ResistanceLevel1," Support Level I:",SupportLevel1," Resistance Level II:",ResistanceLevel2," Support Level II:",SupportLevel2); } } } /************************************ Aggressive Anti Stop Loss - revert to Take Profit ********************************/ If (CloseBadOrder = 2 and OrderRecovery=0) and AntiStopLoss = 1 and (CurTime-LastBadTime) > 300 and Open <=MinPrice then // Compensating BUY order for last bad trade { LastOp = 3; BuyOp = 1; SellOp = 0; CloseBadOrder = 0; OrderRecovery = 1; SetArrow(time,Bid,233,Yellow); exit; } If (CloseBadOrder = 1 and OrderRecovery=0) and (CurTime-LastBadTime) > 300 // Compensating SELL order for last bad trade and Open <=MinPrice then { LastOp = 4; BuyOp = 0; SellOp = 1; CloseBadOrder = 0; OrderRecovery = 1; SetArrow(time,Bid,234,Yellow); exit; } /*********** Open Orders handling: Trailingstops, Delayed Orders Expire, Aggressive Anti Stop Loss logics ***************/ if OrderRecovery = 0 then TradesCount = 0; if OrderRecovery = 0 and IsTradeAllowed then for counter = 1 to TotalTrades { if (OrderValue(counter,VAL_SYMBOL) = Symbol) then // we have pending current currency orders, { TradesCount = TradesCount + 1 ; // calculate trades for current market symbol } OrderType = OrderValue(counter,VAL_TYPE); if FreeMargin < 10 and IsTesting then // MetaTrader test do not close orders in with no money test mode { Print("Out of money, I AM BROKEN:( Exiting.."); If (OrderType = OP_SELL) then CloseOrder(OrderValue(counter,VAL_TICKET),OrderValue(counter,VAL_LOTS),PriceAsk,OrderValue(counter,VAL_SWAP),Yellow); If (OrderType = OP_BUY) then CloseOrder(OrderValue(counter,VAL_TICKET),OrderValue(counter,VAL_LOTS),PriceBid,OrderValue(counter,VAL_SWAP),Yellow); SetArrow(time,PriceAsk+BidStopPoints,77,Yellow); exit; } if StopLoss = 0 then TrailingStopLoss = OrderValue(counter,VAL_OPENPRICE) else TrailingStopLoss = OrderValue(counter,VAL_STOPLOSS); If (OrderType = OP_BUY) and OrderValue(counter,VAL_SYMBOL)=Symbol then { // This is our buy order, lets check for prices if (TrailingStop) > 0 then // We have Trailing Stop enabled, arrange our bids { // Here we check the trailing stop at open position. // Trailing stop ( Stop Loss) of the BUY position is being // kept at level 15 points below the market. // print("ParabolicSAR:",ParabolicSAR, " StopLossTrail:",TrailingStopLoss," MA:",MA); If (PriceBid - (TrailingStop + TrailingStep) * Point) > OrderValue(counter,VAL_OPENPRICE) // If the profit (current Bid-OpenPrice) more than TrailingStop pips // and the last StopLoss exceeds TrailingStep points from Trailingstop then { // we have won already not less than 'TrailingStop' pips! // move the trailing stop (Stop Loss) to the level 'TrailingStop' from the market StopLossTrail=TrailingStopLoss; // print("ParabolicSAR:",ParabolicSAR, " StopLossTrail:",StopLossTrail," MA:",MA); if Open - ((TrailingStep + TrailingStop) * Point) > OrderValue(counter,VAL_OPENPRICE) and StopLossTrail < OrderValue(counter,VAL_OPENPRICE) and Open + (TrailingStop * Point) >= OrderValue(counter,VAL_TAKEPROFIT) then // We have won already take profit-trailingstop pips! Set Stop Loss to take profit minimum { ModifyOrder(OrderValue(counter,VAL_TICKET),OrderValue(counter,VAL_OPENPRICE), OrderValue(counter,VAL_OPENPRICE) + (TrailingStop * Point),OrderValue(counter,VAL_TAKEPROFIT),Blue); SetArrow(time,PriceBid,105,Blue); exit; } else if ParabolicSAR -