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

WOW, wenn ich versuche, daß zu verstehen, hab ich einiges vor mir.

 

Also: ich hab gerade beschlossen, daß ich nicht alles verstehen muß und daß die bitweise Addition (im Moment)

nix für mich ist.

Geschrieben

Ich würde gerne mit dem Code das MACDSample weitermachen mit folgender Frage:

 

if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&

MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

 

Warum braucht man die dritte if Anweisung. if(OrderSelect...

 

Wenn ticket>0, also eine Order eröffnet und eine ticketnummer zurückgeschickt wurde, wie kann dann

bei if(OrderSelect... ein "false" herauskommen und damit die else Anweisung auslösen?

Oder kann es sein, daß man eine ticketnummer bekommt, obwohl ein Fehler aufgetreten ist und

die Order nicht geklappt hat?

 

Und was macht das return(0)? Ich dachte, es stoppt die gesamte Start Funktion

 

Aber dann wird doch der gesamte Teil mit den Ausstiegen und TrailingStoploss

nicht mehr ausgeführt.

 

Will man das, nur weil die Order nicht geklappt hat? Es könnte doch z.B. andere Orders geben, für die

man das TrailingSL anpasssen will.

Bearbeitet von mh21

Geschrieben

Sehr gute Fragen :siscop:.

 

Warum braucht man die dritte if Anweisung. if(OrderSelect...

 

Wenn ticket>0, also eine Order eröffnet und eine ticketnummer zurückgeschickt wurde, wie kann dann

bei if(OrderSelect... ein "false" herauskommen und damit die else Anweisung auslösen?

Oder kann es sein, daß man eine ticketnummer bekommt, obwohl ein Fehler aufgetreten ist und

die Order nicht geklappt hat?

Also meines Erachtens nach macht der Print-Befehl lediglich eine Ausgabe der Open-Time, woran man erkennt, ob die Order gefillt wurde oder nicht.

Da man den Befehl OrderOpenTime() nutzen will, muss man zuvor dem Programm sagen, welche Order denn gemeint ist, das macht man in diesem Fall über die Ticket-ID.

Offenbar kann auch hierbei was schiefgehen, denn sonst hätten die Entwickler nicht den booleschen Rückgabewert vorgesehen ( http://docs.mql4.com/trading/OrderSelect ):

The function selects an order for further processing. It returns TRUE if the function succeeds. It returns FALSE if the function fails. To get the error information, one has to call the GetLastError() function.

Dankenswerter Weise enthält die Doku keinerlei Hinweise, was denn schiefgehen kann. Man kann nur vermuten, dass es keine Order zu ner Ticket-ID gibt, was wir aber ausschließen können, wie Du schon richtig erkannt hast.

Oder man wühlt sich durch die Liste aller möglichen Fehler und sucht sich Möglichkeiten raus: http://docs.mql4.com/constants/errors .

Ich habe ehrlich gesagt auch keine Idee, was in Deinem Fall zu ner Rückgabe von false führen könnte.

Um aber auch seltene Fehler abzufangen könnte man eventuell auftretende Fehler abfragen durch Einfügen der fettmarkierten Zeile.

 
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
 Print("BUY order opened : ",OrderOpenPrice());
[b]else
   Print("OrderSelect returned the error of ",GetLastError());[/b]

 

Wenn man sicher ist, dass nix passieren kann, weil es keinen Fehlerfall gibt, der unter den Bedingungen auftritt und zur Rückgabe von false führt, könnte man den Code auch verkürzen, indem man den Rückgabewert von OrderSelect ignoriert:

 
 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
 Print("BUY order opened : ",OrderOpenPrice()); 

 

 

 

Und was macht das return(0)? Ich dachte, es stoppt die gesamte Start Funktion

 

Aber dann wird doch der gesamte Teil mit den Ausstiegen und TrailingStoploss

nicht mehr ausgeführt.

 

Will man das, nur weil die Order nicht geklappt hat? Es könnte doch z.B. andere Orders geben, für die

man das TrailingSL anpasssen will.

 

Fall1:

 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
        MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
       {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
        if(ticket>0)
          {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
          }
      [b]  else 
              Print("Error opening BUY order : ",GetLastError()); 

        return(0); [/b]
       }

 

ist nicht identisch mit:

 

Fall2:

 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
        MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
       {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
        if(ticket>0)
          {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
          }
       [b] else { 
             Print("Error opening BUY order : ",GetLastError()); 
            return(0); 
        }[/b]
       }

 

Man muss immer genau hinschauen, wo die Klammern stehen. Wenn keine stehen wie im obigen Else-Zweig bei Fall 1 heißt das, dass lediglich die erste nachstehende Anweisung - in diesem Fall die Print-Ausgabe - im Else-Fall ausgeführt wird. Bei Fall 2 wird der Sprung aus der Funktion per return(0), quasi der Abbruch, nur im Else-Fall ausgeführt.

 

Das return(0) ohne Klammerung wird in Fall 1 (Deinem Beispiel) unabhängig vom Ausgang der If-Then-Else- Anweisung ausgeführt.

Warum werden keine Trailingsstops anderer Orders nachgezogen ? Hmm, die kann es eigentlich nicht geben, da ja zu Beginn OrdersTotal ()

 

Das muss man sich ebend überlegen, was sinnvoll ist bei dem Handelssystem. Aktuell ist nach return(0) ne eventuell gefillte Order im Markt, die keinen Stopploss, dafür aber nen Takeprofit hat. Andersrum wäre es eher MEIN Ding, aber nun ja...

  • 10 Monate später...
Geschrieben

Hallo,

 

finde diesen thread sehr interressant und informativ :blush:

 

Meine Frage ist folgende: wie kann man grafische Elemente wie Bottoms etc. einbinden?

Geschrieben
Hallo,

 

finde diesen thread sehr interressant und informativ :blush:

 

Meine Frage ist folgende: wie kann man grafische Elemente wie Bottoms etc. einbinden?

 

Find den thread auch recht interessant.

Warum wurde der eigenlich nicht weitergeführt?

  • 4 Monate später...
Geschrieben

Hallo FinGeR

kann ich den mit diesem Code alle Orderarten Löschen.?

über OrderDelete hab ich nur dies gefunden.

 

if(Ask>var1)

{ OrderDelete(order_ticket);

return(0); }

bis dann

Geschrieben

kann ich den mit diesem Code alle Orderarten Löschen.?

über OrderDelete hab ich nur dies gefunden.

 

if(Ask>var1)

{ OrderDelete(order_ticket);

return(0); }

bis dann

 

Ja. Mit OrderDelete kannst Du jegliche Order löschen, sofern Du die Ticket-Nummer "weisst". Durch die Angabe der Ticket-Nummer im OrderDelete-Befehl ist der Befehl eindeutig.

 

Um z.b. ALLE Orders zu löschen gehst Du einfach alle Orders durch und löschst sie anhand des der Ticket-Nummer. Etwa so:

 

for(int i = 0; i < OrdersTotal(); i++) {                                   
  OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
  OrderDelete(OrderTicket());
}

 

Meine Frage ist folgende: wie kann man grafische Elemente wie Bottoms etc. einbinden?

 

Was meinst Du mit "Bottoms"?

Geschrieben

Achtung, OrderDelete funktioniert nur (lt. Doku, kanns gerade nicht testen) mit Pending Orders:

Deletes previously opened pending order

d.h. nur mit Stop und Limit Orders.

 

Um eine offene Position (also Ordertypen OP_BUY und OP_SELL) zu schließen musst du OrderClose verwenden.

 

"leicht" zu merken: um aufträge zu löschen OrderDelete, um Positionen zu schließen OrderClose.

 

hth

Geschrieben

Hallo FinGeR

kann ich den mit diesem Code alle Orderarten Löschen.?

 

Nein.

 

Um alle Orderarten zu Löschen.

 

Füge diese Funktion in deinen Code ein.

 

void CloseAndDeleteAll() 
{
 int cnt = OrdersTotal();
 for (int i=cnt-1; i>=0; i--) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

   if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
   if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
  
   if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
   if (OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket()); 
 }
}

 

und rufe sie dann in deiner Funktion einfach auf.

 


int start() 
{
 int Slippage = 3;

 // Wenn Ask grösser wie "var1" Schließe alle offenen Aufträge und lösche alle Pending..
 if(Ask>var1) CloseAndDeleteAll();

}

Geschrieben

Hallo,mtbf40

Hmm,ja ich habe das schon bei einem EA (NanningBob) gesehen,in einem anderen Deutschen Forum.

Ich weiß aber nicht ob ich das hier Schreiben darf.?

zwar waren die Bottoms nicht zum anklicken sondern mann muß ihn einwenig bewegen,um ihn zu aktivieren.

den EA kannst du in diesem Forum bekommen.

Ich selbst kann das noch nicht Coden.(Leider).

bis dann

Geschrieben

@FinGeR, @Mythos,@ wingman

 

Danke,

wenn Ordertarten wie Buy und Sell einfach rückwirkent zu löschen wären ,

wäre der Heilige Grahl wohl schnell gefunden :).

Also kann mann nur Pending Order Löschen,bzw heist das auch Canceln.?

Bis dann

Geschrieben

@FinGeR, @Mythos,@ wingman

 

Danke,

wenn Ordertarten wie Buy und Sell einfach rückwirkent zu löschen wären ,

wäre der Heilige Grahl wohl schnell gefunden :).

Also kann mann nur Pending Order Löschen,bzw heist das auch Canceln.?

Bis dann

Oder?

ist einer/eine einer anderen Meinung.?

Bis dann

  • 4 Monate später...
Geschrieben

Sorry, hab den Thread in Oz nicht gesehen ;)

 

Also kann mann nur Pending Order Löschen,bzw heist das auch Canceln.?

 

Genau. Pending Orders (STOP und LIMIT) kann man löschen (OrderDelete), offene Orders kann man schließen (OrderClose).

 

hth

Geschrieben

Also mal mit meinen Worten ausgedrückt:

Es passiert folgendes - es wird überprüft ob die Anzahl der Bars kleiner als 100 sind - falls ja schreibt er "bars less then 100", wenn nicht dann wird diese Funktion abgebrochen.

 

Dann wir überprüft ob die Variable TakeProfit größer als 50 ist - falls ja schreibt er "TakeProfit grösse wie 50" wenn nicht geht es weiter zur else-Anweisung und dort wird die Funktion abgebrochen (das ist der Fehler). Die Print - Anweisung wird es also nie geben!!!

 

Und wie schon bemerkt konnte ich nur anhand des tp erkennen das die else - Anweisung auf die zweite if - Anweisung bezogen war.

 

 

Ich hoffe ich liege richtig

Grüsse Jörg

 

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

 

 

Hallo,

 

da ich seit einigen Tagen eure wertvolles Tutorial für MQL Einsteiger studiere, bin ich bei eine Aussage von InfoJoerg hängengeblieben (rot makiert) :

 

Das "wenn nicht dann wird die Funktion abgebrochen" Wo ist da dann das else?

 

Heißt es denn nicht: Wenn Bars kleiner als 100 , schreibt er "bars less then 100" und bricht funtkion ab?

Bearbeitet von Mythos
Codetag eingefügt

Geschrieben

Heißt es denn nicht: Wenn Bars kleiner als 100 , schreibt er "bars less then 100" und bricht funtkion ab?

Genau so ist es!

Geschrieben

Heißt es denn nicht: Wenn Bars kleiner als 100 , schreibt er "bars less then 100" und bricht funtkion ab?

Sehe ich auch so. Die nicht rot markierten Aussagen sind aber korrekt.

 

EDIT: Mensch Wogo, gib mir doch auch ein bisschen Zeit. Eine Minute hätte gereicht :biggrin:

Geschrieben

Sehe ich auch so. Die nicht rot markierten Aussagen sind aber korrekt.

 

EDIT: Mensch Wogo, gib mir doch auch ein bisschen Zeit. Eine Minute hätte gereicht :biggrin:

Tja, 4 Wörter tippen sich halt schneller als 12! In der Kürze liegt die Würze :LLL:

Geschrieben

Eigentlich ist schon genug gesagt worden, aber ich hab versprochen das ich antworte ;)

 

Ja, jörg hat sich hier vertan und Finger hats übersehen (und wir anderen auch).

 

An alle Neuen und SilentReader sei dieser Beitrag auch nochmal eine Demonstration, das man vor allem hier (in diesem Thread, aber auch im restlichen Forum) auch in einem angestaubten Thread jederzeit nachfragen darf wenn was unklar ist! Traut euch einfach, wie ihr seht lauern hier manche regelrecht in den Startlöchern und wetteifern wer schneller hilft ;)

 

@WOGO und RAiNWORM: :top:

Geschrieben

 

Weiter im Text:

 

total=OrdersTotal();
if(total<1) {

if (MacdCurrent<0 && MacdCurrent>SignalCurrent && 
   MacdPrevious<SignalPrevious &&
   MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && 
   MaCurrent>MaPrevious)
       {

 

 

Die if Anweisung mit mehreren "und" Verknüpfungen ist eigentlich klar. MathAbs hab ich nachgeschaut, einfach der Absolutwert.

Point hab ich auch nachgeschaut, aber nicht kapiert. Da es aber wohl nur ein Faktor ist, mit dem der MACDOpenLevel multpliziert wird,

scheint das nicht sooo wichtig zu sein. Falls doch wichtig, bitte erklären.

 

 

Möchte gerne die If Anweisung verstehen. Kann jemand mir es erklären?

Hat es etwas mit dem Kreuzen der MACD und Signallinie zu tun?

Geschrieben

Möchte gerne die If Anweisung verstehen. Kann jemand mir es erklären?

Hat es etwas mit dem Kreuzen der MACD und Signallinie zu tun?

 

Was es im EA tun soll kann man schwer sagen wenn man nicht weiss wie die Variablen verwendet werden. Aber man kanns rein syntaktisch durchgehen:

 

Die if ist erfüllt wenn

MacdCurrent<0 

der Wert der Variable MacdCurrent kleiner als 0 ist

UND

MacdCurrent>SignalCurrent

der Wert von MacdCurrent größer als SignalCurrent

UND

MacdPrevious<SignalPrevious

der Wert von MacdPrevious kleiner als SignalPrevious

UND

MathAbs(MacdCurrent)>(MACDOpenLevel*Point)

der Absolutwert von MacdCurrent größer ist als (MACDOpenLevel*Point)

UND

MaCurrent>MaPrevious

MaCurrent größer ist als MaPrevious.

 

Rein von den Variablennamen könnte man vermuten das es so gemeint ist:

Wenn der Macd negativ ist und zwar weiter weg von 0 als MACDOpenLevel*Point und der MA aufwärts geht und

der Macd durchbricht die Signallinie von unten, dann tu ...

Geschrieben

 int Crossed (double line1, double line 2)
{
    static int last_direction = 0;
    static int current_direction = 0;

    if (line1>line2) current_direction = 1;
    if (line1<line2) current_direction = 2;

    If (current_direction != last_direction)
{
    last_direction = current_direction;
    return (last_direction);

}
else
{
    return (0);
}

 

Ich versuche es mal zu kommentieren:

 

 int Crossed (double line1, double line 2)
{
    static int last_direction = 0;
    static int current_direction = 0;

    if (line1>line2) current_direction = 1;
    if (line1<line2) current_direction = 2;

 

Es wird eine Kreuz Funktion deklariert : int Crossed ,

Die static int, lässt soweit ich verstanden habe, die Richtungsänderung prüfen,

If (line1>line2) Es werden hier Werte für current_direction zugewiesen, wenn line1>line2 und andersrum..

 

 

If (current_direction != last_direction)

 

Es wird geprüft, ob die aktuelle Richtung ungleich zu der letzten Richtung ist,

wenn ja weiter..

 

{
    last_direction = current_direction; 

 

Die letzte Richung wird zu der aktuellen zugewiesen? Das ( = ) bedeutet zuordenen , zuweisen oder? Das ( == ) hingegen bedeutet ist Gleich?

Aber irgendwie habe ich den sinn noch nicht verstanden..

 

return (last_direction);
}

 

Abbruch bzw zurück zu last_direction (eins drüber?)

 

else
{
    return (0);
}

 

Wenn If nicht zu trifft, dann Abbruch.

 

______________________________

danke für eure Unterstützung.

Bearbeitet von tofu-trader

Geschrieben

Hi,

 

vorweg ne kurze allgemeine Erklärung:

 

Die Zusatzdeklaration static bedeutet das diese Variable den Wert bis zum nächsten Aufruf der Funktion behält. Im Gegensatz zu "normalen" lokalen Variablen die bei jedem Funktionsaufruf neu initialisiert werden.

 

Das return(...) legt das Ende der Funktion fest. Es geht also "retour" zu dem Punkt wo die Funktion aufgerufen wurde und der Wert in Klammern wird als Rückgabewert der Funktion verwendet.

Ein return(0) bedeutet also nicht "Abbruch" im Sinn von "etwas ist schief gegangen" sondern kann eine ganz reguläre Beendigung (seltsames Wort, ist das deutsch?) der Funktion sein. In dem Fall zB. "kein Kreuzen passiert".

 

@ = vs. ==

genau = ist eine Zuweisung von rechts nach links , == ist der Vergleich zwischen zwei Werten.

Zur Funktion selber:

Du hast es teils richtig verstanden ;)

Da man am meisten lernt wenn mans selber versucht hier ein paar Hinweise die dir vielleicht helfen (keine Angst, wenns nix hilft einfach sagen, dann helf ich weiter ;):

 

Die Funktion gibt dir die Chance zu prüfen ob 2 Linien sich gekreuzt haben.

Zwei Linien haben sich gekreuzt wenn zuvor die eine Linie unter der anderen war, und es jetzt umgekehrt ist.

Du musst dir also "merken" wie sie vorher waren und das mit dem aktuellen Stand vergleichen.

 

Gleich auch für alle anderen hier ne Frage:

Was ist das "Problem" bei der Verwendung dieser Funktion? (kleiner Tipp: was passiert wenn ich sie nach einem kreuzer öfter aufrufe?)

Geschrieben

Gleich auch für alle anderen hier ne Frage:

Was ist das "Problem" bei der Verwendung dieser Funktion? (kleiner Tipp: was passiert wenn ich sie nach einem kreuzer öfter aufrufe?)

Das hängt davon ab, was sonst noch im EA steht (arbeitet er auf Tick; welches sind die Argumente, um das Kreuzen zu ermitteln, wie ist die Behandlung von Trades etc.). Somit ergibt sich dann eine Bandbreite von "gar keinem" bis zu einem "schwerwiegenden" Problem :wink:.

Geschrieben
Naja der Klassiker eben: wenn der Markt nach einem Crossing nicht richtig in die Gänge kommt und die Linien sehr dicht beieinander sind, dann kann es zu vielen Crossings nacheinander kommen, also Fehlsignale. Abhilfe könnte schaffen, wenn man noch einen Mindestabstand der Linien einbaut.

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.