Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   MetaTrader4-Kompendium für Anfänger (http://www.expert-advisor.com/forum/showthread.php?t=6246)

Mike1980 07.11.18 22:54

MetaTrader4-Kompendium für Anfänger
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

André 08.11.18 01:42

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
  }


Mike1980 08.11.18 09:18

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.

André 08.11.18 09:27

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é

Mike1980 08.11.18 09:46

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 ?

André 08.11.18 09:58

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());
dann ist der Wert den die Funktion berechnet hat einmalig in der Variablen gespeicher.

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());
(Du kannst dir also salopp gesagt die Wertzuweisung sparen)

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.

André 08.11.18 10:05

... kleiner Nachtrag:

Code:

PipBerechnung(Symbol());
Würde man so nicht direkt schreiben, denn damit kannst du nichts anfangen. Man würde etwas in der Art schreiben

Code:

doSomethingWithPipValue(PipBerechnung(Symbol()));
(außer die Funktion hätte void als Rückgabewert, was Sie in deinem Fall aber nicht hat [du hast double])

doSomethingWithPipValue(...) wäre ebenfallst eine Funktion die dann irgendetwas mit deinem Pipwert macht.

Mike1980 08.11.18 21:41

Liste der Anhänge anzeigen (Anzahl: 1)
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 ?

traderdoc 08.11.18 22:59

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

Eine Funktion, die nicht mit void deklariert wird, benötigt immer ein entsprechendes return (s. int OnInit())

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:13 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum