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.

Einstieg zu MT4 Programmierung

Geschrieben

Hallo,

 

ich hätte da mal eine Frage:

Was benötigt man um überhaupt für mt4 Programmieren zu können?

Welche Standartsoftware ist damit gemeint.

 

Woher bekomme ich diese?

 

Grüsse

Jörg

  • Antworten 269
  • Aufrufe 81Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • Also wenn dein Code im Indikator aufgerufen wird, brauchst du auf jedem Fall die Funktion iBarShift, wie ich es oben beschrieben habe, aus dem ExpertAdvisor wird auch so funktionieren. Schau wirklich

  • 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 MQL

  • Das ist eigentlich kein Bug Du gibst in dem iHigh(NULL, 15, 1) in dem Parameter Barshift 1 an, das ist falsch. In dem Strategietester wird dieser Bar immer den gleichen Wert zurückgeben, nämlich Hi

Veröffentlichte Bilder

Featured Replies

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

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

Geschrieben

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

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

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

Geschrieben

ich glaube Jörg und Co. werden jetzt das Handuch* werfen....

oder werden sie die Fehler finden? :bbg:

 

*Handtuch

Geschrieben

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:

Geschrieben
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

Geschrieben

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.

Geschrieben
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:

 

Teil der Challenge! :bbg:

 

Ich hab nix gesagt :bbg:

Geschrieben
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

 

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

Geschrieben

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.

Bearbeitet von siscop

Geschrieben

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

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

Geschrieben
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?

 

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.

Geschrieben
Welcher Codeteil jetzt genau?

wir sind uns doch einig dass hier was nicht stimmt oder?

else {

return(0);

Print("ist mir zu klein der tp");

}

Geschrieben
ich glaube Jörg und Co. werden jetzt das Handuch* werfen....

oder werden sie die Fehler finden? :top:

 

*Handtuch

Oder doch das Handbuch ? :top:

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

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

Geschrieben
  • Autor

Hey Leute,

 

ich bin noch nicht raus. Ich bin gerade nur ziemlich eingespannt. Aber ich komme auf jeden Fall zurück. Und noch etwas sehr erfreuliches, daß was ihr hier mit mir und den anderen vollzieht ist Training aller erster Sahne. Ich glaube da hat wirklich jeder Anfänger etwas davon.

 

Vielen Dank für Eure Mühe.

 

Grüsse Jörg

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.