MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 379

 
Taras Slobodyanik :

I don't see zero 어디선가 실수했어


두 인쇄물 모두 동일한 값을 제공합니까?

내 코드에 인쇄 기능 이 없고 이 줄이 차례로 차례로 이동하기 때문에 값은 변경되지 않습니다.

그러나 Var는 0 및 Code - 원하는 값을 제공합니다.

 
LuckySith :

그래서 모든 할당된 값 후에 나도 한 번에 추론합니다. 따라서 기본적으로 코드는 다음과 같습니다.

ㄱ=ㄴ;

인쇄(a);

인쇄(b);

그러나 출력은 0이고 b는 올바르게 출력합니다.

정수 변수에 실수 값을 할당할 때 int 및 double b>0 및 b<1이면 소수 부분이 삭제됩니다.

 
STARIJ :

정수 변수에 실수 값을 할당할 때 int 및 double b>0 및 b<1이면 소수 부분이 삭제됩니다.


b는 1보다 훨씬 큽니다.

- double 유형의 배열

 

문제를 해결했습니다.

내 배열은 다음과 같이 생성되었습니다.


이중선[];

이 옵션을 사용하면 line[0]=x를 할당할 때; 보시다시피 0 요소는 여전히 비어 있습니다.


내가 썼을 때


이중선[20];


모든 것이 제대로 작동했습니다. 첫 번째 경우에 방금 무제한 배열을 생성했기 때문에 그 차이점이 무엇인지 이해가 되지 않습니다.

 
LuckySith :

문제를 해결했습니다.

내 배열은 다음과 같이 생성되었습니다.


이중선[];

이 옵션을 사용하면 line[0]=x를 할당할 때; 보시다시피 0 요소는 여전히 비어 있습니다.


내가 썼을 때


이중선[20];


모든 것이 제대로 작동했습니다. 첫 번째 경우에 방금 무제한 배열을 생성했기 때문에 그 차이점이 무엇인지 이해가 되지 않습니다.

동적 배열 을 만들었으며 크기를 독립적으로 설정하고 제어해야 합니다.

 
Artyom Trishkin :

동적 배열 을 만들었으며 크기를 독립적으로 설정하고 제어해야 합니다.

#property strict 지시문은 이 오류를 찾는 속도를 높입니다. 프로그램은 다음과 같은 메시지로 끝납니다. array out of range in 'С.mq4' (31,32)
 

아무도 도와줄 의향이 없습니까? 나를 위한 막다른 골목 문제는 여기에 명시되어 있습니다. 파일에 기록할 필요가 없는 다른 솔루션이 있습니까?

프로그램 코드는 여기에 설명되어 있습니다: https://www.mql5.com/ru/forum/160683/page378#comment_6053255

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2017.11.14
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
LRA :

파일의 데이터 기반 표시기 - 검색에 이 줄을 입력하고 찾았 습니다.


파일에서 데이터를 얻으려면 먼저 데이터를 채워야 합니다.

 

에이... 좋은 사람들! 도와줘, 플리즈! 프로그래밍을 배우고 있습니다. 당신의 도움이 없다면 난관은 끝이 납니다.

나중에 지표를 빌드하는 데 사용하기 위해 지표 데이터를 파일에 쓰려고 합니다 . 표시기는 현재 막대에 대한 양수 틱의 양과 음수 틱의 양 사이의 차이에 대한 데이터를 기반으로 선으로 그려집니다.

MQL4 참조를 사용하여 데이터 배열을 파일에 업로드하는 방법에 대한 정보를 얻었습니다. 결과적으로 오류가 가득한 코드를 받았습니다. 나는 오류의 본질을 이해하지 못하고, 일반적으로 참고서의 힌트를 올바르게 사용했습니다. 누구든지 도울 수 있습니까?

 input string              InpFileName= "111.csv" ;       // Имя файла 
input string              InpDirectoryName= "Data" ;     // Имя каталога 

datetime Время= 0 ;   // Время прошлого бара
double Bid1;
double    Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;   // отрицательные и положительные iVolume нарастающим итогом


