포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 1022

 

또는 더 간단하게 묻겠습니다.

루프는 OnCalculate() 함수 에 삽입되므로 차트가 업데이트될 때만 다음 반복만 수행됩니다....

 
ara66676 :

또는 더 간단하게 묻겠습니다.

루프는 OnCalculate() 함수에 삽입되므로 차트가 업데이트될 때만 다음 반복, 다음 한 번만 반복됩니다....

당신은 심령술사, 음, 또는 CODE TO THE STUDIO를 볼 필요가 있는 것 같습니다.
 
bistreevseh :
정말 감사합니다! 이상하게 작동합니다. 특히 터미널 폴더에 대해 관리자 권한이 있습니다. 소유자에게 모든 파괴를 제공했지만 도움이 되었지만 작동이 중지되었습니다. 그런 다음 FileReadStrArrayW 함수로 로그 파일을 읽으려고 시도했는데(이름이 틀리지 않은 경우), ansi 모드에서 스크립트가 정지된 상태에서 빈 줄을 읽습니다. 그것은 FileReadCharArr 만 ansi 코드를 읽는 것으로 나타났습니다. 라이브러리를 사용하여 로그 파일을 구문 분석하는 방법에 대한 몇 가지 예가 있습니까? 나는 매우 감사 할 것입니다!

예, 이제 로그를 읽는 데 문제가 있습니다. 예전에는 더 쉬웠습니다.

사실 파일 자체가 ANSI로 인코딩되어 있고 줄은 이제 UNICODE입니다.

다음은 작동하는 스크립트입니다.

 #property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10 ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
 {
   string sName = TimeToString ( TimeLocal (), TIME_DATE );
   StringReplace (sName, "." , "" );
   string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log" ;
   Print (sPath);
  
   if (!FileCheckW(sPath))
   {
     Print ( "Файл отсутствует!" );
     return ;
   }
    
   int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
   if (hFile == NULL )
   {
     Print ( "Файл не открыт!" );
     return ;
   }

   string asArray[];
   ArrayResize (asArray, NumLines);
   Print ( "hFile = " , hFile);
   for ( int i = 0 ; i < NumLines; i++) asArray[i] = string (i) + "                                                                                                                                                                                                                                                          " ;
  FileReadStrArrayMW(hFile, asArray, ArraySize (asArray), 0 , NumLines);
  FileCloseHandle(hFile);
   for ( int i = 0 ; i < NumLines; i++) Alert (asArray[i]);
 }

그러나 로그 파일이 먼저 UNICODE로 저장된 경우에만 작동합니다!

저것들. 라이브러리가 올바르게 작동하고 있습니다. 파일의 ANSI 인코딩을 UNICODE 문자열 배열로 변환하는 간단한 방법을 생각해내거나 파일을 읽을 때 문자열 인코딩을 변환하는 함수를 라이브러리에 추가해야 합니다.

========================

옵션 1. 배열에 신경 쓸 필요가 없습니다. 전체 파일을 ANSI로 읽고 UNICODE로 변환한 다음 MQL을 사용하여 구문 분석합니다.

옵션 2. ANSI로 읽고, 터미널의 현재 디렉토리에 쓰고, CSV 파일 작업을 위해 MQL 기능을 사용하여 읽습니다.

옵션 3. 동일한 라이브러리의 함수를 사용하여 샌드박스의 로그 파일에 대한 심볼릭 링크를 만들고 CSV 파일 작업을 위해 MQL 함수를 사용하여 읽습니다.

 #property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
 {
   string sName = TimeToString ( TimeLocal (), TIME_DATE );
   StringReplace (sName, "." , "" );
  sName += ".log" ;
  
   string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
   string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
   Print (sPathLogs);
   Print (sPathFiles);
  
   if (!FileCheckW(sPathLogs))
   {
     Print ( "Файл отсутствует!" );
     return ;
   }
  
   if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
     Print ( "Символьная ссылка не создана!" );
     return ;
   }
  
  int hFile = FileOpen (sName, FILE_READ | FILE_CSV | FILE_ANSI , '\t' );
   if (hFile == INVALID_HANDLE )
   {
     Print ( "Файл не открыт!" );
     return ;
   }
  
   while (! FileIsEnding (hFile)) Alert ( FileReadString (hFile));
   FileClose (hFile);
 }

제 생각에는 이것이 가장 아름답고 간단한 옵션입니다.

 

하나의 채널 표시기를 작성하려고 합니다. 차트에 그리기 위한 값은 계산되어 double tob[] 및 double tos[] 배열에 채워졌지만 차트에 그리기 위해 버퍼와 연결하려고 할 때 25행과 26행:

 SetIndexBuffer ( 0 , tob);
SetIndexBuffer ( 1 , tos);

, 원하는 값 대신 다음과 같은 배열:

0/1.424/1.3679
1/1.42/1.3639

다음과 같이 숫자 2147483647로 채워집니다.
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

그것을 치료하는 방법?

파일:
channel1.mq4  7 kb
 
