Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 440

 

Hallo 2015.09.17_19:07 GMT+3 .Ich habe die Dimensionen der dynamischen Arrays im EA-Programm festgelegt. Und der Compiler gibt Fehler aus: "Komma erwartet". Und wenn eine Variable im Programmtext vorkommt, gibt -- Warnungen aus: "Variable soundso versteckt Variablendeklaration auf globaler Ebene". Das verstehe ich nicht. Alles scheint korrekt zu sein, wie in der Hilfe. Hier sind einige Codeschnipsel:

//--- Array der maximalen Barpreise

bool ArraySetAsSeries(double &High[],bool);

//---

bool ArraySetAsSeries(double &Low[],bool);

//--- Festlegen der Array-Größen mit Reserve (Reserve)

int ArrayResize(double &mrate[],int 16,int 9);

int ArrayResize(double &maVal[],int 16,int 9);

int ArrayResize(double &fVal[],int 3,int 2);

int ArrayResize(double &zVal[],int 3,int 0);

int ArrayResize(double &High[],int 1,int 0);

int ArrayResize(double &Low[],int 1,int 0);

//+------------------------------------------------------------------+

//| Experten-Deinitialisierungsfunktion |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

//--- массив максимальных цен баров
bool ArraySetAsSeries(double &High[],bool);
//---  
bool ArraySetAsSeries(double &Low[],bool);
//--- устанавливаю размеры массивов с запасом (reserve)
int  ArrayResize(double &mrate[],int 16,int 9);
int  ArrayResize(double &maVal[],int 16,int 9);
int  ArrayResize(double &fVal[],int 3,int 2);
int  ArrayResize(double &zVal[],int 3,int 0);
int  ArrayResize(double &High[],int 1,int 0);
int  ArrayResize(double &Low[],int 1,int 0);  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {Der Compiler erzeugt Fehler

{

 
Николай Никитюк:

Hallo 2015.09.17_19:07 GMT+3 .Ich habe die Dimensionen der dynamischen Arrays im EA-Programm festgelegt. Und der Compiler gibt Fehler aus: "Komma erwartet". Und wenn im Programmtext steht

  1. Sie können keine Arrays mit den Namen High[] und Low[] deklarieren, da dies reservierte Systemnamen von Array-Timeseries sind.
  2. Falsche Schreibweise von ArrayResize. So sollte es sein:
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. Und das Setzen des Zeitreihen-Flags für ein Array würde wie folgt aussehen:
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3. Ich hänge eine .png-Datei an, nur für den Fall:
Dateien:
 
Karputov Vladimir:
  1. Sie können keine Arrays mit den Namen High[] und Low[] deklarieren, da dies reservierte Systemnamen für Timestream-Arrays sind.
  2. Falsche Schreibweise von ArrayResize. Es sollte so geschrieben werden:
Ich danke Ihnen! Sie haben so schnell geantwortet. Ich bin um 20:00 Uhr raus. Den Rest werde ich mir später ansehen. 19:54 MSC.
 
Karputov Vladimir:
Wenn Sie meinen Code meinen - dann ja, mein Code prüft auf einen neuen Balken.
Ich bin an dem beigefügten Code interessiert - ich möchte verstehen, was er bewirkt.
 
-Aleks-:
Ich bin an dem beigefügten Code interessiert - ich möchte verstehen, was er bewirkt.

Der von Ihnen angegebene Code führt zu nichts, oder besser gesagt, er funktioniert nicht. Fehler:

if(TimeN==0)
      TimeN=TimeC;

Diese Bedingung gilt nur einmal - bei der ersten Ausführung des Programms. Zu diesem Zeitpunkt wird die statische Variable initialisiert.

Die nachstehende Bedingung ist sinnlos, da die Variable TimeN in Ihrem Code gleich der ewigen Null ist (oder vielmehr dem Datum 1. Januar 1970) und diese ewige Null mit der Variablen TimeC verglichen wird, die dem Zeitpunkt der Eröffnung des aktuellen Balkens entspricht:)

   if(TimeN==TimeC)
      return;
 
Karputov Vladimir:

Der von Ihnen angegebene Code führt zu nichts, oder besser gesagt, er funktioniert nicht. Fehler:

Diese Bedingung gilt nur einmal - beim ersten Start des Programms. Zu diesem Zeitpunkt wird die statische Variable initialisiert.

Die nachstehende Bedingung ist sinnlos, da die Variable TimeN in Ihrem Code gleich der ewigen Null sein wird (oder vielmehr dem Datum 1. Januar 1970) und diese ewige Null mit der Variablen TimeC verglichen wird, die der Eröffnungszeit des aktuellen Balkens entspricht):

Jetzt frage ich mich, warum ich es hätte schreiben sollen... in Expert Advisor.

Danke für die Klarstellung!

 
Karputov Vladimir:

Wenn der neue Balken im Zeitrahmen M1 liegt, wird die Meldung gedruckt:

Es stellte sich heraus, dass ich nicht den vollständigen Code angegeben hatte, der richtige war

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

In diesem Fall funktioniert es doch, oder?
 
-Aleks-:

Es stellte sich heraus, dass ich nicht den vollständigen Code angegeben hatte, der richtige Code war

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

In diesem Fall funktioniert es doch, oder?
Haben Sie versucht, diesen Code zu kompilieren? Hier liegt ein Fehler vor: Die Variable TimeN wird in OnInit() deklariert, und wenn Sie OnInit() beenden, wird diese Variable zerstört. Deshalb gibt es einen Fehler in der Funktion OnTick()
'TimeN' - undeclared identifier

Hier ist der Arbeitscode:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static datetime TimeN;
   datetime TimeC=iTime(NULL,PERIOD_M1,0);
   if(TimeN==TimeC)
      return;
   TimeN=TimeC;
// новый бар, выполняем код
   Print("New bar");
   return;
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:
Haben Sie versucht, diesen Code zu kompilieren? Hier liegt ein Fehler vor: Die Variable TimeN ist in OnInit() deklariert, und diese Variable wird beim Verlassen von OnInit() zerstört. Daher tritt in der Funktion OnTick() ein Fehler auf

Hier ist der Arbeitscode:

Ich schrieb static datetime TimeN=0; in den Bereich vorint OnInit() - wo externe und andere Variablen deklariert werden.