Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   1. Austitt Range, Eintritt Range mit Innenstab, 2. Austritt Range= Order (http://www.expert-advisor.com/forum/showthread.php?t=6360)

RollsReus 13.03.19 22:41

1. Austitt Range, Eintritt Range mit Innenstab, 2. Austritt Range= Order
 
Guten Tag,

ich versuche mich aktuell an der Erstellung eines EA, der mir

1) zwischen 12:30 und 13:00 Uhr eine Range ausgibt,
2) aus dieser ausbricht
3) in den nächsten x-Candles wieder in die Range eintritt,
4) einen Range-Innenstab bildet und
5) bei Austritt einer Order absetzt.


Punkt 1) und 5) habe ich bereits umsetzen können.

Ich möchte jedoch, wie beschrieben, dass er erst beim zweiten Ausbruch eine Order setzt mit der zusätzlichen Bedingung, dass er in der Range vor dem zweiten Ausbruch einen Innenstab ausbildet.

Kann mir ein EA-erfahrenes Forenmitglied einen Tipp geben, wie ich dies im mql4-Code umsetzen kann?

Vielen Dank vorab für Eure Unterstützung.

AVT 15.03.19 20:55

Das erste funktioniert bei Dir ja schon, super, darauf kannst Du aufbauen.

Anstatt gleich eine Order loszulassen, setzt Du eine Variable wie zum Beispiel bool Erstausbruch=false und wenn der Ausbruch da war, wird diese zu Erstausbruch=true. Das ist Deine erste Bedingung.

Nun mußt Du die weiteren Bedingungen formulieren. Ein Innenstab innerhalb der Range bedeutet (wir arbeiten mit vollendeten Kerzen):
1. das Hoch der vorletzten Kerze muß kleiner sein als die obere Rangelinie
2. das Tief der vorletzten Kerze muß größer sein als die untere Rangelinie
Das stellt sicher, daß wir uns innerhalb der Range befinden.
Nun noch der Innenstab hinterher
3. das Hoch der letzten Kerze muß kleiner sein als das Hoch der Vorletzten
4. das Tief der letzten Kerze muß größer sein als das Tief der Vorletzten

Diese weiteren Bedingungen kombinierst Du jetzt. Wenn
Erstausbruch && weitere Bedingungen && aktueller Close außerhalb der Range,
dann Order loslassen.

Reicht das schon, um Dich weiter zu bringen? AVT

RollsReus 15.03.19 21:08

Danke für Deinen Tipp. Habe die letzten zwei Tage vergeblich versucht mit meinen noch sehr luftigen EA-Kenntnissen die Idee umzusetzen, ohne wirklichen Erfolg. Werde es aber direkt nochmal probieren nach Deiner Rückmeldung und mich mit dem aktuellen Stand wieder melden. Vielen Dank nochmal für Deinen Support

RollsReus 15.03.19 22:56

Vom Gefühl her, bin ich deutlich näher gekommen dank Deiner Hinweise. Aktuell setzt er jedoch (noch) keine Order nach den genannten Bedingungen. Magst Du bei Gelegenheit mal über folgenden Code-Schnipsel schauen:

}
Zitat:

//Longtrade

if (Ask>(RangeHigh+Point*20))
//1. Ausbruch über dem RangeHigh
Erstausbruch = true;

if(iOpen(Symbol(),NULL,0)<RangeHigh && iClose(Symbol(),NULL,0)<RangeHigh)
//danach Innenstab innerhalb der Range

if (Ask>(RangeHigh+Point*20) && Erstausbruch == true && TradeAllowed == true && RangeOk==true && GetTotalTrades()==0)
//2. Ausbruch über dem RangeHigh


{
bool ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-(SL*Point),Ask+(TP*Point),NULL,Magic,0,Blue);
TradeAllowed=false;
}
Beim Kompilieren wird bei der Syntax kein Fehler festgestellt, jedoch habe ich irgendwo noch einen Fehler in der Umsetzung. Fällt Dir ein Fehler auf den ich korrigieren sollte damit es funktioniert?

Vielen Dank vorab.

AVT 16.03.19 07:38

Zitat:

Zitat von RollsReus (Beitrag 42280)
Code:

iOpen(Symbol(),NULL,0)

das gibt Dir den Eröffnungskurs (iOpen) der 0. Kerze, also den gerade aktuellen Eröffnungskurs. Du brauchst aber
1. den Höchstkurs iHigh
2. der vorletzten Kerze, das ist die 2. Kerze
Kerzenzahlen werden standardmäßig von 0=aktuell zurückgezählt bis z.B. 3598=erste Kerze in Chart (gleichzeitig die erste Kerze, bei der Berechnungen anfangen können - klar, man kann nur mit dem rechnen, was man hat).

Also Langstab innerhalb der Range
Code:

  iHigh(NULL,0,2) < RangeHigh // Hoch 2.Kerze vorher kleiner Obergrenze
&& iLow(NULL,0,2)  > RangeLow  // Tief 2. Kerze vorher größer Untergrenze

Fehlt noch Innenstab-Bedingung (Hoch und Tief der 1. Kerze mit der vorherigen, also der 2. Kerze vergleichen), versuch's mal. Ein Tip: wenn Du im MT-Editor das Wort z.B. iOpen geschrieben hast, Cursor auf Wort, F1 drücken und Du kriegst automatisch die Hilfseite dazu.
AVT

