初学者的问题 MQL5 MT5 MetaTrader 5 - 页 440

 

你好 2015.09.17_19:07GMT+3 .我已经在EA程序中设置了动态数组的尺寸。而编译器却给出了错误。"预期的逗号"。而如果程序文本中有一个变量,--会给出警告:"变量这样那样隐藏了全局级别的变量声明"。我不明白。一切似乎都是正确的,就像在帮助中一样。这里有一些代码片断。

//-----------------最大条形价格数组

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

//---

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

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

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

//|专家去初始化函数|

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

空白的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)
  {编译器产生的错误

{

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

你好 2015.09.17_19:07GMT+3 .我已经在EA程序中设置了动态数组的尺寸。而编译器却给出了错误。"预期的逗号"。而如果在程序文本中,有

  1. 你不能用High[]和Low[]的名字声明数组,因为这些是数组-时间序列的保留系统名称。
  2. ArrayResize 的拼写错误。应该是这样的。
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. 而为一个数组设置时间序列标志,看起来像这样。
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 gmt+3.附上一个.png文件,以备不时之需。
附加的文件:
 
Karputov Vladimir:
  1. 你不能用High[]和Low[]的名字声明数组,因为这些是为时间流数组保留的系统名称。
  2. ArrayResize 的拼写错误。它应该这样写。
谢谢你!你这么快就回答了。我在晚上8点出去。我以后再看其他的。19:54 MSC。
 
Karputov Vladimir:
如果你指的是我的代码--那么是的,我的代码正在检查一个新条。
我对我附上的代码感兴趣--我想了解它的作用。
 
-Aleks-:
我对我所附的代码感兴趣--我想了解它的作用。

你给的代码什么也没做,或者说它不起作用。错误。

if(TimeN==0)
      TimeN=TimeC;

这个条件只起一次作用--在你第一次运行程序的时候。在这一点上,静态变量 将被初始化。

下面的条件根本没有检查的意义,因为你的代码中的变量TimeN将等于永恒的零(或者说是1970年1月1日的日期),这个永恒的零将与变量TimeC相比较,后者等于当前条形图的打开时间)。

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

你给的代码什么也没做,或者说它不起作用。错误。

这个条件只起一次作用--在你第一次运行程序的时候。在这一点上,静态变量 将被初始化。

下面的条件根本没有检查的意义,因为你的代码中的变量TimeN将等于永恒的零(或者说它将是1970年1月1日的日期),这个永恒的零将与变量TimeC相比较,后者等于当前条形的开盘时间)。

现在我想知道为什么我应该写它......进入专家顾问。

谢谢你的澄清!

 
Karputov Vladimir:

如果新的条形图是在M1时间框架上,那么就打印该信息。

结果发现我没有给出完整的代码,正确的代码是

 

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

  } 

在这种情况下,它是有效的,对吗?
 
-Aleks-:

结果发现我没有给出完整的代码,正确的代码是

 

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

  } 

在这种情况下,它是有效的,对吗?
你是否尝试过编译这段代码?这里有一个错误:TimeN变量是在OnInit()中声明的,当你退出OnInit()时,这个变量将被销毁。 这就是为什么在OnTick()函数 中出现了一个错误
'TimeN' - undeclared identifier

下面是工作代码。

//+------------------------------------------------------------------+
//|                                                         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:
你是否尝试过编译这段代码?这里有一个错误:变量TimeN是在OnInit()中声明的,这个变量将在退出OnInit()时被销毁。 因此,在OnTick()函数 中出现了一个错误

以下是工作代码。

我在int OnInit() 之前的区域写了static datetime TimeN=0;,在这里声明了外部变量和其他变量