Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Möchte einen EA bauen, mit selbstgebautem Indikator

Geschrieben

Hallo zusammen,

 

habe ein Problem mit meinem EA. bzw. Mit dem Auslesen der Daten.

 

Der Indikator zeichnet brav die Linien aufs Chart( jede Bar eben ), aber wenn ich ihn mit iCustom() auslesen möchte, dann habe ich jede Sekunde einen Wert, aber es wird doch nur auf jede Bar getestet.

 

Wieso habe ich auf dem chart nur ein Punkt, aber beim Berechnen so viele Werte ???

 

Wie kann ich dann einem EA die Signale für buy und für sell- order übergeben ????

 

 

Ich danke euch schon mal im Voraus.

 

 

Bitte, das beschäftigt mich schon seit Tagen.

Bearbeitet von sill3000

Featured Replies

Geschrieben

Hi,

 

genaugenommen hast du in beiden Fällen (am Chart und im EA) bei jedem Tick einen neuen Wert (oder in keinem der Fälle). Schau dir den Indi im Chart mal genau an wenn die Ticks reinkommen, vor allem den letzten Bar, der verändert sich ja auch ständig.

 

Allgemein kann man sagen das sich der Wert für den letzten Bar (also den aktuellen sprich Offset 0) ständig ändert (zumindest bei den meisten Indis). Bei manchen Indis ändern sich teils auch die Werte von älteren Bars, das nennt man repainten und solche indis sind nur bedingt für EAs verwendetbar.

 

Aus diesem Grund verwendet man beim EA basteln meist den Wert des aktuellsten vollständigen Bars (also Offset 1), denn dieser Wert ändert sich normal nicht mehr und man kann damit die klassischen Analysen etc. machen.

 

hth

Geschrieben

Hallo,

 

du hast also das Problem, daß du einen Indikator nur 1x pro Bar aufrufen willst, dein EA das aber mehrfach tut. Hab ich das richtig verstanden?

Hierzu mußt du wissen, daß der MT4 Strategietester sich selbst Tickdaten generiert und die Start-Funktion deines EAs bei jedem Tick aufgerufen wird.

Wenn du also im M5-Chart handeln willst und du jede Sekunde einen Tick kriegst, dann wird dein Code folglich 300x ausgeführt.

 

Willst du das vermeiden, so mußt du den EA so programmieren, dass er Teile nur bei jedem neuen Bar ausführt. Das kannst du beispielsweise so machen.

...
datetime CheckNewBarLastbar;
...
start()
{...
  if(CheckNewBar())
  {
	//Der Code, der hier steht, wird nur 1x pro Bar ausgeführt
  }
...
}

bool CheckNewBar()
{
  datetime curbar = Time[0];
  if(CheckNewBarLastbar!=curbar)
  {
	CheckNewBarLastbar=curbar;
	return(true);
  }
  else
	return(false);
}

Wie kann ich dann einem EA die Signale für buy und für sell- order übergeben ????

Was meinst du damit?

Wenn du eine Order aufgeben willst, dann ruftst du die Funktion OrderSend() auf. Diese hat folgende Struktur:

int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, 
string comment, int magic, datetime expiration, color arrow_color)

Als cmd gibst du dann OP_BUY für Kaufen oder OP_SELL für verkaufen, oder was auch immer für eine pending order an.

Geschrieben
  • Autor
...

 

Das Ganze funktioniert dann auch mit der iCustom Funktion ? Ich hatte eben das Problem, dass der EA mir, sagen wir mal "unendlich" viele Trades aufmacht. Aber ich probiere das mal aus.

Bearbeitet von ronner
Zitat gekürzt - bitte auf notwendige Länge achten

Geschrieben
  • Autor
...

 

 

Ich habe eben mit Str+D das Datenfenster nebenher aufgemacht und diese Werte( Buffer), verändern sich nicht dauernd, sondern nur, wenn ich mit der Maus an die gewünschte Position gehe.

 

Aber wenn ich die Print-Funktion aufrufe, dann bekomme ich eben ein sich dauernd ändernden WErt, wenn ich bei "Journal" die Ausdrücke anzeigen lasse.

 

Bin da etwas verwirrt und habe mir sogar das Buch gekauft " Expert Advisor Programming" von Andrew R. Young.

Bearbeitet von ronner
Zitat gekürzt - bitte auf notwendige Länge achten

Geschrieben
Aber wenn ich die Print-Funktion aufrufe, dann bekomme ich eben ein sich dauernd ändernden WErt, wenn ich bei "Journal" die Ausdrücke anzeigen lasse.

 