void OnInit ()
{
   IndicatorDigits ( 0 );
   SetIndexBuffer ( 0 ,Buf_1);
   //SetIndexBuffer(1,Buf_2);
   Bid1= Bid ;
   V5 = 0 ;
    
}
 
 
//+------------------------------------------------------------------+
//| 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[])
{
   datetime Вр= Time [ 0 ];   // Время текущего бара
   if (Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
//      Buf_1[0]=0;         // и обнулить последний элемент буфера
   }
   
   datetime date_Buf_1; // массив дат индикатора 
   datetime time_Buf_1; // массив времени 
// --- считаю объем для положительных и отрицательных тиков      
   if ( Bid >= Bid1) 
{
   if ( Bid > Bid1) // если тик положительный..
{   
   V1 = iVolume ( NULL , 0 , 0 ); // если повышающий цену тик, то находим его объем
   V2 = V1 + V2;
}
   else
{
   V1 = 0 ;                 // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
   V2 = V1 + V2;      
}               
}              
   else 
{
   V3 = iVolume ( NULL , 0 , 0 ); // если понижающий цену тик 
   V4 = V3 + V4;             // то находим его объем  
}
  
   V5 = V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1= Bid ;
   Buf_1 [ 0 ] = V5; // в буфер сгружаем  дельту

//   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries (Buf_1, true ); 
   ArraySetAsSeries (date_Buf_1, true );
   
//--- скопируем таймсерию 
   int copied= CopyTime ( NULL , 0 , 0 , 0 ,date_Buf_1);    

//--- подготовим массив Buf_1 
   ArrayResize (Buf_1,copied); 
//--- скопируем значения линии индикатора  
   for ( int i= 0 ;i<copied;i++) 
     { 
      Buf_1[i]= V5; 
     } 
//--- откроем файл для записи значений индикатора 
   ResetLastError (); 
   int file_handle= FileOpen (InpDirectoryName+ "//" +InpFileName, FILE_READ | FILE_WRITE | FILE_CSV ); 
   if (file_handle!= INVALID_HANDLE ) 
     { 
       PrintFormat ( "Файл %s открыт для записи" ,InpFileName); 
       PrintFormat ( "Путь к файлу: %s\\Files\\" , TerminalInfoString ( TERMINAL_DATA_PATH )); 
       //--- сначала запишем значения индикатора 
       FileWrite (file_handle,Buf_1); 
       //--- запишем время и значения в файл 
       for ( int i= 0 ;i<Buf_1;i++) 
         FileWrite (file_handle,time_Buf_1[i],Buf_1[i]); 
       //--- закрываем файл 
       FileClose (file_handle); 
       PrintFormat ( "Данные записаны, файл %s закрыт" ,InpFileName); 
     } 
   else 
       PrintFormat ( "Не удалось открыть файл %s, Код ошибки = %d" ,InpFileName, GetLastError ()); 
  }
   
   return (rates_total);
}
 
YarTrade : 나중에 지표를 구축하는 데 사용할 수 있도록 지표 데이터를 파일에 쓰려고 합니다 . 표시기는 현재 막대에 대한 양수 틱의 양과 음수 틱의 양 사이의 차이에 대한 데이터를 기반으로 선으로 그려집니다.

코드를 보고 있는 누군가가 오류를 빠르게 찾을 수 있다고 생각한다면 오산입니다. 컴파일러는 오류를 찾습니다. 프로그램의 텍스트는 포맷되어야 합니다 - MetaEditor에는 이를 위한 스타일러 가 있습니다. 다른 스타일을 좋아한다면 예를 들어 AStyle.exe 프로그램을 사용하십시오. 스타일을 지정하고 나면 프로그램 1)에 추가 닫는 중괄호가 있음을 빠르게 알 수 있습니다. 2) 선언된 변수: datetime date_Buf_1; // 표시기 날짜의 배열 - 배열로 만들려면 동적 배열 에 대해 [크기] 또는 []가 필요하고 크기를 ArrayResize 로 설정해야 합니다. 그리고 이것은 배열을 사용하기 전에 수행되어야 합니다. 이에 대한 위의 게시물을 참조하십시오. 3) FileOpen(InpDirectoryName+"//"+InpFileName - 스틱을 다른 방향으로 기울일 필요가 있는 것 같습니다. InpDirectoryName+"//" 없이 하는 것이 좋습니다. - Files 폴더에서 파일을 찾을 수 있습니다.

줄당: int copy=CopyTime(NULL,0,0,0,date_Buf_1); 컴파일러 화가, 시작=종료=0 횟수=0

Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...