|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
MetaTrader4-Kompendium für Anfänger
Anbei habe ich eine Datei aus dem Buch Metatrader4-Kompendium mal genau so abgetippt und wie sie drin steht und wie ich es mir dachte geht es nicht .
Frage 1 : Wo ist der Fehler und warum? ( bitte Laienhaft antworten ) 1. Error versteh ich ( noch) gar nicht !( globale Variable) 2. Error ist mir fast schon klar.(Welcher Markt) Warnungen 1+2 sagen mir wieder gar nichts (könnte aber auch an der Übersetzung von google sein ?) oder ich seh den Walt vor lauter Bäume nicht Danke schon mal Mike |
|
|||
Hi Mike,
ich hab mir die Fehler nicht weiter angeschaut, nur die Comments gelesen. 1. Fehler: Du hast deine PipBerechnung-Funktion innerhalb der OnInit-Funktion stehen. --> Lösung: Pack deine Funktion ganz nach unten, unter die OnTick-Funktion. 2. Fehler: Das Semikolon in der Kopfzeile deiner Funktion kannst du löschen, dem Compiler passt die Syntax an dieser Stelle nicht. Code:
//+------------------------------------------------------------------+ //| Pip.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "Mike" #property link "" #property version "1.00" #property strict #property indicator_chart_window double PipWert; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping Comment(PipBerechnung(Symbol())); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ double PipBerechnung(string markt)// Markt nicht richtig definiert { int Kommastellen=(int)MarketInfo(markt,MODE_DIGITS);// implizite Umwandlung von 'number' in 'string' if(Kommastellen==0||Kommastellen==1)PipWert=1; if(Kommastellen==2||Kommastellen==3)PipWert=0.01; if(Kommastellen==4||Kommastellen==5)PipWert=0.0001; return(PipWert); //Möglicher Datenverlust durch Typumwandlung } |
|
|||
Laut Buch soll es in die obere l
Spaltewei die Funktion nur einmal benötigt wird. In der unteren Spalte wird die Funktion halt bei jedem Tick ausgeführt. Das wird wohl was mit größeren Programmen und der Geschwindigkeit zu tun haben. |
|
|||
Kannst mir schon was glauben Mike, ich studiere den Mist
Unten im Globalen Namensraum definierst du die Funktion UND oben in der OnInit() rufst du sie beim Start des EA bzw. Indikators einmal auf. Solltest du die Funktion an andere Stelle z.B. in der OnTick() nochmal benötigen, musst du den Code nicht jedesmal kopieren, du rufst du Funktion einfach entsprechen auf. Du hingegen wolltest die Funktion innerhalb der OnInit() definieren. Grüße André |
|
|||
Denke bitte nicht das ich dein Wissen in Frage stelle. Ich versuche das nur zuverstehen .
Wenn ich es oben reinschreibe dann wird und soll es nur einmal ausgeführt werden.soweit klar. Aber kann ich den Wert aus return dann nicht weiter unten zb onTick weiter verwenden ? |
|
|||
Naja es ist so, du hast ja deine Globale-Variable "PipWert" (Die ist deshalb Global weil an der Stelle, an der du sie stehen hast, Sie für den kompletten EA / Indikator gilt. Du kannst sie aus jeder Funktion heraus aufrufen).
Wenn du nun in deiner OnInit() etwas stehen hast wie z.B. Code:
PipWert = PipBerechnung(Symbol()); Du kannst jetzt von überall in deinem EA auf diese Variable zugreifen und den Wert abfragen. Wenn du den Wert hingegen jedesmal neu berechnen willst (in der OnTick()), dann musst du hingegen jedesmal die Funktion selbst aufrufen mit ... Code:
PipBerechnung(Symbol()); Das schöne an Funktionen/Methoden ist eben genau das, du musst nicht jedesmal den Code neu schreiben, du schreibst ihn einmal und rufst die Funktion dann von der Stelle aus auf, an der du sie brauchst. |
|
|||
... kleiner Nachtrag:
Code:
PipBerechnung(Symbol()); Code:
doSomethingWithPipValue(PipBerechnung(Symbol())); doSomethingWithPipValue(...) wäre ebenfallst eine Funktion die dann irgendetwas mit deinem Pipwert macht. |
|
|||
mmmhhh ich habe das mal gerade getestet ... aber er meckert immer noch rum in Zeile 35 ?
Da fehlt ein Semikolon ?! ok ! eines Gesetzt ... Fehlt Semikolon ??? Habe ich keines dann meckert er und ich habe 2 Fehler ! Mach ich ein Semikolon rein habe ich 3 Fehler ? Ja was denn nun ? |
|
|||
Das hatten wir schon mal, Grundregel Nr. x:
"In einer Funktion werden keine Funktionen deklariert!" So, mit diesem Code klappts auch mit dem Nachbarn: Code:
//+------------------------------------------------------------------+ //| Pip.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "Mike" #property version "1.00" #property strict double PipWert = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { PipWert = PipBerechnung(Symbol()); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ double PipBerechnung(string markt) { int Kommastellen = (int)MarketInfo(markt, MODE_DIGITS); //hierbei würde ausreichen int Kommastellen = Digits; if (Kommastellen == 0 || Kommastellen == 1) PipWert = 1; if (Kommastellen == 2 || Kommastellen == 3) PipWert = 0.01; if (Kommastellen == 4 || Kommastellen == 5) PipWert = 0.0001; return(PipWert); } traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
|
|