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)
-   -   #include - Befehl : Wie verwende ich den? (http://www.expert-advisor.com/forum/showthread.php?t=6628)

Angel 14.04.20 00:06

#include - Befehl : Wie verwende ich den?
 
Hallo!
ich möchte in meinem .mq4-Programm eine oft genutzte Funktion in eine externe Datei auslagern. Sagen wir mal beispielhaft (und dass es übersichtlich bleibt) die Berechnung einer EMA mit Timeframe 1 und Periode 20.
Nun schrieb ich eine .mqh-Datei mit Namen "EMAS" :

PHP-Code:


#property strict

double EMA1P20,EMA1P50;

//+------------------------------------------------------------------+
//|          Die ausgelagerte .mqh-Datei "EMAS"                                   |
//+------------------------------------------------------------------+
void EMAS()
  {
   
EMA1P20=NormalizeDouble(iMA(NULL,1,20,0,1,0,0),5);
   
EMA1P50=NormalizeDouble(iMA(NULL,1,50,0,1,0,0),5);   
  } 


Meine .mq4-Datei (Also das Hauptprogramm) sieht so aus:

PHP-Code:

#property strict

enum ENUM_En
  
{
   
EntryEMA1P20=20,EntryEMA1P50=50
  
};
input ENUM_En Entry=20;

double EMA1P20,EMA1P50;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
#include <EMAS.mqh>
   
return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
EMAS();
   
Comment(" EMA1P20= ",EMA1P20,"  EMA1P50= ",EMA1P50);
  } 


In der .mqh-Datei "EMAS" bekomme ich keine Fehlermeldung.
In der Hauptdatei jedoch umso mehr:

declaration of 'EMA1P20' hides global variable (Bezieht sich auf die .mqh-Datei)
declaration of 'EMA1P50' hides global variable (Bezieht sich auf die .mqh-Datei)
'EMAS' - function declarations are allowed on global, namespace or class scope only
variable 'EMA1P20' not used (Bezieht sich auf die .mqh-Datei)
variable 'EMA1P50' not used (Bezieht sich auf die .mqh-Datei)

Was mache ich denn hier falsch????

traderdoc 14.04.20 10:29

Code:

#property strict
 
#include <EMAs.mqh>

enum ENUM_En
  {
  EntryEMA1P20=20,EntryEMA1P50=50
  };
input ENUM_En Entry=20;

//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {}
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
  EMAS();
  Comment(" EMA1P20= ",EMA1P20,"  EMA1P50= ",EMA1P50);
  }

So sollte schon mal kein Fehler generiert werden.
Die #include Deklaration wird immer global geschrieben und nicht in die Funktionen intergriert.
Und dann musste noch die doppelte Deklaration der Variablen
double EMA1P20,EMA1P50;
entfernt werden, denn die stehen bereits in der mqh-Datei.

traderdoc

Angel 14.04.20 16:25

Ich komme eben erst von der Arbeit, daher kann ich erst jetzt etwas dazu schreiben:

Klasse, traderdoc - es funktioniert !!!

Danke :):p:)!!!!

Angel 14.04.20 16:54

Mal nebenbei was anderes:

In dem Code ist ja ersichtlich, dass ich aus 2 EMAs eine auswählen möchte. Die Auswahl (!) wird mittels "enum" nummeriert, und später muss sie anhand dieser Nummer einer Variablen zugeordnet werden, die wiederum einer vorher berechneten EMA zugeordnet werden muss.


PHP-Code:

EMA1P20=NormalizeDouble(iMA(NULL,1,20,0,1,0,0),5);
EMA1P50=NormalizeDouble(iMA(NULL,1,50,0,1,0,0),5);

   if(
Entry==20){Ent=EMA1P20;}
   if(
Entry==50){Ent=EMA1P50;} 


Der Code steht nur als Beispiel, was ich meine.

Wenn ich jetzt aber zwischen EMA1P1 und EMA1P100 auswählen können möchte - muss ich dann jede EMA von 1 bis 100 definieren und eine if-Abfrage durchführen? Geht das denn nicht einfacher?

AVT 14.04.20 20:33

Zitat:

Zitat von Angel (Beitrag 43507)
Mal nebenbei was anderes:
...
Wenn ich jetzt aber zwischen EMA1P1 und EMA1P100 auswählen können möchte - muss ich dann jede EMA von 1 bis 100 definieren und eine if-Abfrage durchführen? Geht das denn nicht einfacher?

Also ich habe festgestellt, daß man die Variablen-Namen nicht zusammensetzen kann/darf, z.B. EMA1+IntegerToString(Periodennummer) - das geht nicht. Aber die Zuordnungen nachher kannst Du mit switch(Entry) und dann case 20: Ent=EMA1P20; break; } machen. AVT


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:28 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