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 (void-Beispiel rausgepickt)

Geschrieben

Hallo zusammen, ich habe aus dem Topic "Einstieg zu MT4 Programmierung" noch mal was rausgeholt.

Dazu habe ich noch mal eine spezielle Frage. Im Origial-Beispiel ist ein Fehler

double AddiereFürMich(int a, int b)

eingebaut, den ich im folgenden Code mal durch

double AddiereFürMich(double a, double b)

korrigiert habe:

//+------------------------------------------------------------------+
//| 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(double a, double b)
 {
   return(a+b);
 }

 

Der Code hat erst funktioniert, als ich die alert-Funktion mit einem Großbuchstaben begonnen habe. Sehr penibel dieses MQL4.

 

Diese Funktion alarmiert immer dann, wenn ein neues Tick-Signal kommt. Das hat doch damit zu tun, dass die start() bei jedem Tick ausgeführt wird, oder?

 

Was auch klasse funktioniert ist, dass durch Comment(""); alle Kommentare gelöscht werden, wenn ich den EA aus dem Chart entferne! Und das liegt daran, dass deinit() nur beim beenden des EA ausgeführt wird, oder?

 

Was ich nicht verstehe ist, warum die Deklarierung von AddiereFürMich ganz unten steht... kann mir das jemand erklären?

Ich versuche mir das mal selbst zu beantworten: Der programmierte EA wird vom MetaTrader zunächt komplett eingelesen! Alle Deklarierungen werden im Speicher abgelegt. Und dann wird bei einem neuen Tick die start() Funktion ausgeführt. Somit hätte man die Deklarierung von AddiereFürMich auch nach oben schreiben können!?!

 

Eine weitere Frage habe ich auch noch: Wenn ich den MetaTrader mit dem EA von FinGeR geöffnet habe, dazu habe ich den MetaEditor mir dem Code von FinGeR offen... wenn ich jetzt im Code was ändere - es dann Kompiliere... wird es dann direkt auf dem EA im Chart angewendet? Oder muss ich den EA aus dem Chart entfernen und dann wieder neu aktivieren, damit die Änderungen aktiv sind?

 

Und, eine abschließende Frage:

Warum ist das Smiley-Gesicht im Chart oben rechts mit nach unten gezogenen Mundwinkeln? Der EA läuft doch... auch die Alert-Funktion geht...! Sie signaliesiert bei jedem Tick...!?!

Bearbeitet von ronner
mql-Tags hinzugefügt

Featured Replies

Geschrieben
Der Code hat erst funktioniert, als ich die alert-Funktion mit einem Großbuchstaben begonnen habe. Sehr penibel dieses MQL4.

Ja, MQL ist casesensitiv das heißt es unterscheidet zwischen Groß und Kleinbuchstaben.

Das hat doch damit zu tun, dass die start() bei jedem Tick ausgeführt wird, oder?

[...]

Und das liegt daran, dass deinit() nur beim beenden des EA ausgeführt wird, oder?

Beides richtig.

 

Was ich nicht verstehe ist, warum die Deklarierung von AddiereFürMich ganz unten steht... kann mir das jemand erklären?

Deine Erklärung stimmt. Die einzelnen Funktionen in einem Programm sind eigenständige Blöcke. Die Reihenfolge in der sie im Sourcecode stehen ist "egal". Das kannst du dir vorstellen wie ein Stapel mit Blättern auf denen die Funktionen stehen, jedes Blatt eine Funktion. Wenn jetzt in einer Funktion eine andere aufgerufen wird, dann steht dort ein Verweis auf das Blatt mit der anderen Funktion. Dadurch ist es egal in welcher Reihenfolge die Blätter liegen, der Verweis gilt immer. Kurz gesagt: Dem Compiler ist es egal, für die Lesbarkeit macht es aber bei größeren EAs Sinn die Funktionen in einer "sinnvollen" Reihenfolge zu schreiben.

 

Somit hätte man die Deklarierung von AddiereFürMich auch nach oben schreiben können!?!

Das was du meinst ist die Implementation der Funktion. In MQL gibt es keine Deklarierung von Funktionen (außer importierte Funktionen, und deren Deklaration muss am Anfang stehen).

Kurzer Ausflug (gilt nicht direkt für MQL):

Wie bei Variablen gibt es auch bei Funktionen normalerweise Deklarationen. In "normalen" Programmiersprachen muss vor der ersten Verwendung der Funktion entweder die Implementation der Funktion stehen oder zumindest eine Deklaration, das sähe zb so aus:

double AddiereFürMich(double a,double b);

(achtung: gilt nicht in MQL) das sagt dem compiler: "Es gibt eine Funktion AddiereFürMich mit 2 Parametern (beide double) die ein double zurückgibt, du wirst später sehen wie sie genau aussieht". Damit kann man die Funktion dann wieder irgendwo im Source implementieren.

//Ende Ausflug ;)

 

 

wenn ich jetzt im Code was ändere - es dann Kompiliere... wird es dann direkt auf dem EA im Chart angewendet?

(leider) ja. Der EA wird deinitialisiert mit dem Grund "recompile" und mit den Defaultparametern neugestartet (also der neu compilierte) Dadurch verlierst du eingestellte Parameter etc. darauf ist immer zu achten wenn man live entwickelt und nicht die Defaultparameter verwendet.

 

Warum ist das Smiley-Gesicht im Chart oben rechts mit nach unten gezogenen Mundwinkeln?

weil du ihm das live-handeln nicht erlaubt hast. MT unterscheidet zwischen "Ea deaktiviert" (das x), "EA aktiviert, darf aber nicht handeln" (trauriger Smily), "EA aktiv und darf handeln" (happy smily)

einstellen kannst du das in den Optionen des EAs (wie du da reinkommst kann i grad nit nachschauen, hab keinen MT hier, ich glaub es war F7 bzw. rechte Maustaste auf Chart und dann "ExpertAdvisor Einstellungen" oder so ähnlich ;)

 

HTH

Geschrieben
  • Autor

Vielen dank für deine ausführliche Rückantwort. Das hilft mir schon sehr weiter!!!

F7 stimmt auch! Mit F7 kommt man zu den Parametereinstellungen und kann auch "Live-Trading zulassen" anhaken.

Jetzt lächelt der Smiley! :laugh:

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.