Sorry, muss diesen Thread grad mal hoch holen...
@Angel
Hier wurden schon einige Sachen gesagt. Lena hat hier zur leichteren Erlernung z.B. Java parallel vorgeschlagen.
Ich finde, gerade wenn man keine Vorkenntnisse hat, sollte man eher zu C++-Grundlagen anstatt zu Java greifen, da es einfach besser und näher zu Mql steht.
Mein Tip an dich:
- Schau dir die Grundlagen von C++ an:
- Was sind Datentypen und Variablen.
- Was sind Funktionen. Wie sieht deren Aufbau aus und wie erstellt man eigene.
- Was sind If's, Schleifen und Switch.
- Wenn du die drei Punkte oben zumindest angeschaut hast (ein paar YVideos tuns auch, viel wichtiger verstehen!), sollten solche Formulierungen wie
Zitat:
Zitat von Angel
Zeigt an, dass die Funktion (Oder ist es ein Befehl? Naja..) vom Typ "bool" ist. Was "bool" ist: Googlen
|
Zitat:
Zitat von Angel
Die Klammer darf nicht vergessen werden, sie umschließt das alles, was auf "ObjectCreate" folgt
|
Zitat:
Zitat von Angel
Ist übrigens vom Typ "String", fall man es nich tmit Klarnamen versieht, sondern mit einer Variablen
|
Zitat:
Zitat von Angel
Die Variable, sollte es eine sein...
|
Zitat:
Zitat von Angel
Schließen der Klammer bedeutet, die Definition des Rechtecks ist abgeschlossen.
|
Vergangenheit sein.
- Dann kannst du dir das Vorgehen von Traderdoc zu Herzen nehmen, aus bestehenden, kleinen Programmen & Codeschnipseln Zeile für Zeile zu lernen.
=== === === === === === === === === === === ===
Nun wollte ich noch durch den Thread gehen und paar Dinge aufgreifen,
auch wenn es vielleicht nicht mehr nötig ist :
Warum? Weil ich hier in letzter Zeit vermehrt Leute und Fragen gesehen habe, die durch Fehlende Grundlagen (absolute Grundlagen!) Fehler machen...
Zitat:
Zitat von Angel
So zB was ist Überhaupt die Bedeutung von "void"
|
Void kann man als Datentyp sehen, mit dem KEINE Variablen erstellt werden können. Beispiele zur Verwendung:
Code:
// Funktion die KEINEN Wert zurückgeben, werden mit Void deklariert
void functionGibAus()
// Bei einer Funktion ohne Parameter kann Void verwendet werden, um es zu // "signalisieren"
bool erfolg(void)
Zitat:
Zitat von Angel
Die Funktion "RectangleCreate" fand ich nicht in der Dokumentation.
|
Ist auch keine Funktion in der Doumentation, sondern einfach eine erstellte Funktion im Beispielcode.
Diese Seite Zeigt alle Objekttypen. Wenn du jetzt auf OBJ_RECTANGLE klickst, kommst du zu
dem Beispielcode, den Trader6666 gepostet hat.
Zitat:
Zitat von Angel
Zudem ist in Deinem Beispiel - soviel kann ich aus dem Code rauslesen - ein Script bzw. ein Indikator geschrieben worden.
Ich will das Ding innerhalb eines EA schreiben.
|
Wie auf der Seite zu lesen, ein Skript. Spielt aber keine Rolle. Du kannst das Beispiel auch hervorragend in einen EA integrieren.
Ist ja nicht so, als wäre da komplett anderer Code...
Zitat:
Zitat von Angel
Üben, üben, üben ist leichter gesagt als getan, irgendwann steht man vor einer Wand und kommt nicht weiter außer alle möglichen Kombinationen durchzuprobieren. Mal kommt da ein Semikolon hin, mal eben nicht, dann dies oder das und vor allem wenn das Rechteck sich wie hier bewegen soll.
|
"Alle möglichen Kombinationen" durchzuprobieren sagst du jetzt. Wenn du erstmal weißt, was Variablen, Datentypen, Funktionen ect. sind und
deren Aufbau verstanden hast, so wirst du nicht mehr von "möglichen Kombinationen" sprechen müssen. Dann wird sich sogar das mit dem Semikolon legen.
Zitat:
Zitat von Angel
Da steht nix von "RectangleCreate" oder Deinem Codeschnipsel " if(!ObjectCreate". Gerade das Ausrufezeichen ließ mich aufhorchen. Es handelt sich also wohl nicht um einen EA.
|
RectangleCreate. Der Codeschnipsel sagt überhaupt nichts von einem Indikator oder EA!
Gehen wir das mal gründlich durch:
Code:
// Mit einem if fragt man ab, ob etwas wahr oder unwahr ist (true / false)
// Beispiel:
if(10 > 13) // 10 größer 13 ===>>> Falsch ===>>> false
if(100-50 == 50) // 50 == 50 ===>>> Richtig ===>>> true
// Doppelte Gleichheitszeichen stellen ein Vergleich da.
// Ein Ausrufezeichen im if kehrt den Wert um.
// Aus true wird false und umgekehrt.
// Die Funktion "bool ObjectCreate(...)" liefert bei Erfolg "true" bei
// einem Fehlschlag "false" zurück.
if(ObjectCreate(...)) IST GLEICH WIE if(ObjectCreate(...) == true)
if(!ObjectCreate(...)) IST GLEICH WIE if(ObjectCreate(...) == false)
Zitat:
Zitat von Angel
Deinen Vorwurf "Hättest du richtig gesucht, wärst du auf den Punkt ChartXYtoTimePrice gestoßen"
|
Hier verstehe ich auch nicht, wie er darauf kommt. Habe deine Posts durchgelesen und nirgendwo steht
was von einer gewünschten Umwandlung.
Zitat:
Zitat von Angel
Außer dass wir einen Beispielcode haben, der uns nix bringt, da er für einen Indikator geschrieben ist (i...)
|
Ich nehme mal an, du meinst hier ein Ausrufezeichen. Das es rein garnichts über Indikator / EA / Skript aussagt, weißt du jetzt.
=== === === === === === === === === === === ===
Zitat:
Zitat von Angel
Und jetzt mal ehrlich: Ein Anfänger, der in der F1-Hilfe einen solchen undokumentierten Code sieht:
//--- create a rectangle
if(!RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,Inp Hidden,InpZOrder))
{
return;
}
Der kotzt doch im Strahl und verliert jede Lust am Programmieren!!!!!!!
(Wir) Progger sollten oft nicht so hochmütig sein und Anfängern nicht immer zB sagen "wenn du darauf kein Bock hast , dann kannst du es auch gleich sein lassen" Man kann sich auch mal ein wenig Zeit nehmen, etwas Schritt für Schritt zu erklären und zu beleuchten. Nicht jede(r) ist so verbissen und schläft über der MQL4-Dokumentation ein und ich muss schon sagen: Der heilige Gral der Benutzerfreundlichkeit ist MQL4 garantiert nicht, eher das Gegenteil.
|
Die Dokumentation geht ja auch davon aus, das Programmiergrundlagen vorhanden sind!
Du hast es wahrscheinlich mittlerweile verstanden, aber für andere Anfänger, die damit nichts anfangen können mal etwas
auseinandergenommen (will ja nicht, das noch jemand im Strahl kotzt...):
Mit bischen Google und passenden Wörtern wie "mql4 ..." müsste man es alleine schaffen!
Hier mal eine kleine Herangehensweise für blutige Anfänger:
Das finden wir im Beispielcode(siehe Verlinkung weiter oben!) relativ am Anfang:
Code:
bool RectangleCreate(const long chart_ID=0, // chart's ID
const string name="Rectangle", // rectangle name
const int sub_window=0, // subwindow index
datetime time1=0, // first point time
double price1=0, // first point price
datetime time2=0, // second point time
double price2=0, // second point price
const color clr=clrRed, // rectangle color
const ENUM_LINE_STYLE style=STYLE_SOLID, // style of rectangle lines
const int width=1, // width of rectangle lines
const bool fill=false, // filling rectangle with color
const bool back=false, // in the background
const bool selection=true, // highlight to move
const bool hidden=true, // hidden in the object list
const long z_order=0) // priority for mouse click
Ok. Es ist also eine selbst erstellte Funktion vom Typ "bool" mit einigen Parametern. Schauen wir uns die Datentypen hier (deutsch!) an, wird
einiges verständlicher. Diese Funktion liefert also "true" oder "false" zurück.
Das Schlüsselwort "const" bei den Parametern gibt lediglich an, das die übergebenen Variablen(-Werte) nicht geändert werden können.
Zitat:
(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,Inp Hidden,InpZOrder)
|
Der Großteil dieser Parameter ist also von den Variablen am Anfang des Codes:
Code:
input string InpName="Rectangle"; // Rectangle name
input int InpDate1=40; // 1 st point's date, %
input int InpPrice1=40; // 1 st point's price, %
input int InpDate2=60; // 2 nd point's date, %
input int InpPrice2=60; // 2 nd point's price, %
input color InpColor=clrRed; // Rectangle color
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Style of rectangle lines
input int InpWidth=1; // Width of rectangle lines
input bool InpFill=true; // Filling the rectangle with color
input bool InpBack=false; // Background rectangle
input bool InpSelection=true; // Highlight to move
input bool InpHidden=true; // Hidden in the object list
input long InpZOrder=0; // Priority for mouse click
Normale Variablen mit Datentypen, aber diesmal einem "input" davor? Google bringt uns u.a. zu Input.
Dieser Modifikator wird also vor dem Datentyp gesetzt, um Variablen zu erstellen, die nur vom Benutzer des EA's / Indikators
bei den Eingabeparametern verändert werden können. In MQL4 gibt es auch noch "extern", das selbe, mit dem Unterschied, das die Variablen damit auch im Code verändert werden können.
Etwas weiter im Code finden wir dann auch die Bezeichnungen "date" & "price", welche wir mit google als "Arrays" identifizieren:
Code:
datetime date[];
double price[];
Weiter suchen => Ahh! Ein Array ist einfach nur ein "Feld" von Werten gleichen Datentyps. Die Klammern geben dabei den "Index" an,
dessen Wert wir haben wollen. Zurück zum Codeschnipsel sehen wir als Index die int-Variablen d1/2 und p1/2.
Hier lesen wir über "return", welches die aktuelle Funktion verlässt und üblicherweise einen Wert zurückgibt, der mit dem Datentyp der Funktion übereinstimmt.
Da die Funktion in unserem Code vom Typ Void ist (= kein Rückgabewert), wird dem return hier kein Wert mitgegeben.
- Zum if:
Code:
if(... == true) kann so geschrieben werden: if(...)
if(... == false) kann so geschrieben werden: if(!...)
Fassen wir zusammen:
Code:
if(!RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,Inp Hidden,InpZOrder))
{
return;
}
- Im if wird die Funktion RectangleCreate(...) aufgerufen, welche true oder false zurückgibt (bool).
- Das Ausrufezeichen fragt ab, ob die Funktion false zurückgegeben hat.
- Ist also (RectangleCreate(...) == false), wird mit return die aktuelle Funktion abgebrochen. Andernfalls wird weiter in der aktuellen Funktion abgearbeitet.
PS: Hey Doc, komm mir jetzt nicht wieder mit "ich hätte zu viel Zeit"
Hatte grad eine Wartepause wegen anderen Sachen. Bin auf diesen Thread gestoßen und wollte was loswerden.