초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 440

 

안녕하세요! 2015.09.17_19:07 GMT+3. EA 프로그램에서 동적 배열의 크기를 설정합니다. 그리고 컴파일러는 "쉼표가 필요합니다"라는 오류를 생성합니다. 그리고 프로그램 텍스트에서 변수가 발견되면 "변수 등은 전역 수준에서 변수 선언을 숨깁니다."라는 경고를 표시합니다. 난 이해가 안 돼요. 설명서와 같이 모든 것이 올바른 것 같습니다. 코드 스니펫을 첨부합니다.

//--- 최대 바 가격 배열

bool ArraySetAsSeries(더블 &High[],bool);

//---

bool ArraySetAsSeries(더블 &Low[],bool);

//--- 예비(reserve)를 사용하여 배열의 크기를 설정합니다.

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

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

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

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

int ArrayResize(더블 & 하이[],int 1,int 0);

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

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

//| 전문적인 초기화 해제 기능 |

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

무효 OnDeinit(const int 이유)

 //--- массив максимальных цен баров
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:07 GMT+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 철자가 잘못되었습니다. 다음과 같아야 합니다.
고맙습니다! 당신은 너무 빨리 응답했습니다. 모스크바 시간 20시에 나는 불을 끕니다. 나머지는 나중에 볼게요. 19:54 모스크바 시간.
 
Karputov Vladimir :
내 코드를 의미한다면 예, 내 코드는 새 막대를 확인하는 것입니다.
내가 첨부한 코드에 관심이 있습니다. 코드가 무엇을 하는지 이해하고 싶습니다.
 
-Aleks- :
첨부한 코드에 관심이 있습니다. 코드가 무엇을 하는지 알고 싶습니다.

제공한 코드는 아무 작업도 수행하지 않거나 작동하지 않습니다. 실수:

 if (TimeN== 0 )
      TimeN=TimeC;

이 조건은 프로그램을 처음 시작할 때 한 번만 작동합니다. 이 시점에서 정적 변수 가 초기화됩니다.

코드에서 TimeN 변수는 영원한 0(더 정확하게는 1970년 1월 1일)과 같을 것이고 이 영원한 0을 TimeC 변수와 비교하는 것이 제안되기 때문에 아래 조건을 확인하는 것은 무의미합니다. , 현재 막대의 여는 시간과 동일):

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

제공한 코드는 아무 작업도 수행하지 않거나 작동하지 않습니다. 실수:

이 조건은 프로그램을 처음 시작할 때 한 번만 작동합니다. 이 시점에서 정적 변수 가 초기화됩니다.

코드에서 TimeN 변수는 영원한 0(더 정확하게는 1970년 1월 1일이 됨)과 같을 것이고 이 영원한 0을 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() 함수 에서 오류가 발생합니다.

작업 코드는 다음과 같습니다.

나는 이것을 잘못 썼습니다. static datetime TimeN=0; int 이전 영역에서 OnInit () - 외부 및 기타 변수가 선언되는 곳입니다.

사유: