Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4080
Beiträge: 38598
Benutzer: 6.373
Aktive Benutzer: 230
Links: 80
Wir begrüßen unseren neuesten Benutzer: Slumtrader
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 18:12).
Neue Benutzer:
vor 28 Minuten
- Slumtrader
vor einem Tag
- Dario
vor 4 Tagen
- Redline
vor einer Woche
- kfiedler58
vor einer Woche
- Datoddy

Onlineuser
'Wer ist online' anzeigen Benutzer: 3
Gäste: 65
Gesamt: 68
Team: 0
Team:  
Benutzer:  Domke01, Slumtrader, traderdoc
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Dec 2013
Beiträge: 15
Mike1980 befindet sich auf einem aufstrebenden Ast
Standard 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
Angehängte Dateien
Dateityp: mq4 Pip.mq4 (3,7 KB, 4x aufgerufen)
Mit Zitat antworten
  #2 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Mar 2014
Beiträge: 26
André befindet sich auf einem aufstrebenden Ast
Standard

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
  }
Mit Zitat antworten
  #3 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Dec 2013
Beiträge: 15
Mike1980 befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #4 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Mar 2014
Beiträge: 26
André befindet sich auf einem aufstrebenden Ast
Standard

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é
Mit Zitat antworten
  #5 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Dec 2013
Beiträge: 15
Mike1980 befindet sich auf einem aufstrebenden Ast
Standard

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 ?
Mit Zitat antworten
  #6 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Mar 2014
Beiträge: 26
André befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Mar 2014
Beiträge: 26
André befindet sich auf einem aufstrebenden Ast
Standard

... 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.
Mit Zitat antworten
  #8 (permalink)  
Alt vor einer Woche
Neues Mitglied
 
Registriert seit: Dec 2013
Beiträge: 15
Mike1980 befindet sich auf einem aufstrebenden Ast
Standard

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 ?
Angehängte Dateien
Dateityp: mq4 Pip.mq4 (3,4 KB, 2x aufgerufen)
Mit Zitat antworten
  #9 (permalink)  
Alt vor einer Woche
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.119
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
Antwort

Lesezeichen


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 01:07 Uhr.


Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2018 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------