업데이트된 MQL4 및 이전 코드(문제 해결 경험 교환)

 

업데이트에 비추어 볼 때 유용한 주제가 될 수 있다고 생각합니다.

요전에 나는 어리석게도 터미널을 업데이트하고 실제 생활에서 일하는 Expert Advisors를 테스트하기로 결정했습니다. 글쎄, 나는 그것을 실생활에서 즉시 업데이트하지 않았습니다.

오류가 발생했습니다. 개발자 탓이 아니라 내 탓도 있다. 그럼에도 불구하고 나는 치질이 있었던 몇 가지 점을 지적하고 싶습니다.

1. 변수 이름의 유효하지 않은 문자 - 여기에서는 모든 것이 간단합니다. 컴파일러는 $ 기호를 유효하지 않은 것으로 가리켰습니다. 빠르고 쉽게 수정했습니다. 컴파일 단계에서 더 이상 오류가 발생하지 않았습니다.

또한 컴파일러가 맹세하지 않은 Expert Advisor의 작업에서 잼을 잡아야했습니다.

2. 테스트를 시작했을 때 stdlib.ex4 라이브러리를 찾을 수 없다는 저주를 받았습니다. 이렇게 결정했습니다 - 지정된 폴더에서 stdlib 소스를 찾아서 재컴파일했습니다.

3. 또한, 이제 내가 이해하는 NULL과 0(영)은 다른 것이라는 사실과 관련된 엉터리를 제거했습니다. 이전에는 iOpen( NULL ,PERIOD_W1,1) 과 같은 함수가 iOpen( 0 ,PERIOD_W1,1) 형식에서 제대로 작동했습니다. 0과 NULL을 모두 지정할 수 있습니다. 이제 아니오, 하지만 컴파일러는 이에 대해 불평하지 않습니다. Expert Advisor가 실행 중일 때 오류가 발생합니다.

4. 이유는 모르겠지만 이전에 시작 가격, 스탑 레벨 또는 이익을 설정할 때 NormalizeDouble (pr1, Digits )을 사용했습니다. 이제 예를 들어 소수점 이하 3자리가 있는 USDJPY 쌍에서 테스트할 때 알았습니다. 이 함수는 쉼표 뒤에 소수점 이하 4자리가 있는 숫자를 지속적으로 반환하므로 주문을 열 때 오류가 발생했습니다. Digits를 Digits()로 교체하고 작동했습니다.

이것이 내가 지금까지 겪었던 모든 것입니다. 이제 가능한 다른 문제를 식별하기 위해 전문가의 성능을 확인하고 있습니다.

그건 그렇고, 이전 코드를 다시 컴파일하지 않으면 ex4가 오류없이 작동합니다.

내 빌드는 이제 579입니다. 실생활에서 다른 509가 회전하고 비행은 정상이지만 업데이트하기가 무섭습니다.

누군가 전환하는 동안 문제가 발생했다면 여기에 작성하면 다른 사람들에게 유용할 것입니다.

 
583번으로 확인해주세요.
 

Point 변수 와 유사한 문제. Point()로 변경

손은 아직 583 빌드에 도달하지 않았습니다. 그리고 내 브로커는 아직 그것을 가지고 있지 않습니다.

 

Digits 와 Point에 대해 다시 한 번.

비트 깊이가 다른 기호에 대해 동일한 Expert Advisor를 테스트할 때 문제가 발생한다는 것을 알았습니다. 테스터는 이러한 변수를 변경하지 않는 것 같습니다. 먼저 달러 달러로 테스트한 다음 테스터에서 기호를 달러로 변경하고 문제가 시작된다고 가정해 보겠습니다. 글쎄, 또는 그 반대도 마찬가지이다.

포함 아마도 이것은 단지 테스터의 문제이고 실제 생활에서는 이런 일이 일어나지 않을 것입니다. 그러나 만일을 대비하여 Digits를 Digits() 및 Point to Point() 모든 곳에서 변경합니다.

UPDATE 교체는 여전히 도움이 되지 않습니다. 터미널을 다시 시작하는 것만으로도 도움이 됩니다.

 
감사합니다 월요일에 확인 후 수정하겠습니다.
 

아, 그리고 내 코드가 완전히 비뚤어진 줄 알았는데...

