更新MQL4和旧代码(分享解决问题的经验)

 

我认为这个话题在更新的情况下可能是有用的。

有一天,我愚蠢地决定更新终端,并在上面测试我的专家顾问,但我没有在真实账户上更新它们。

我得到了错误。我不想说是开发商的责任,这也是我的错。然而,我想披露我遇到麻烦的几个细节。

1.变量名称中不可读的字符:这很简单,因为编译器将$符号显示为无效的。迅速而轻松地修复了它。在编译阶段没有再出现错误。

之后,我不得不纠正专家顾问的错误,对此,编译器没有抱怨。

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,一切都在工作。

这就是我目前面临的所有问题。 现在我正在检查我的EA,看看是否有其他问题。

顺便说一下,如果不重新编译旧的代码,ex4将无错误地工作。

我的建设目前是579,我仍然有509在真实运行,飞行是确定的,但我害怕升级。

如果有人在过渡时期遇到了问题--在这里发帖,对其他人会有帮助。

 
请核对583。
 

类似的问题还有 "点 "这个变量。改为Point()

还没来得及建造583。而我的经纪人还没有这个能力。

 

再一次关于数字 和点。

我发现,当在不同数字容量的符号上测试同一专家顾问时,它们的问题就会出现。测试员似乎并没有改变这些变量。例如,我首先在Yerovdollar上测试,然后在测试器中改变Dollar的符号,问题就出现了。或反之亦然。

因此,也许这只是测试器的问题,在现实生活中不会发生这种情况。但我只是为了以防万一,我总是把数字改成数字(),把点改成点()。

UPDATE的变化仍然没有帮助。只有重新启动终端才有帮助。

 
谢谢你,我们将在星期一检查并修复它。
 

哦,我还以为是我的代码被搞乱了呢......

另外,在测试器中,该EA不工作,如果第一次测试是在4位数上,那么日元对就不再被测试,没有开仓。为了使测试也能通过,我必须重新启动终端或重新编译EA。

建于584年。

不,我并不声称我的代码是完美的,但是在测试器中,在改变被测试的符号时,Build 509中的同样的代码在测试器中是有效的,无需重启终端,也无需重新编译。


P.S.: 到目前为止,这个问题已经通过调用类型结构来解决了。

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

而不是简单地给这些变量赋值,这似乎意味着同样的事情。

digits = Digits;
point = Point;
 

当翻译成字符串用于图表上的评论时,我用数字5替换了Digits(给出4)。如果我打开 "调试",编辑一些东西,然后在 "暂停 "时,图表消失了,而在调试完成后,一个新的图表出现了(全绿),有专家顾问,但没有指标!这是为什么?它将会是这样,还是暂时的?

好在只有Demo上的那个被更新了。Real上的那个还没有更新。我不知道该怎么做,在一个小规模的减法中还有职位空缺!"。

 

绿色箭头指向起点的第一行。

intdigits= MarketInfo( Symbol(), MODE_DIGITS); 而在底部:MQL4\Experts\"EA名称 "的开始和行号 没有错误,但它没有编译 这是什么意思?有人告诉我,什么也不会发生!我说。请你解释一下!

 

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

}

 
由于改用统一的字符串,你现在必须使用InternetOpenUrlW。
 
Renat:
由于改用单字节字符串,现在有必要使用InternetOpenUrlW。

它确实起作用了!谢谢你!