Jump to content
Tom Next - Daytrading Community

Recommended Posts

Posted

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...

---

Posted
  FinGeR said:
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 ;)

Posted
  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 ;)

Posted

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");
}

Posted
  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? :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 ;)

Posted
  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...)

Posted

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! :bbg:

Posted
  FinGeR said:
ich glaube Jörg und Co. werden jetzt das Handuch werfen....

oder werden sie die Fehler finden? :bbg:

 

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. :bbg:

Selbst die #Pommes# sind mir zu hoch

Posted

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.

Posted
  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?" :bbg:

 

  FinGeR said:
Teil der Challenge! :bbg:

 

Ich hab nix gesagt :bbg:

Posted
  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 ;)

Posted (edited)

Ich finde das Spiel super von euch. KLASSE… 1A :bbg:

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 by siscop
Posted

so... und weiter gehts.....

 

also wenn die beiden IF Anweisungen durchbrochen wurden :bbg:

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, :bbg:

erst die Fehlersuche. Dann gehts weiter...

Posted
  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.

Posted
  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.

Posted
  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 ;)

Posted
  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...

Posted
  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!

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...