Alle Inhalte von FinGeR
-
Einstieg zu MT4 Programmierung
habe ich einwenig komisch erklärt an der 2. Stelle in der Klammer folgt der Timeframe in Minute 0 oder NULL (es wird der vom Chart benutzt wo eure code gelade wurde) 1 oder PERIOD_M1 5 oder PERIOD_M5 15 oder PERIOD_M15 30 oder PERIOD_M30 (es wird TF 30 Minuten benutzt egal wo ihr den code geladen habt) 60 oder PERIOD_H1 240 oder PERIOD_H4 1440 oder PERIOD_D1 10080 oder PERIOD_W1 43200 oder PERIOD_MN1 also wenn ihr euren code(expert,script...) z.b. in das Chartfenster EURUSD M5 läd könnt ihr trozdem die Indikatordaten abrufen von z.b. GBUSD M30
-
Einstieg zu MT4 Programmierung
Danke Mythos , und in unseren Fall ist es... =iMACD() i steht für Indikator MACD ist der Name des Indikators (WICHTIG nur Standart Indikatoren von MT4 denn für eigen programmierte Indikatoren benutzt man eine andere Funktion) Nur mal so nebenbei... gute MQL4 Programmierer habe ich festgestellt benutzten Anfangsbuchstaben als Kennzeichnung ihres codes. indicator mit i z.b. iMyAverage.mq4 oder i-MyAverage.mq4 expert mit e z.b. eMyAverage.mq4 oder e-MyAverage.mq4 script mit s z.b. sMyAverage.mq4 oder s-MyAverage.mq4 include mit b z.b. bMyAverage.mq4 oder b-MyAverage.mq4 iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); dieser Abruf des Indikators(z.b. MACD) arbeitet auch so ähnlich wie eine Funktion er gibt einen Wert zurück und möchte in () die Parameter haben. das was dieser Indikator zurückgibt er in unsere Variable vor dem = und was sich in Klammer () befindetsind die Parameter Da ein Indikator von kein bis 100... Parameter haben kann werden die Parameter des Indikators in der Mitte der () angegeben also gibt es am Anfang sogenannte feste Parameter und am Ende feste Parameter und dazwischen die Parameter des indikators in Reihenfolge. festen Parameter sind bei jedem Indikator GLEICH! feste Parameter am Anfang sind ZWEI und am Ende der Klammer () EIN Jetzt fang ich aber an zu Schwitzen garnet so einfach zu Erklären bei den ZWEI festen Parametern am Anfang sehen wir (NULL, 0, und am Ende sehen wir den festen Parameter 0); NULL oder 0 ist gleich "0" also egal ob hier NULL oder 0 schreibt. NULL ist ebend nur ein Static String mit dem Wert 0. 0 oder NULL bedeutet für MQL4 als Parameter default benutzten. da der erste Wert das Symbol angibt wird bei 0 das Symbol wo der Code(expert,script...) geladen wurde(z.b. Chartfenster EURUSD) benutzt. man kann aber auch direkt den Symbol Namen angeben als string. z.b. iMACD("GBUSD",0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); oder iMACD("EURUSD",0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); der ZWEITE Parameter gibt den Timframe an auch hier gilt wenn 0 oder NULL benutzte default(Chartfenster wo der script geladen wurde). hier kann man aber auch die Minuten des Timeframe angeben oder den static string z.b. iMACD("GBUSD",60,12,26,9,PRICE_CLOSE,MODE_MAIN,0); oder iMACD(NULL,1440,12,26,9,PRICE_CLOSE,MODE_MAIN,0); die 60 sind 60 Mintuten Timeframe.(H1) die 1440 sind 1440 Minuten(Tages Chart) hier gibt es feste Werte entweder als Zahl oder in Minute als static string: "PERIOD_M1" 1 minute. "PERIOD_M5" 5 minutes. "PERIOD_M15" 15 minutes. "PERIOD_M30" 30 minutes. "PERIOD_H1" 1 hour. "PERIOD_H4" 4 hour. "PERIOD_D1" Daily. "PERIOD_W1" Weekly. "PERIOD_MN1" Monthly. Ein Beispiel läd den Indikator vom Chart 60 Minuten(H1) z.b. iMACD(0,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0); das gleiche wie iMACD(NULL,"PERIOD_H1",12,26,9,PRICE_CLOSE,MODE_MAIN,0); so und jetzt noch das Ende der festen Parameter EINER 0); gibt die BAR an wobei 0 die aktuelle BAR ist und z.b 1 die vorherige BAR und 2 die zweite BAR Rückwärts... usw. vom Timeframe. zum Beispiel: iMACD(NULL,"PERIOD_H1",12,26,9,PRICE_CLOSE,MODE_MAIN,0); gibt den Indikator Wert von der aktuellen BAR iMACD(NULL,"60,12,26,9,PRICE_CLOSE,MODE_MAIN,5); gibt den Indikator Wert von der BAR vor 5 Stunden iMACD(0,"PERIOD_H1",12,26,9,PRICE_CLOSE,MODE_MAIN,12); gibt den Indikator Wert von der BAR vor 12 Stunden und alles was sich zwischen diesen festen Parametern befindet sind die eigentlichen Indikator Parameter also 12,26,9,PRICE_CLOSE,MODE_MAIN, ist der MACD und sollte klar sein. (den das sind die Parameter die man manuell auch einstellen müsste). MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); hier bekommt unsere Variable MaPrevious den "iMA"(Indikator Moving Average) Wert von der vorherigen BAR des Timeframes auch hier gilt wieder das selbe wobei "MATrendPeriod" den Wert für den Moving Averange gibt in Reihenfolge(wie beim manuellen laden des Indikators ins das Chartfenster) Ich hoffe ihr versteht was ich da geschrieben habe.... Einfach mal Experimentieren. und wenn ihr einen Fehler(z.b. die Anzahl am Ende von den festen Parametern sind 2! ) findet oder Ergänzungen... Einfach schreiben Danke
-
Einstieg zu MT4 Programmierung
so... und weiter gehts..... also wenn die beiden IF Anweisungen durchbrochen wurden kommt MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); hier finden wir unsere Variablen wieder Welche? 1. unsere Internen Variablen die nur in der start() Funktion funktionieren. 2. unsere globalen Variablen die im ganzen Code funktionieren(egal ob man ihnen ein Wert zuweist oder ihn abruft) zu 2. sind diese Variablen auch gleichzeitig durch das "extern" im Parameterfenster unseres experts sicht und veränderbar. Was fällt uns noch auf zu 1. auf? Die(Variablen) bekommen einen Wert zugewiesen(=). und zu 2.? Diese Varbiablen haben einen Wert der abgerufen und benutzt wird. fortsetzung folgt...
-
Einstieg zu MT4 Programmierung
gut Jörg ich glaube Mythos hatte auch noch einen Fehler irgendwo...? @Mythos, Krümel Danke für deine, eure Unterstützung...
-
Einstieg zu MT4 Programmierung
so... und weiter gehts..... also wenn die beiden IF Anweisungen durchbrochen wurden kommt das hier // to simplify the coding and speed up access // data are put into internal variables MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); Warte Alex erst kommt die Fehlersuche... Achso ja ist ja gut, erst die Fehlersuche. Dann gehts weiter...
-
Einstieg zu MT4 Programmierung
Wenn du bereit bist jede einzelne Zeile des Codes verstehen zu wollen bis zum ENDE.(egal ob du bei Fragen in Büchern blätterst oder zu Googeln anfängst oder direkt zu Fragen) und wenn es nur dieser code ist "MACD Sample.mq4" heisst die Antwort JA.
-
Einstieg zu MT4 Programmierung
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?;) Teil der Challenge!
-
Einstieg zu MT4 Programmierung
ich glaube Jörg und Co. werden jetzt das Handuch* werfen.... oder werden sie die Fehler finden? *Handtuch
-
Einstieg zu MT4 Programmierung
danke genau mit Fehlersuche lernt man.
-
Einstieg zu MT4 Programmierung
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) 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"); }
-
Einstieg zu MT4 Programmierung
man lernt nie aus... Danke das habe ich nicht gewusst.
-
Einstieg zu MT4 Programmierung
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... ---
-
Einstieg zu MT4 Programmierung
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.
-
Einstieg zu MT4 Programmierung
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!
-
Einstieg zu MT4 Programmierung
sehr gut! ich gebe dir aber nur ne 1+
-
Einstieg zu MT4 Programmierung
Nein solch eine Fehlermeldung mein ich nicht diese war nicht Beabsichtig. das "?" ist normal ein Buchstabe (ä,ö oder ü) da ich Kyrillische Buchstaben habe aktiviert zeig er bei euch dieses "?" und der MQL4 Compiler kann nix damit Anfangen. = Fehlermeldung. Sorry nochmal das war nicht beasichtig. Einfach mal bitte ersetzten mit den richtigen Buchstaben DANKE! da ist noch ein Fehler drin Beabsichtig der Code arbeitet sauber aber prüft das Ergebniss. 4 setzten. Wichtig selbst ausprobieren! Probier es einfach mal selbst mit und ohne ("") nachdem du meine "?" ausgetauscht hast.
-
Einstieg zu MT4 Programmierung
ok ich erhöhe wer den Fehler findet und behebt. bekommt eine 1+ und ein Stipendium für sein 1. eigenes MTS.
-
Einstieg zu MT4 Programmierung
ein kleiner Fehler ist Eingebaut.(prüft das Ergebniss) Wer den Fehler findet bekommt eine 1+.
-
Einstieg zu MT4 Programmierung
die folgene Erklärung von Funktionen bezieht sich nur auf MQL4! Was ist start() ? eine Funktion! Alles was Arbeitet findet immer in Funktionen statt. Ausserhalb von Funktionen geht nix. bei MQL4 gibt es vordefinierte Funktionen und eigene Funktionen der Bereich die Grenzen einer Funktion werden mit diesen { ... } gekenzeichnet. alles was sich dort drin befindet ist die Funktion. einer Funktion kann man Werte mitgeben(Parameter) bevor sie durchlaufen wird. eine Funktion kann nach durchlaufen einen Wert zurückgeben. eine Funktion wird beim normal Aufruf 1x durchlaufen. die Position einer Funktion im Code(oben, unten vor oder nach einer anderen Funktion) ist nur Optisch Wichtig. vordefinierte Funktionen gibt es 3 int init() {...} diese Funktion wird 1x aufgerufen beim reinladen des scripts, experts, indikators ins Chartfenster int deinit {...} diese Funktion wird 1x aufgerufen beim beenden. int start() {...} diese Funktion wird bei jedem neuen Tick aufgerufen. (Wichtig und nur bei scripts 1x ohne das es Ticken muss) eigene Funktionen kann man sich selbst programmieren z.b. int Meine Funktion(int a, int b) {...} int ist das was die Funktion zurückgibt nach ihrem aufruf und durchlauf. int ist ein zahlen wert z.b. 2 oder 3 oder 0 es kann auch double z.b. 5.5562 sein oder eine string z.b. "du hast mich gerade aufgerufen :)" Das was sich in(int a, int b) befindet sind die Parameter die der Funktion mitgegeben werden können. auch das können int, double oder string sein. Ein Beispiel wir möchten uns eine eigene Funktion programmieren der Name : AddiereFürMich diese Funktion addiert uns 2 Werte und gibt das Ergebniss zurück. double AddiereFürMich(int a, int b) { return(a+b); } a und b sind die 2 Werte mit der die Funktion arbeitet(addiert) return gibt zurück ein double(das Ergebniss). hier der Komplette Code + Erklärung im Code das was oben nicht beschrieben wurde. //+------------------------------------------------------------------+ //| Alexander Piechotta (FinGeR) mql4@gmx.de 19.01.2009 //+------------------------------------------------------------------+ /* Wichtig du kannst mich als expert benutzten oder script bedenke wenn du mich als expert benutzt rufe ich solange die start() Funktion auf(jeden Tick) bis du mich beendest.(meine Aufgabe kennst du?) aber wenn du mich als Script lдdst erledige ich meine Aufgabe 1x und beende wieder als Indikator kann du mich so nicht benutzen. :P */ #property copyright "© 2005-2012" #property link "www.metatraders.de" #property show_inputs //ich sorge dafьr das mein Parameterfenster angezeigt wird beim reinalden. extern double a = 5.4; extern double b = 3; void init() { //Comment() zeigt den Text in Klammer auf dem Chart nur oben Links und lцscht den der vorher da stand. Comment("Hallo ich bin die init() sobald es tickt wird die start() Funktion ausgefьhrt und der Text gelцscht", "\n ausser ich bin ein Script dann wird nach mir sofort die start() und dann die deinit() Funktion aufgerufen."); } void start() /// void bedeutet soviel wie NIX also diese Funktion start() gibt nix zurьck { // \n bedeutet eine neue Zeile schrift art, grцsse und Farbe kцnnen nicht verдndert werden. Comment("ich bin die start() Funktion und rechne jetzt und zeige dir ein alert Fenster mit den Ergebniss", "\n ich addiere die beiden Werte von a und b"); alert(AddiereFьrMich(a, b)); double x = AddiereFьrMich(a, b); Print("Ergebnis =", x);//ich zeige diesen Text und das ergebniss in Variable x in MT4 Reiter unten(experts) an. return(0); // immer der Rьckgabewert einer Funktion } void deinit() { Comment("");// ich Loesche alle angezeigten Kommentare. wenn ich beendet werde. } double AddiereFürMich(int a, int b) { return(a+b); } benutzt den MQL4 Editor!
-
Einstieg zu MT4 Programmierung
man seit ihr schnell.... es handelt sich dabei um Variablen die einen Wert zugewiesen bekommen. z.b. double StopLoss = 50.5; z.b. int StopLoss = 50; z.b. int Lindenstrasse = 5; oder draufvorbereitet werden um spaeter einen Wert zu erhalten z.b. int counter; Wichtig wenn sie noch keinen Wert zugewiesen bekommen z.b. int counter; haben sie immer automatisch den Wert 0 beim double den Wert 0.0 Dadurch das diese ganz am Anfang stehen vor der start() Funktion nennt man sie Globale Variablen man hat von Ueberall im Code dieser Datei Zugriff darauf und kann den Wert beliebig veraendern. double und int ist fuer Zahlen Werte wobei double Gleitkommazahlen sind z.b. 4.2 oder 4.2345.. oder 0.01 und int sind 4 oder 2 oder 1 ; bedeutet das ende der Zeile extern zeigt deine Variable im Parameterfenster deines expert,script,indikator
-
Einstieg zu MT4 Programmierung
weiter gehts.... extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26; 5 Fragen. 1. was bedeutet "extern" 2. was bedeutet "double" 3. was bedeutet z.b. "TakeProfit" 4. was bedeutet z.b. "= 50" 5. was bedeutet ";" und die 6. Frage Warum steht das ganz am Anfang?
-
Einstieg zu MT4 Programmierung
Richtig. Informiert den Leser dieser Datei. //fuer eine Zeile... /* fuer mehr Zeilen... */
-
Einstieg zu MT4 Programmierung
ok fangen wir ganz oben an. MACD Sample.mq4 Welche Aufgaben haben diese ersten Zeilen? //+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+
-
Einstieg zu MT4 Programmierung
Ein Tipp von mir schnapp dir die Beispiele* von Metatrader 4 und Versuche jede einzelne Zeile zu verstehen.(und Kommentiere sie für dich verständlich.) bis zum bitteren Ende.(wenn du das ernsthaft durchziehst bis zum Ende fängt das lernen an.) *MACD Sample.mq4 Moving Average.mq4 Wichtig wenn du was nicht verstehst. Frag einfach.
-
MQL Library mit Standardfunktionen