哦,我还以为是我的代码被搞乱了呢......
另外,在测试器中,该EA不工作,如果第一次测试是在4位数上,那么日元对就不再被测试,没有开仓。为了使测试也能通过,我必须重新启动终端或重新编译EA。
建于584年。
不,我并不声称我的代码是完美的,但是在测试器中,在改变被测试的符号时,Build 509中的同样的代码在测试器中是有效的,无需重启终端,也无需重新编译。
P.S.: 到目前为止,这个问题已经通过调用类型结构来解决了。
digits = MarketInfo( Symbol(), MODE_DIGITS); point = MarketInfo( Symbol(), MODE_POINT);
而不是简单地给这些变量赋值,这似乎意味着同样的事情。
digits = Digits; point = Point;
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。
它确实起作用了!谢谢你!
我认为这个话题在更新的情况下可能是有用的。
有一天,我愚蠢地决定更新终端,并在上面测试我的专家顾问,但我没有在真实账户上更新它们。
我得到了错误。我不想说是开发商的责任,这也是我的错。然而,我想披露我遇到麻烦的几个细节。
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在真实运行,飞行是确定的,但我害怕升级。
如果有人在过渡时期遇到了问题--在这里发帖,对其他人会有帮助。