Das sind die Historie Kursdaten. Da dein Indikator eine Schleife benutzt. Die bei der 1. BAR beginnt und letzten BAR endet.

Wenn du das nicht möchtest Arbeite mit TIME[0].

Geschrieben
  • Autor

Ich habe eben mit Str+D das Datenfenster nebenher aufgemacht und diese Werte( Buffer), verändern sich nicht dauernd, sondern nur, wenn ich mit der Maus an die gewünschte Position gehe.

 

Aber wenn ich die Print-Funktion aufrufe, dann bekomme ich eben ein sich dauernd ändernden WErt, wenn ich bei "Journal" die Ausdrücke anzeigen lasse.

 

Bin da etwas verwirrt und habe mir sogar das Buch gekauft " Expert Advisor Programming" von Andrew R. Young.

 

Das ist alles sehr nett von euch und ich danke euch wirklich von ganzem Herzen, dass ihr alle so nett zu mir seid und mir meine Wissenslücken schliessen helft.

 

Ich habe immer noch ein paar Probleme zum -denke ich- Grundverständnis.

 

1. Der EA funktioniert auf Bar d.h. nach jedem Bar wird die komplette Berechnung EINMAL ausgeführt. Ist das richtig ?

 

Der von mir gebaute Indikator funktioniert aber auf tick-Basis, d.h. dann: Gehen dann Informationen verloren, die dazwischen eben auftauchen ??

 

2. Der Zusammenhang mit dem Datenfenster und der Funktion iCustom(). Gibt es da überhaupt einen ?

 

Entsprechen die Daten im Datenfenster bzw. Buffer, exakt den gleichen Werten, wie in den Berechnungsfeldern ?

 

3.Die Daten im Datenfenster verändern sich nur, wenn ich den Mauszeiger an die gewünschte Stelle im chart positioniere, sonst nicht ?

 

Kann man das irgendwie abändern, dass die Daten im Datenfenster sich gleichzeitig ändern ?

Geschrieben

 

3.Die Daten im Datenfenster verändern sich nur, wenn ich den Mauszeiger an die gewünschte Stelle im chart positioniere, sonst nicht ?

 

Kann man das irgendwie abändern, dass die Daten im Datenfenster sich gleichzeitig ändern ?

Menes wissens nach ist dies so gedacht, um sich schnell OHLC anzeigen zu lassen, bzw. Indikatorenwerte, Uhrzeit usw. am Bar zu zeigen.

Bin mir nicht sicher ob man doch etwas programmieren kann, was dann automatisch Bar für Bar mitläuft..

 

Wäre aber höchstwahrscheinlich dann wieder ein Extra Indi und NICHT das Datenfenster was du meinst.

Geschrieben

1. Der EA funktioniert auf Bar d.h. nach jedem Bar wird die komplette Berechnung EINMAL ausgeführt. Ist das richtig ?

Der von mir gebaute Indikator funktioniert aber auf tick-Basis, d.h. dann: Gehen dann Informationen verloren, die dazwischen eben auftauchen ??

Nein, der EA, vielmehr die Start-Funktion des EAs wird für jeden Tick aufgerufen. Ein Bar besteht aus vielen Ticks, somit gibt es auch viele Aufrufe pro Bar.

Bei deinem auf Tick-Basis funktionierenden Indikators gehen dir somit keine Informationen verloren.

 

2. Der Zusammenhang mit dem Datenfenster und der Funktion iCustom(). Gibt es da überhaupt einen ?

Entsprechen die Daten im Datenfenster bzw. Buffer, exakt den gleichen Werten, wie in den Berechnungsfeldern ?

Das Datenfenster zeigt dir nur die Daten der einzelnen Indikatoren/Kurse im Chart. Mit iCustom hat das erst mal nichts zu tun.

Es ist nur eine bequemere Art an die einzelnen Werte zu bestimmten Zeiten zu kommen, als mit der Maus im Chart direkt auf die einzelnen

Linien zu fahren.

 

3.Die Daten im Datenfenster verändern sich nur, wenn ich den Mauszeiger an die gewünschte Stelle im chart positioniere, sonst nicht ?

Kann man das irgendwie abändern, dass die Daten im Datenfenster sich gleichzeitig ändern ?

Wüßte nicht wie, aber warum brauchst du das?

 

Vielleicht hast du die Funktionsweise von iCustom() noch nicht ganz verstanden.

iCustom macht eigentlich nichts anderes, als dir den Wert einer Indikatorlinie zurückzugeben.

Wenn du innerhalb der Start-Funktion deines EAs iCustom() aufrufst, dann wird dir für jeden Bar der aktuelle Indikatorwert so oft ausgegeben, wie

es Ticks zu diesem Bar gibt.

Du kannst iCustom aber mit einem Shift aufrufen (letzter Parameter). Dann wird dir zwar auch für jeden Tick ein Wert zurück gegeben, dieser ändert

sich aber (in der Regel) nicht.

 

Daß dein EA ständig kauft verkauft liegt aber wohl daran, daß du noch ein größeres Problem mit der Logik deiner Einstiegs/Ausstiegskriterien hast...

Geschrieben
  • Autor
...

 

 

Das bedeuted, diese Daten im Datenfenster, die könnte man auch alle mit der iCustom-Fkt. herausbekommen, irgendwie stehe ich da aufm Schlauch ?

 

Entschuldigt die blöde Fragerei, von meiner Seite, aber irgendwie bin ich nur am Hirnen, oder sehe ich den Wald nicht mehr vor lauter Bäume.

Bearbeitet von ronner
Zitat gekürzt - bitte auf notwendige Länge achten.

Geschrieben

Das bedeuted, diese Daten im Datenfenster, die könnte man auch alle mit der iCustom-Fkt. herausbekommen, irgendwie stehe ich da aufm Schlauch ?

Entschuldigt die blöde Fragerei, von meiner Seite, aber irgendwie bin ich nur am Hirnen, oder sehe ich den Wald nicht mehr vor lauter Bäume.

 

iCustom ist nichts aderes als z.B. iRSI, nur daß iCustom die Werte eines z.B. selbstprogrammierten Indikators liefert. Man kann also mit iCustom den selbstgemachten "SuperSwing-Indikator" genauso benutzen, wie die MQL-eigenen iRSI, iMACD usw.

Geschrieben
  • Autor

Was meinst du damit?

[...]

 

 

 

 

Ich habe immer noch Probleme mit dem Verständnis:

 

 

Problem: Ich habe ein Indikator, der mir irgendwie einen roten und einen grünen Punkt aufm chart anzeigt.

 

Ich möchte wissen, wie die Punkte generiert werden, wie würdet ihr Vorgehen ????

Bearbeitet von whipsaw

Geschrieben

Hi sill3000,

 

innerhalb des Indikators wird für jedes deiner Signale ein sogenannter Buffer geführt.

Wenn du dir die Infos im Datenfenster anschaust ist der erste angezeigte Wert deines Indikators der Buffer 0.

 

Über iCustom kannst du auf all diese Buffers zugreifen.

erklärung von http://docs.mql4.com/indicators/iCustom:

double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)

mode - Line index. Can be from 0 to 7 and must correspond with the index used by one of SetIndexBuffer functions.

 

Du brauchst also nicht mal genau wissen wie das signal generiert wird (wenn du keinen Sourcecode hast), sondern nur welchen Buffer und welchen Wert du abfragen musst.

 

Hilft dir das weiter?

 

grüsse,

askerix

Geschrieben

Das sind die Historie Kursdaten. Da dein Indikator eine Schleife benutzt. Die bei der 1. BAR beginnt und letzten BAR endet.

Wenn du das nicht möchtest Arbeite mit TIME[0].

 

...wie schon von FinGer erklärt:

Um eine erneute Ausführung einer bestimmten Funktion(OrderSend(),Print())im aktuellen Bar zuverhindern, musst Du mit TIME[0] arbeiten.

Als Bsp:

Wenn dein EA bei einer bestimmten Bedingung eine Order öffnen soll, dann macht er das. Jetzt ist es natürlich sehr wahrscheinlich, dass diese Bedingung zum nächsten Tick immernoch gegeben ist.

Der EA sieht aber nur: Bedingung ist gegeben! Order öffnen...

Dabei interessiert es ihn nicht, ob es die erste Order oder die zehnte Order ist.

Jetzt kannst Du mit Time[0] verhindern, dass der EA die gleiche Funktion im gleichen Bar ausführt.

Der EA sieht: Bedingung ist gegeben! Mom...hab ich ja in diesem Bar schonmal gemacht.

Also bricht er diese Funktion ab und geht über zum nächsten Vorgang!

 

Das Ganze ist jetzt etwas salopp gesagt.

 

lg NC

Geschrieben

Jetzt kannst Du mit Time[0] verhindern, dass der EA die gleiche Funktion im gleichen Bar ausführt.

Der EA sieht: Bedingung ist gegeben! Mom...hab ich ja in diesem Bar schonmal gemacht.

... oder du läßt immer nur eine aktive Position zu.

Sobald dir ein Einstiegssignal generiert wurde setzt du ein Flag (PositionAktiv). Wenn dieses Flag gesetzt ist kontrollierst du einfach die Einstiegsbedingung nichtmehr.

Wenn die Position dann wieder geschlossen wurde, dann setzt du das Flag wieder zurück und von daan kannst du auch wieder neue Signale generiert bekommen.

Etwa so:

start()
{
...
if(!PositionAktiv)
 CheckEinstieg()
...

void CheckEinstieg()
{
 if(Einstiegskriterium)
 {
   ...   
  OpenPosition();
 PositionAktiv=true;
...
 }
}

Geschrieben
  • Autor

Ich danke euch erstmal fuer all diese Hilfe die ich von euch bekomme.

 

Ich werde das mal probieren umzusetzen, ich denke, es kommen wahrscheinlich noch andere Fragen, aber ich danke euch riesig erstmal.

 

Probiere das Ganze alles umzusetzen und ich hoffe ich komme damit klar, aber bitte verzeiht mir meine "dummen" Fragen.

 

Danke an alle finde ich echt klasse hier.

Geschrieben

Das sind die Historie Kursdaten. Da dein Indikator eine Schleife benutzt. Die bei der 1. BAR beginnt und letzten BAR endet.

Wenn du das nicht möchtest Arbeite mit TIME[0].

Hallo,Frage

ist der Befehl " if (TradeOnlyNewBar) ",gleichzusetzen mit Time(0).????

wenn nicht,wodurch unterscheiden sie sich.?

Bis bald

Geschrieben

Hallo,Frage

ist der Befehl " if (TradeOnlyNewBar) ",gleichzusetzen mit Time(0).????

wenn nicht,wodurch unterscheiden sie sich.?

Bis bald

Ein "TradeOnlyNewBar" gibt es so in mql4 nicht. Das muss vorher irgendwie berechnet worden sein.

Time[0] gibt dir die Startzeit des aktuellen Bars zurück, also eine Uhrzeit.

 

Wie auch immer das "TradeOnlyNewBar" berechnet wird, es kann nicht das gleiche wie Time[0] sein.

Geschrieben

Ein "TradeOnlyNewBar" gibt es so in mql4 nicht. Das muss vorher irgendwie berechnet worden sein.

Time[0] gibt dir die Startzeit des aktuellen Bars zurück, also eine Uhrzeit.

 

Wie auch immer das "TradeOnlyNewBar" berechnet wird, es kann nicht das gleiche wie Time[0] sein.

 

ja es muß vorher aufgerufen werden mit " extern bool TradeOnlyNewBar = true; "

das natürlich nicht von mir,sondern von einem E/A.

Geschrieben

" extern bool TradeOnlyNewBar = true; "

Ach so, du hast einen EA, wo du das einstellen kannst :nictation:

 

Damit kannst du dann halt wohl auswählen, ob dein System nur bei jedem neuen Bar einmal berechnet wird, oder ob die Berechnung kontinuierlich läuft.

Mit "TradeOnlyNewBar" konfigurierst du also nur eine Berechnung, die ähnlich der abläuft, wie sie in einem der ersten Posts schon gezeigt wurde...

Geschrieben
  • Autor

Also, ich habe die Indikatoren mit iCustom auslesen können ( tolle Sache das ! :nictation: ) und ich muss mich nicht mal mit dem

 

Quellcode umherschlagen.

 

Aber eine Frage habe ich dennoch, ich habe hier so ein Wert manchmal im buffer 214748364, wie kommt denn der grosse Wert zustande ?

 

Wie kann ich den denn abfragen, mit " Bufferwert > 100 dann mache irgendwas " z.B. oder ?

 

Ich stehe da echt aufm Schlauch, jetzt habe ich wieder nur Null durchblick.

Geschrieben

Aber eine Frage habe ich dennoch, ich habe hier so ein Wert manchmal im buffer 214748364, wie kommt denn der grosse Wert zustande ?

 

...ich muss mich nicht mal mit dem Quellcode umherschlagen.

Vielleicht doch :nictation:.

 

Es stimmt auf alle Fälle was nicht in deinem System. Der von dir genannte Wert ist der EMPTY_VALUE. Jede nichtinitialisierte Buffer-Variable, die du verwendest hat diesen Wert.

 

Folgendes könnte die Ursache sein:

a) Der Indikatorwert, den du aus deinem EA ausliest existiert zum Auslesezeitpunkt noch garnicht

b) Dein Indikator setzt diese Wert bewußt (oder aufgrund eines Fehlers im Indikator) auf EMPTY_VALUE

c) du greifts auf einen falschen Buffer zu

d) die Anzahl der Parameter, die du an den Indikator übergibst, sind falsch

und vielleicht noch andere, auf die ich grad nicht komme.

 

Wenn es nur sporadisch auftritt, dann tippe ich auf a) oder b). Du kannst mal versuchen, iCustom mit einem Shift aufzurufen, um sicherzugehen, daß der Indikatorwert zum Auslesezeitpunkt auch schon wirklich existiert. Wenn du den EMPTY_VALUE dann immer noch bekommst, müsstest du mit einer Print()-Anweisung genauer debuggen, unter welchen Konstellationen es dazu kommt.

Geschrieben
  • Autor

Vielleicht doch :birdie:.

 

Es stimmt auf alle Fälle was nicht in deinem System. Der von dir genannte Wert ist der EMPTY_VALUE. Jede nichtinitialisierte Buffer-Variable, die du verwendest hat diesen Wert.

 

Folgendes könnte die Ursache sein:

a) Der Indikatorwert, den du aus deinem EA ausliest existiert zum Auslesezeitpunkt noch garnicht

b) Dein Indikator setzt diese Wert bewußt (oder aufgrund eines Fehlers im Indikator) auf EMPTY_VALUE

c) du greifts auf einen falschen Buffer zu

d) die Anzahl der Parameter, die du an den Indikator übergibst, sind falsch

und vielleicht noch andere, auf die ich grad nicht komme.

 

Wenn es nur sporadisch auftritt, dann tippe ich auf a) oder b). Du kannst mal versuchen, iCustom mit einem Shift aufzurufen, um sicherzugehen, daß der Indikatorwert zum Auslesezeitpunkt auch schon wirklich existiert. Wenn du den EMPTY_VALUE dann immer noch bekommst, müsstest du mit einer Print()-Anweisung genauer debuggen, unter welchen Konstellationen es dazu kommt.

 

 

Ich habe mit iCustom, eine Bar/Kerze geshiftet und dort habe ich einen Wert gehabt. Ich habe die Werte vom Indikator und benutze sie nach der Reihenfolge, so wie in der iCustom() Beschreibung.

 

Aber ich weiss jetzt, dass ich ein logisches Problem hatte, habe && mit || verwechselt ( schäm).

 

War ein guter Tipp, Danke vielmals.

 

Noch ne andere Frage, ich möchte den EA abschalten zu den News Zeiten, damit ich kein so aggresives Kursverhalten habe.

 

Kann man das bei MT4 irgendwie einstellen oder programmieren ?

Geschrieben

Noch ne andere Frage, ich möchte den EA abschalten zu den News Zeiten, damit ich kein so aggresives Kursverhalten habe.

 

Kann man das bei MT4 irgendwie einstellen oder programmieren ?

Programmieren kann man das schon. Du könntest dir zum Beispiel ein einfaches *.csv File machen, in dem du pro Zeile 2 Daten reinschreibst. Das erste Datum ist die Zeit, zu dem der EA das Handeln einstellen soll, das Zweite, wenn er wieder beginnen darf (wohl die bequemste Lösung, da du mehrere Tage im voraus definieren kannst).

Oder einfacher, du definierst dir 2 Parameter (OrderStopTime und OrderAllowedTime) und frägst dann mit

if(TimeCurrent()>=OrderStopTime && TimeCurrent<=OrderAllowedTime) 
 StopEA=true;
else
 StopeEA=false;

ab, ob das Handeln erlaubt ist. Mit "StopEA" kannst du dann ja deine Signalberechnung überspringen oder evtl. offene Positionen schließen.

 

Mußt halt dann die Stopzeiten täglich manuell eingeben.

  • 2 Monate später...
Geschrieben
  • Autor

Wie bekomme ich es hin, dass der EA erst bei der abgeschlossenen Minute z.B. startet.

 

D.h. ich schalte ihn um 10:58 Uhr und 34 sec. an.

 

Er soll aber erst exakt oder so genau wie möglich um 10:59 und 0 sec. anfangen zu rechnen.

 

 

Danke schon mal im Voraus

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.