FinGeR Posted January 21, 2009 Report Posted January 21, 2009 der Wert ist 0wenn 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 0kannst du es auch so schreibenint pommes, nudeln, Bulette; // die haben alle NullWICHTIG 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...---
Mythos Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: wenn du aber mehrer Variablen hast die erstmal ohne Wert sein sollen oder ebend 0kannst du es auch so schreibenint pommes, nudeln, Bulette; // die haben alle NullWenn 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 ;)
FinGeR Posted January 21, 2009 Report Posted January 21, 2009 man lernt nie aus... Danke das habe ich nicht gewusst.
Mythos Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: 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 ;)
bullseye Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: ja natürlich "pommes" ist OK Geile Frage Klasse Antwort.
FinGeR Posted January 21, 2009 Report Posted January 21, 2009 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 geladenund 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 ELSEif(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 Anfangif(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"); }
Mythos Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: 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? (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 ;)
Mythos Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: 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...)
FinGeR Posted January 21, 2009 Report Posted January 21, 2009 ich glaube Jörg und Co. werden jetzt das Handuch* werfen....oder werden sie die Fehler finden? *Handtuch
FinGeR Posted January 21, 2009 Report Posted January 21, 2009 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!
MRalph67 Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: ich glaube Jörg und Co. werden jetzt das Handuch werfen....oder werden sie die Fehler finden? Ich verstehe nur Bahnhof. Aber ich finde die Umsetzung genial. Kann man diese Programmierung lernen, selbst wenn man niemals eine Zeile Programmiercodierung geschrieben hat?Es hört sich alles so leicht an, aber ich wüsste trotzdem nicht, wo ich anfangen sollte. Selbst die #Pommes# sind mir zu hoch
FinGeR Posted January 21, 2009 Report Posted January 21, 2009 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.
Mythos Posted January 21, 2009 Report Posted January 21, 2009 FinGeR said: ich glaube Jörg und Co. werden jetzt das Handuch* werfen....oder werden sie die Fehler finden?Um die Verwirrung zu erhöhen: Ich würds wieder nicht Fehler nennen (falls wir das gleiche meinen), eher unerwünschtes Verhalten. In eclipse würde hier sogar der Compiler warnen mit einer Meldung ala "Bist du dir sicher was du da tust?" FinGeR said: Teil der Challenge! Ich hab nix gesagt
Mythos Posted January 21, 2009 Report Posted January 21, 2009 MRalph67 said: Kann man diese Programmierung lernen, selbst wenn man niemals eine Zeile Programmiercodierung geschrieben hat? Machbar auf alle Fälle, man sollte sich da nur zuerst die "Grundlagen vom Programmieren" aneignen. Also so Sachen wie "Was ist eigentlich ein Programm?", "Was ist eine Variable?", "Was bedeutet Programmablauf?" etc. Ich weiß, sobald man mit Programmieren was zu tun hat sind die Fragen kindisch, aber sie sind grundlegend, um eine Chance zu haben ein Programm zu verstehen. (Find ich halt) Liest du gern? ;) Falls ja, kann ich dir unser "Skriptum" für die allererste Programmiervorlesung von der Uni empfehlen, es ist nur inzwischen als Buch erschienen. "Softwareentwicklung in C" von Klaus Schmaranz Quote Dieses Buch ist geschrieben für alle, die gerne die Programmiersprache C lernen wollen, egal welche Erfahrung sie schon mitbringen. Ich weiß, C ist nicht MQL, aber wenn du die Grundzüge von C verstanden hast, ist MQL ein Kinderspiel ;)
siscop Posted January 21, 2009 Report Posted January 21, 2009 (edited) Ich finde das Spiel super von euch. KLASSE… 1A Mich würde Interessieren was der Compiler dazu sagt. Denke mal annehmen müsste er es mit einer kleinen Warnung. Wenn sich einer die Mühe macht dies mal zu kompilieren hätte ich Interesse daran was der Compiler dazu sagt. Edited January 21, 2009 by siscop
FinGeR Posted January 21, 2009 Report Posted January 21, 2009 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...
bullseye Posted January 21, 2009 Report Posted January 21, 2009 Mythos said: Also so Sachen wie "Was ist eigentlich ein Programm?", "Was ist eine Variable?", "Was bedeutet Programmablauf?" etc. Ich glaube darum dreht sich alles. Wenn man die Basics kapiert hat, kommt man fast automatisch zum nächsten Schritt.Ich bin noch nicht ganz soweit.
Mythos Posted January 22, 2009 Report Posted January 22, 2009 siscop said: Wenn sich einer die Mühe macht dies mal zu kompilieren hätte ich Interesse daran was der Compiler dazu sagt. Welcher Codeteil jetzt genau? bullseye said: Ich glaube darum dreht sich alles. Wenn man die Basics kapiert hat, kommt man fast automatisch zum nächsten Schritt. Stimmt, "automatisch" ist vielleicht ein bissl übertrieben, aber wenn man das Grundprinzip vom programmieren wirklich verstanden hat, ist der Rest (also syntax, Schleifen etc) rein technisch.
siscop Posted January 22, 2009 Report Posted January 22, 2009 Mythos said: Welcher Codeteil jetzt genau?wir sind uns doch einig dass hier was nicht stimmt oder? Quote else {return(0);Print("ist mir zu klein der tp");}
Krümel Posted January 22, 2009 Report Posted January 22, 2009 FinGeR said: ich glaube Jörg und Co. werden jetzt das Handuch* werfen....oder werden sie die Fehler finden? *HandtuchOder doch das Handbuch ?
Mythos Posted January 22, 2009 Report Posted January 22, 2009 siscop said: wir sind uns doch einig dass hier was nicht stimmt oder? jup, wird aber eher keinen Fehler beim Comiler liefern. Ich hab nur gefragt, weil ich ja auch einen Codeteil gepostet hab ;)
Krümel Posted January 22, 2009 Report Posted January 22, 2009 Mythos said: In MQL ist es eigentlich egal, da jede nichtinitialisierte Variable den Wert 0 erhält. ...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 ;)Ist wie bei McDonalds, wo man sich auch erstmal den Tisch abwischt - zur Not mit dem Ärmel -, um die Reste der Voresser zu beseitigen. Ähnlich erreicht man mit einer Initialisierung aller Variablen am Anfang, dass man sich nicht mit den alten Salatblättern und Ketchupflecken im Speicher rumärgern muss und ewig Fehler sucht, die irgendwann später irgendwo anders auftauchen und die man sich da nur schwerlich erklären kann. Besonders kritisch ist es bei Bibliotheken, wo der Benutzer, der nicht zwangläufig der Programmierer sein muss, nicht reingucken kann (da nur die kompilierte Version vorliegt) und die explizite Initialisierung verschläft (weil zu schlecht dokumentiert bzw. nicht eindeutig draufhingewiesen wurde) und dann seinerseits die nicht weggewischten Reste vorfindet und noch weniger nen Plan hat...
Mythos Posted January 22, 2009 Report Posted January 22, 2009 Krümel said: Ist wie bei McDonalds, wo man sich auch erstmal den Tisch abwischt - zur Not mit dem Ärmel -, um die Reste der Voresser zu beseitigen. Ähnlich erreicht man mit einer Initialisierung aller Variablen am Anfang, dass man sich nicht mit den alten Salatblättern und Ketchupflecken im Speicher rumärgern muss und ewig Fehler sucht, die irgendwann später irgendwo anders auftauchen und die man sich da nur schwerlich erklären kann. Genial Formuliert ;) Das ist mal eine praktische Analogie!
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now