RollsReus 16.03.19 15:31

Zitat:

Zitat von AVT (Beitrag 42281)
das gibt Dir den Eröffnungskurs (iOpen) der 0. Kerze, also den gerade aktuellen Eröffnungskurs. Du brauchst aber
1. den Höchstkurs iHigh
2. der vorletzten Kerze, das ist die 2. Kerze
Kerzenzahlen werden standardmäßig von 0=aktuell zurückgezählt bis z.B. 3598=erste Kerze in Chart (gleichzeitig die erste Kerze, bei der Berechnungen anfangen können - klar, man kann nur mit dem rechnen, was man hat).

Also Langstab innerhalb der Range
Code:

  iHigh(NULL,0,2) < RangeHigh // Hoch 2.Kerze vorher kleiner Obergrenze
&& iLow(NULL,0,2)  > RangeLow  // Tief 2. Kerze vorher größer Untergrenze

Fehlt noch Innenstab-Bedingung (Hoch und Tief der 1. Kerze mit der vorherigen, also der 2. Kerze vergleichen), versuch's mal. Ein Tip: wenn Du im MT-Editor das Wort z.B. iOpen geschrieben hast, Cursor auf Wort, F1 drücken und Du kriegst automatisch die Hilfseite dazu.
AVT

Habe mich mit dem iOpen/iClose total vertan, danke. War wohl doch schon zu spät gestern Abend.

Habe dies nun wie von Dir vorgeschlagen auf iHigh und iLow geändert.
Trotz zahlreichen rumprobieren eröffnet der EA bei mir immer noch bei dem ersten Durchbruch bzw. im aktuellen Code garnicht mehr.

Eine Info noch bevor ich den Code zeige: Ich hatte mich mit dem Innenstab unklar ausgedrückt. Ich wollte damit ausdrücken, dass ich nach dem ersten Ausbruch lediglich einen Bar sehen will der das Hoch unter dem RangeHigh hat und das Tief über dem RangeLow. Also nicht die klassiche Definition einen Innenstabs. Mehr ein "RangeInnenstab" (so habe ich ihn auch genannt).


Zitat:

//Longtrade

if (Ask>(RangeHigh+Point*20)) //1. Ausbruch über dem RangeHigh
Erstausbruch = true;
RangeInnenstab = false;

if(Erstausbruch == true && RangeInnenstab == false && iHigh(Symbol(),NULL,0)<RangeHigh && iLow(Symbol(),NULL,0)>RangeLow) //danach Innenstab innerhalb der Range
RangeInnenstab = true;

if (RangeInnenstab == true && Ask>(RangeHigh+Point*20) && TradeAllowed == true && RangeOk==true && GetTotalTrades()==0) //2. Ausbruch über dem RangeHigh


{

bool ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-(SL*Point),Ask+(TP*Point),NULL,Magic,0,Blue);
TradeAllowed=false;
}
//Shorttrade
if (Bid<(RangeLow+Point*-20) && TradeAllowed == true && RangeOk==true && GetTotalTrades()==0)
{
bool ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+( SL*Point),Bid-(TP*Point),NULL,Magic,0,Red);
TradeAllowed=false;
}

Hast Du noch einen Hinweis, warum es nicht klappt? Bin nach etlichen Versuchen mit meinem Latein nah am Ende.

Kurze Erläuterung damit es besser verständlich ist:

a)Nach 1. Ausbruch ist RangeInnenstab = false, damit er noch keine Order setzt.

b) Nach dem Bilden des RangeInnenstabs ist dieser = true

c) Und erst wenn RangeInnenstab = true ist, dann soll beim 2. Ausbruch die Order gesetzt werden.

Danke orab für Deine bzw. je nach User-Antwort Eure Hilfe.

RollsReus 16.03.19 22:06

Es funktioniert jetzt. Ich hatte die bool Variablen nicht im int init definiert.

Ich möchte mich nochmals auf diesem Wege für Deine Hilfe bedanken. Der Austausch hat mir sehr geholfen.

AVT 19.03.19 23:30

Leider habe ich nicht immer Zeit, daher konnte ich Deine letzte Anfrage erst jetzt sehen. Aber super, daß Du es allein hinbekommen hast :) AVT

Angel 07.06.19 09:20

Innenstäbe (Die "klassischen" / "üblichen") sind jedoch ein wenig anders definiert....
So etwas:

Code:

// i = Außenstab, mit dem die Kerze z verglichen wird
//z = die Kerze(n), die mit dem Außenstab i verglichen wird / werden
if(BarClose[z]<BarHigh[i] && BarClose[z]>BarLow[i] && BarOpen[z]<BarHigh[i] && BarOpen[z]>BarLow[i])// Check, ob der Stab z ein Innenstab zu dem Stab i ist

Ich habe dies in 2 For-Schleifen gelöst.
Code:

for(i=Anzahl;i>1;i--) // Erste Schleife; ´Beim Entstehen einer neuen 1-Minute Kerze sollen alle "Anzahl"-Kerzen durchlaufen und überprüft werden
    {
        for(z=i-1;z>0;z--) // Zweite Schleife; Anfang soll i-1 sein
        {
if(BarClose[z]<BarHigh[i] && BarClose[z]>BarLow[i] && BarOpen[z]<BarHigh[i] && BarOpen[z]>BarLow[i])
        }
    }



Alle Zeitangaben in WEZ +2. Es ist jetzt 10:31 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum