Jump to content


Photo

Einstieg zu MT4 Programmierung


Wichtiger Hinweis für Besucher der Community!

Das Erstellungsdatum des von Dir aufgerufenen Themas liegt bereits einige Zeit zurück. Wir möchten darauf hinweisen, den Inhalt der Diskussion auf seine Aktualität hin zu prüfen. Weitere Informationen findest Du auf dieser Seite.

  • Please log in to reply
269 replies to this topic

#41 whipsaw

whipsaw

    Founder

  • Management
  • 13,622 posts
  • 41351 thanks
  • Wohnsitz:Germany

Posted 20 January 2009 - 10:15 AM

@whipsaw: Hilfe zur Selbsthilfe: ja, da bin ich dabei, aber ich verweigere mich, wenn Leute vom Erwerb signifikanter Fähigkeiten abgehalten werden sollen.


Darum gehts, ich hätte es nicht besser formulieren können.


..die Richtung zeigen - klar, Handreichen - selbstverständlich, laufen allerdings muss jeder selber. Zum Ziel getragen zu werden, wäre einseitig, anstrengend, nervig und würde keinen Sinn machen.


An alle, die sich erst neu in die Materie, oder die des CFD Handels, oder was auch immer einarbeiten: Darum geht es! Darum geht es uns.
Und - denkt alle daran, die Coder genauso wie die Trader, die hier ihr Wissen mit anderen teilen, müssen das nicht tun. Das was hier passiert, sollte auch entsprechend gewürdigt werden. Und sei es nur dadurch, dass man selbst mal ein Wörterbuch in die Hand nimmt und nachschlägt bzw. auf die vielen nützlichen Links klickt, die hier gepostet werden.

Edited by whipsaw, 20 January 2009 - 10:19 AM.

  • 0

12.5 / E 12° 30' 0'' | 48.6833 / N 48° 41' 0'' CAVEAT EMPTOR

Nanex©2012 - Market Events and Phenomena [ Link ]

 

 

 metatrader-wiki.com

247-365.info
... 24/7 up2the minute news 365 days a year

Community Feeds powered by 



DDOS vs. LLOD

 

 


Thanked by 2 Members:
Krawummska , nizo1

#42 infojoerg

infojoerg

    Floor Trader

  • Addict
  • PipPipPipPip
  • 107 posts
  • 317 thanks

Posted 20 January 2009 - 08:55 PM

Ich hätte da mal eine kleine Zwischenfrage ich hoffe die ist nicht zu einfach:

Ich habe das kleine Programm mal kopiert und in den MetaEditor eingefügt. Wie kann ich das jetzt ausprobieren. Ich schätze mal zuerst Kompilieren, oder? Und was dann? Wie bringe ich es dann zum laufen, das es anzeigt was ich haben will?

Grüsse Jörg

Edited by infojoerg, 20 January 2009 - 08:56 PM.

  • 0

Thanked by 1 Member:
Krawummska

#43 Mythos

Mythos

    TEFEx CEO

  • Moderatoren
  • 3,482 posts
  • 16713 thanks

Posted 20 January 2009 - 10:09 PM

Ich habe das kleine Programm mal kopiert und in den MetaEditor eingefügt. Wie kann ich das jetzt ausprobieren. Ich schätze mal zuerst Kompilieren, oder? Und was dann? Wie bringe ich es dann zum laufen, das es anzeigt was ich haben will?


Genau, mit dem Button kompilieren wird die *.ex4 datei erzeugt, die dann im Terminal verwendet wird.
Um es zu verwenden gehst du einfach in den MetaTrader (vom MetaEditor aus am einfachsten per Klick auf "Terminal") und ziehst den ExpertAdvisor/Script/Indikator (je nachdem als was du es erstellt hast) aus dem Navigator auf den Chart, auf dem du es anwenden willst.

Die Comments erscheinen direkt im Chartfenster, die Print() Anweisungen geben die Info im Terminal im Reiter "Experten" aus und alerts werden in einem PopUp angezeigt.

HTH
  • 0

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

Einstein


Es ist nicht deine Schuld, das die Welt ist wie sie ist. Es wär nur deine Schuld wenn sie so bleibt.


#44 infojoerg

infojoerg

    Floor Trader

  • Addict
  • PipPipPipPip
  • 107 posts
  • 317 thanks

Posted 21 January 2009 - 04:07 PM

Ich habe glaube ich den Fehler gefunden.

double AddiereFürMich(int a, int b)
{
return(a+b);
}


müßte richtig heißen

double Addiere FürMich(double a, double b)


Stimmt das? Auf jeden Fall stimmt bei mir dann das Ergebnis. Habe wegen Zeitmangel etwas länger gebraucht.

Gruss Jörg

P.S.
Ich wollte auch mal Dank sagen an alle die so bereitwillig Erklärungen abgeben. Ihr seid echt spitze.
  • 0

Thanked by 1 Member:
Krawummska

#45 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 04:11 PM

Ich habe glaube ich den Fehler gefunden.
müßte richtig heißen

double Addiere FürMich(double a, double b)
Stimmt das? Auf jeden Fall stimmt bei mir dann das Ergebnis. Habe wegen Zeitmangel etwas länger gebraucht.

Gruss Jörg

P.S.
Ich wollte auch mal Dank sagen an alle die so bereitwillig Erklärungen abgeben. Ihr seid echt spitze.


:yep: sehr gut! :bbg:
ich gebe dir aber nur ne 1+ :bbg:
  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

Thanked by 1 Member:
Krawummska

#46 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 04:30 PM

weiter gehts...

double MacdCurrent, MacdPrevious, SignalCurrent;   double SignalPrevious, MaCurrent, MaPrevious;   int cnt, ticket, total;

was passiert hier?
müsste ja jetzt jeder Wissen.
mit einem double oder int mehrere Variablen deklarieren ist auch möglich(optional).

Nun die Frage warum stehen sie dort und nicht auch ganz am Anfang wie die anderen Variablen?

Diese Variblen werden in einer Funktion(start()) erstellt(deklariert).
sie sind dadurch nicht Global wie die anderen
das heisst sie arbeiten nur in dieser Funktion(start()) und nicht ausserhalb.

Desweiteren ist Wichtig zu Wissen dadurch das Funktionen mehrmals aufgerufen werden können
wie z.b. diese start() bei jedem Tick durchlaufen wird werden die Variablen auch jedes mal neu deklariert.

Ein Beispiel der 1. Tick = start() Funktion wird durchlaufen:
deklariert diese Variablen
double MacdCurrent, MacdPrevious, SignalCurrent;   double SignalPrevious, MaCurrent, MaPrevious;   int cnt, ticket, total;
in unserem Fall werden sie automatisch alle auf 0 bzw. 0.0 gesetzt

sie können wärend des durchlaufs einen Wert zugewiesen bekommen z.b.
cnt = 5;

beim 2. Tick = start() Funktion wird wieder durchlaufen:
und diese Variablen wieder auf 0 gesetzt da sie am Anfang wieder neu deklariert werden.
also ist unser cnt wieder 0 (solange bis sie wieder einen Wert zugewiesen bekommt)

das ist Wichtig zu Wissen!
  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

Thanked by 1 Member:
Paspartout

#47 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 06:06 PM

nur mal so nebenbei...
Von meinen Rechtschreib und Grammatikfehlern mal ganz abgesehen... Erkläre ich alles einwenig "Locker vom Hocker"
nicht so sehr prof. aber ich glaube doch auf den Punkt kommend verständlich.


:bbg:
  • 1

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

Thanked by 3 Members:
remon , Paspartout , Kleinerbroker

#48 ronner

ronner

    T(r)ickTrader

  • SuperMod
  • 6,575 posts
  • 18317 thanks
  • Wohnsitz:L.E. but not L.A.

Posted 21 January 2009 - 06:37 PM

nicht so sehr prof. aber ich glaube doch auf den Punkt kommend verständlich.[/i]


selbstverständlich - manche Deutsche können schlechter deutsch sprechen als Du schreibst :bbg: :bbg:
  • 0

247-365.info
Börsen-News
a division of tom-next.com


Wichtig:
Alle von mir gemachten Aussagen und Antworten auf Fragen entsprechen lediglich meiner persönlichen Meinung und stellen keinerlei Rechts- oder Anlageberatung dar.


Thanked by 1 Member:
Paspartout

#49 Mythos

Mythos

    TEFEx CEO

  • Moderatoren
  • 3,482 posts
  • 16713 thanks

Posted 21 January 2009 - 06:46 PM

Von meinen Rechtschreib und Grammatikfehlern mal ganz abgesehen... Erkläre ich alles einwenig "Locker vom Hocker"
nicht so sehr prof. aber ich glaube doch auf den Punkt kommend verständlich.


Ich finds super lesbar und (vor allem für Anfänger) super verständlich! :bbg:
Ich würds vermutlich nicht so schön hinkriegen :bbg:
  • 0

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

Einstein


Es ist nicht deine Schuld, das die Welt ist wie sie ist. Es wär nur deine Schuld wenn sie so bleibt.


#50 infojoerg

infojoerg

    Floor Trader

  • Addict
  • PipPipPipPip
  • 107 posts
  • 317 thanks

Posted 21 January 2009 - 07:44 PM

Die Variablen die hier gesetzt werden können irgendwie benannt werden, oder?

Ist es egal ob ich die Variablen
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt, ticket, total;

oder

double hamburger, cheesburger, pommes;
double eins, zwei, drei;
int fritz, paul, eva;

nenne, oder?

Bis hierhin hat die Variable ja noch keinen Wert und weiss nicht was sie für eine Aufgabe hat oder gibt es vordefinierte Variablen auch?

lg Jörg
P.S. Die Erklärungen sind 1a großen Respekt.
  • 0

#51 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 07:54 PM

der Wert ist 0
wenn keine Wert gegeben wird

ja natürlich "pommes" ist OK

wenn du Pommes einen Wert geben möchtest
musst du das aber einzeln tun.
int pommes = 4;

wenn du aber mehrer Variablen hast die erstmal ohne Wert sein sollen oder ebend 0
kannst du es auch so schreiben
int pommes, nudeln, Bulette; // die haben alle Null

WICHTIG MQL4 achtet auf Gross und Kleinschreibung!


Pommes sind nicht gleich pommes
(als MQL4 sieht das so aus)
if (Pommes != pommes) Sosse=rot // wenn Pommes ungleich pommes ist Sosse gleich rot

dann kommen wir auch gleich zum nächsten Abschnitt vom Code...
---
  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

Thanked by 1 Member:
Paspartout

#52 Mythos

Mythos

    TEFEx CEO

  • Moderatoren
  • 3,482 posts
  • 16713 thanks

Posted 21 January 2009 - 08:23 PM

wenn du aber mehrer Variablen hast die erstmal ohne Wert sein sollen oder ebend 0
kannst du es auch so schreiben

int pommes, nudeln, Bulette; // die haben alle Null

Wenn man EAs schreibt, die man vielleicht mal debuggen, erweitern muss/will. Oder die auch andere verstehen sollen. Und zum Ausschließen von Fehlern, ist es IMO besser wenn man zwischen "ohne Wert deklarieren" und "Mit Wert 0 initialisieren" unterscheidet.

Sprich:
Wenn ich die Variable pommes haben will, diese aber noch keinen Wert haben muss, weil er sowieso kurz später initialisiert wird dann:
int pommes;
Ist es aber Programmtechnisch wichtig, das pommes auf 0 initialisiert wird. Dann ist es schöner, wenn man dies explizit macht:
int pommes= 0;
anstatt die automatische Initialisierung zu verwenden. (Bei zB C wird nicht immer auf 0 initialisiert, da handelt man sich dann nur ärger ein ;)
  • 0

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

Einstein


Es ist nicht deine Schuld, das die Welt ist wie sie ist. Es wär nur deine Schuld wenn sie so bleibt.


Thanked by 1 Member:
Paspartout

#53 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 08:26 PM

man lernt nie aus...
Danke das habe ich nicht gewusst.
  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

#54 Mythos

Mythos

    TEFEx CEO

  • Moderatoren
  • 3,482 posts
  • 16713 thanks

Posted 21 January 2009 - 08:59 PM

man lernt nie aus...
Danke das habe ich nicht gewusst.


In MQL ist es eigentlich egal, da jede nichtinitialisierte Variable den Wert 0 erhält. Bei Erweiterungen von Code wirds nur witzig, wenn man dann denkt, das die Variable hier noch keinen Wert haben muss (weil auf keinen initialisiert), dann was damit macht, und dann draufkommt das sie später plötzlich nicht mehr 0 ist oder so ;)

In C ist halt erst recht lustig, weil die Variable dann wirklich den Wert hat, der gerade zufällig dort im Speicher war. immer wieder lustiges debuggen, weil meist ist es 0, aber eben nit immer ;)
  • 0

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

Einstein


Es ist nicht deine Schuld, das die Welt ist wie sie ist. Es wär nur deine Schuld wenn sie so bleibt.


Thanked by 1 Member:
Paspartout

#55 bullseye

bullseye

    Floor Broker

  • *_skilled
  • 231 posts
  • 482 thanks

Posted 21 January 2009 - 09:10 PM

ja natürlich "pommes" ist OK



Geile Frage :bbg: Klasse Antwort. :bbg:
  • 0
Don't call it Schnitzel...

#56 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 09:20 PM

if(Bars<100)  //Bars gibt die Anzahl der Balken(Candle) auf dem Chart zurück.	 {	  Print("bars less than 100");	  return(0);  //Abbruch der Funktion und 0 zurückgeben !(bis zum nächsten Aufruf)	 }   if(TakeProfit<10) // TakeProfit ist eine Variable 	 {	  Print("TakeProfit less than 10");	  return(0);  //Abbruch der Funktion und 0 zurückgeben !(bis zum nächsten Aufruf)	 }


OK, es hat im Expert getickt oder der Script wurde geladen
und steht nun dort vor diese IF Anweisung.

IF heisst soviel wie
WENN! DANN!
WENN NICHT! DANN ÜBERSPRINGEN! und
normal WEITER!


if(a==1) Print("a=1");
hier brauchen wie keine Grenzen also Klammern{} für unser "Anweisung IF" wenn sie zutrifft.
weil nur 1 Zeile benötigt wird.(ist aber optional man kann trozdem eine Klammer benutzten)

Wenn wir aber mehr Zeilen benötigen benutzten wir diese Klammern {}
hier benutzen wir 2 Zeilen 1.für Print() 2.für alert()
if(a==1) { Print("a=1");alert("Schade aber a ist 1");}

in beide Fälle wird der code danach weiter abgearbeitet.
wenn die IF Anweisung zutrifft wird das was in {} steht ausgeführt und weiter gehts.

so, jetzt gibt es natürlich die Möglichkeit zu sagen
wenn IF nicht zutrifft machen etwas anderes und arbeite danach den anderen code normal weiter ab.

dafür benutzten wir ELSE
if(a==1) Print("a=1"); else (Print("a ist ungleich 1"));Print("ich arbeite den code jetzt weiter Ab egal was IF ergab.");

bei mehr als 1 Zeile benutzten wir wieder diese {} (als ANFÄNGER benutzt immer diese Klammern. )
if(a==1) { Print("a=1");alert("Schade aber a ist 1");} else{Print("a ist ungleich 1");alert("a ist ungleich 1");}Print("und ich arbeite den code jetzt weiter Ab egal was IF ergab.");

so, und nun aber was ist wenn wir nicht wollen das der code weiter abgearbeitet werden soll,
sondern ein STOP! an dieser stelle des Codes.

dafür benutzten wir return; oder return();
wie am Anfang Erklärt gibt return(0) unserer Funktionint start() {...}
das Ergebniss des durchlaufs zurück also?
int = 0richtg!
aber auch hat dieses return() die Eigenschaft den durchlauf des codes der Funktion genau an dieser Stelle zu stoppen!
in diesem Beispiel
if(a==1) { Print("a=1");alert("Schade aber a ist 1");} else return(0); //hier Stop die Funktion wenn a ungleich 1 ist!Print("wenn a ungleich 1 ist wirst du mich nicht Lesen können");
In diesem Beispiel wird der code gestoppt wenn a ungleich 1 ist.
Das nächste Print() wird dann nicht mehr ausgeführt.(wichtig beim nächsten Aufruf der Funktion fängt sie natürlich wieder von vorne an. die Funktion) :bbg:

hier nochmal die Möglichkeiten für den Anfang
if(a==b); //wenn a = b  if(a>b); //wenn a grösser b  if(a<b); //wenn a kleiner b if(a!=b); //wenn a ungleich b


So jetzt bitte sagt mir was genau macht dieser folgene Code?(schaut euch diesen code genau an.)
Einen kleinen Fehler habe ich auch eingebaut. Findet ihn.
(erst dann gehts weiter!)

double TakeProfit = 50;if(Bars<100)	 {	  Print("bars less than 100");	  return(0);  	 }   if(TakeProfit>50)	 {	  Print("TakeProfit grösse wie 50");	 } else {return(0);Print("ist mir zu klein der tp");}

  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

#57 Mythos

Mythos

    TEFEx CEO

  • Moderatoren
  • 3,482 posts
  • 16713 thanks

Posted 21 January 2009 - 09:40 PM

bei mehr als 1 Zeile benutzten wir wieder diese {} (als ANFÄNGER benutzt immer diese Klammern. )


kleines Beispiel warum man IMMER (vor allem als Anfänger) diese Klammern verwenden sollte:

Beispiel wir schreiben eine kleine if Anweisung:
if(fehler == true)  return(0);
Sprich wenn die boolsche Variable (eine Variable die true oder false sein kann) "fehler" wahr ist, brechen wir das Programm ab.

Nach ein paar Tagen testen denken wir uns "Wir sollten nicht nur abbrechen, sondern dem User auch sagen das ein Problem vorliegt". Also ändern wir den Code auf:
if(fehler == true)  alert("Irgendwas ist schief gelaufen");  return(0);

Und jetzt die Preisfrage: Was ist bei dieser Änderung wirklich schief gelaufen, und warum sitzt der Entwickler jetzt weitere 3 Stunden und wundert sich warum der EA plötzlich seltsam reagiert? :bbg: (zugegeben, ist schon eher eine fortgeschrittene Frage, aber es macht auch für Anfänger Sinn sich darüber gedanken zu machen, bevor man die Lösung erfährt ;)
  • 0

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

Einstein


Es ist nicht deine Schuld, das die Welt ist wie sie ist. Es wär nur deine Schuld wenn sie so bleibt.


#58 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 09:44 PM

danke
genau mit Fehlersuche lernt man.
  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ

#59 Mythos

Mythos

    TEFEx CEO

  • Moderatoren
  • 3,482 posts
  • 16713 thanks

Posted 21 January 2009 - 09:46 PM

double TakeProfit = 50;if(Bars<100)	 {	  Print("bars less than 100");	  return(0);  	 }   if(TakeProfit>50)	 {	  Print("TakeProfit grösse wie 50");	 } else {return(0);Print("ist mir zu klein der tp");}

Die Frage klingt jetzt vielleicht blöd, aber: ist die "schwere" Lesbarkeit (was den Programmablauf angeht) von dem Codestück Absicht oder hat das die Code-Umgebung produziert? Aufgrund der Klammerung ist es nur schwer ersichtlich zu welchem if dieses else gehört. (Order ist das Teil der Challenge? ;)

Zu "Bars" vielleicht auch noch eine Anmerkung: Bars ist auch eine Variable, jedoch eine bereits von MQL intern verwendete Variable, die immer als Wert die Anzahl der vorhandenen Bars hat, Vordefinierte Variablen dürfen nicht verändert werden (man kann nur den Wert auslesen, aber keinen neuen Wert zuweisen), das wird vom Compiler verhindert. (weitere vordefinierte Variablen: Close, Open, High, Low, Time, Volume, Bid, Ask...)
  • 0

Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid.

Einstein


Es ist nicht deine Schuld, das die Welt ist wie sie ist. Es wär nur deine Schuld wenn sie so bleibt.


Thanked by 1 Member:
nizo1

#60 FinGeR

FinGeR

    ✫ MetaTrader ✫

  • Developer
  • 948 posts
  • 3829 thanks
  • Wohnsitz:Halberstadt

Posted 21 January 2009 - 09:49 PM

ich glaube Jörg und Co. werden jetzt das Handuch* werfen....
oder werden sie die Fehler finden? :bbg:

*Handtuch
  • 0

Dies ist ein zentrierter Absatz. align="right">Dies ist ein Absatz, der rechtsbündig ausgerichtet ist.

Rechts? 👀👉align="right">

ALǝPiǝ


Wichtiger Hinweis für Besucher der Community!

Das Erstellungsdatum des von Dir aufgerufenen Themas liegt bereits einige Zeit zurück. Wir möchten darauf hinweisen, den Inhalt der Diskussion auf seine Aktualität hin zu prüfen. Weitere Informationen findest Du auf dieser Seite.


1 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users


    Bing (1)