또한 Expert Advisor는 테스터에서 작동하지 않습니다. 첫 번째 테스트가 4자리인 경우 엔화 쌍은 더 이상 테스트되지 않고 포지션을 열지 않습니다. 테스트를 통과하려면 터미널을 다시 시작하거나 EA를 다시 컴파일해야 합니다.

빌드 584.

아니요, 내 코드가 완벽함의 높이라고 생각하지 않습니다. 터미널을 다시 시작하거나 다시 컴파일하지 않고 테스트된 기호를 변경할 때 빌드 509의 동일한 코드가 테스터에서 작동했습니다.


추신: 문제는 다음과 같은 구성을 호출하여 지금까지 해결되었습니다.

   digits = MarketInfo ( Symbol (), MODE_DIGITS );
   point = MarketInfo ( Symbol (), MODE_POINT );

같은 것을 의미하는 것처럼 보이는 이러한 변수에 값을 할당하는 대신:

digits = Digits ;
point = Point ;
 

차트의 주석에 대한 문자열로 변환할 때 Digits (4 제공)를 숫자 5로 바꿉니다. "디버그"를 켜면 무언가를 편집한 다음 "일시 중지"에서 차트가 사라지고 에서 디버깅이 끝나면 전문가가 있는 새 차트(모두 녹색)가 표시되지만 표시기는 없습니다! 이대로 될까요, 일시적일까요?

데모에서 하나만 업데이트된 것이 좋습니다. Real에 있는 것은 아직 업데이트되지 않았습니다. 나는 무엇을해야할지 모르겠다. 작은 마이너스에 열린 위치가 있습니다!

 

녹색 화살표는 시작 부분의 첫 번째 줄을 가리킵니다.

정수 숫자 = MarketInfo( Symbol(), MODE_DIGITS); 그리고 맨 아래: MQL4\Experts\"EA name" 시작 및 줄 번호 오류가 지정되지 않았지만 컴파일되지 않았습니다. 이것이 의미하는 바는 무엇입니까? 그들은 아무 일도 일어나지 않을 것이라고 말했습니다! 설명을 부탁드립니다!

 

wininet.dll의 InternetOpenUrlA() 함수가 작동을 멈췄습니다.

웹 페이지 텍스트 대신 0(영)을 반환합니다.

전체 코드를 게시하고 있습니다.

#import "wininet.dll"

int InternetOpenA( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );

int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );

int InternetReadFile( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );

int InternetCloseHandle( int hInet );

int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );

int HttpQueryInfoA(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import


#define INTERNET_OPEN_TYPE_PRECONFIG 0x00000000 // use registry configuration

#define INTERNET_FLAG_RELOAD 0x80000000

#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000

#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100



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

//| script program start function |

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

int start()

{

if(!IsDllsAllowed())

{

Alert("Необходимо в настройках разрешить использование DLL");

return(0);

}

int hInternetSession = InternetOpenA("Microsoft Internet Explorer",

0, "", "", 0);

if(hInternetSession <= 0)

{

Alert("Ошибка при вызове InternetOpenA()");

return(0);

}

int hURL = InternetOpenUrlA(hInternetSession,"https://www.mql4.com", "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

if(hURL <= 0)

{

Alert("Ошибка при вызове InternetOpenUrlA()");

InternetCloseHandle(hInternetSession);

return(0);

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = "";

while(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

break;

string text = "";

for(int i = 0; i < 256; i++)

{

text = text + CharToStr(cBuffer[i] & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);

}

TXT = TXT + text;

Sleep(1);

}

if(TXT != "")

{

int h = FileOpen("SavedFromInternet.htm", FILE_CSV|FILE_WRITE);

if(h > 0)

{

FileWrite(h,TXT);

FileClose(h);

Alert("Готово! См. файл .../experts/files/SavedFromInternet.htm");

}

else

{

Alert("Ошибка при вызове FileOpen()");

}

}

else

{

Alert("Нет считанных данных");

}

InternetCloseHandle(hInternetSession);

return(0);

}

 
uniqdoes 문자열로의 전환으로 인해 이제 InternetOpenUrlW를 사용해야 합니다.
 
Renat :
uniqdoes 문자열로의 전환으로 인해 이제 InternetOpenUrlW를 사용해야 합니다.

정말 효과가 있었어요! 고맙습니다!