기간을 빠르게 전환할 수 있는 단축키가 있습니까?
D 버튼을 누르면 H1이 M15로 전환되고 U 버튼을 누르면 H1으로 전환됩니다.
 

낮과 밤을 구분하는 MT4 템플릿을 찾도록 도와주세요.

차트에서 00:00에서 8:00까지의 차트는 한 색상으로 표시되고 8:00에서 00:00까지는 다른 색상으로 표시된다고 가정해 보겠습니다.

 

모두를 환영합니다.

이 문제에 직면했습니다.

로봇 코드 스니펫:

int per=마침표();
if(당 = 60)
{

Print("마침표가 H1이 아닌 경우 - 이 행은 로그에 없어야 합니다.");

댓글 (...);

... // 로봇 본체에 추가

...

...

}

차트에서 H1 이외의 마침표가 활성화된 경우 로봇 몸체나 Print(...) 라인 또는 Comment(...) 라인이 화면에서 실행되지 않음을 의미합니다.

그러나 모든 것은 모든 기간에 실행됩니다. 왜요 ?

차트의 기간이 지정된 기간과 일치하지 않으면 터미널에 제어를 반환하도록 올바르게 작성하는 방법. (그런데 RETURN (0)을 사용해 보았습니다. 도움이되지 않습니다. 여전히 모든 것을 인쇄합니다 ...)

 
Dikons :

모두를 환영합니다.

다음과 같은 문제에 직면했습니다.

로봇 코드 스니펫:

int per=마침표();
if(당 = 60)
{

Print("마침표가 H1이 아닌 경우 - 이 행은 로그에 없어야 합니다.");

논평(...);

... // 로봇 본체에 추가

...

...

}

차트에서 H1 이외의 마침표가 활성화된 경우 로봇 몸체나 Print(...) 라인 또는 Comment(...) 라인이 화면에서 실행되지 않음을 의미합니다.

그러나 모든 것은 모든 기간에 실행됩니다. 왜요 ?

차트의 기간이 지정된 기간과 일치하지 않으면 터미널에 제어를 반환하도록 올바르게 작성하는 방법. (그런데 RETURN (0)을 사용해 보았습니다. 도움이되지 않습니다. 여전히 모든 것을 인쇄합니다 ...)

할당을 수행하고 있지만 비교가 필요합니다 if(per == 60)
 
Trader76 :
할당을 수행하고 있지만 비교가 필요합니다 if(per == 60)

감사합니다 동지 ... 그렇지 않으면 전체 두뇌가 끓었습니다 ... 프로그래밍에 상당한 중단이있었습니다. 나는 내가 아는 작은 것에서 많은 것을 잊었습니다 ...

---

또 다른 질문... 터미널에서 하루에 처음 8시간 동안 max / mini 검색의 일부:

int h=TimeHour(TimeCurrent()); // 현재 터미널 시간을 찾습니다(0...23).
if (h<8) return(0); // 만약 오늘의 처음 8개의 양초에 대해 H1이 없다면 = 떠나라...

이중 최대값=높음[iHighest(NULL, PERIOD_H1 , MODE_HIGH,8,h-7)]; // 하루에 처음 8개 양초의 최대값을 결정합니다.

더블 미니=낮음[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


H1 이외의 기간이 차트에 설정되어 있으면 마지막 두 줄은 올바르게 작동하지 않습니다. 왜요 ? 결국, 계산 기간은 로봇에 명시 적으로 주어집니다 ...

예를 들어 차트에서 H4를 켜면 로봇은 H4 양초로 다시 계산합니다(다른 기간도 동일).

 
Dikons :

감사합니다 동지 ... 그렇지 않으면 전체 두뇌가 끓었습니다 ... 프로그래밍에 상당한 중단이있었습니다. 나는 내가 아는 작은 것에서 많은 것을 잊었습니다 ...

---

또 다른 질문... 터미널에서 하루에 처음 8시간 동안 max / mini 검색의 일부:

int h=TimeHour(TimeCurrent()); // 현재 터미널 시간을 찾습니다(0...23).
if (h<8) return(0); // 만약 하루의 처음 8개의 양초에 대해 H1이 없다면 = 떠나라...

더블 맥시=높음[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // 하루에 처음 8개 촛불의 최대값을 결정합니다.

더블 미니=낮음[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


H1 이외의 기간이 차트에 설정되어 있으면 마지막 두 줄은 올바르게 작동하지 않습니다. 왜요 ? 결국, 계산 기간은 로봇에 명시 적으로 주어집니다 ...

차트에 예를 들어 H4를 포함하면 로봇은 H4 양초로 다시 계산합니다(다른 기간에도 동일).

여기에서 막대 최대/최소 를 얻습니다. iHighest(NULL, PERIOD_H1 , MODE_HIGH,8,h-7)

그런 다음 예를 들어 막대 번호 2를 삽입하면 결과적으로 High [2] 가 표시되고 다른 시간대에는 H1과 다른 값이 표시됩니다. High에 대해 읽어보세요.

iHigh ( NULL , PERIOD_H1 , iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7) )

사유: