新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 191

 
Vitaly Muzichenko:

试着注释这一行,使一个函数发挥作用


有趣的是,如果你知道如何)。
 
Rustam Bikbulatov:

有趣的是,如果你知道如何)。
你不需要知道什么,我在代码中显示了它 //
 
Rustam Bikbulatov:

又见面了。你能告诉我如何改变一个已知程序员的代码吗?目前,这只猫头鹰每秒钟完成大约一笔交易。我想改变它,当它越过一定的利润时,不管是正的还是负的交易,都能立即关闭交易。

是否有任何错误信息被写入日志?

你能不能把ClosePosBySelect里面的延迟减少到更合理的数值。对于每一个订单,都有几次尝试关闭它,每次都是在失败的情况下得到睡眠

顺便说一下,从错误中恢复可以以更好的方式进行(自从创建这些函数的那一刻起,MT已经学会了生成一个与ERR_CONTEXT_BUSY不同的代码)。

 
Rustam Bikbulatov:

如果你知道怎么做的话,这很有趣)
你可以用这个 代替这两个,对我来说效果很好,但很多时候取决于你的DC执行订单的速度。
 
Maxim Kuznetsov:

是否有任何错误信息被记录下来?

你可以把ClosePosBySelect里面的延迟减少到更合理的数值。每个订单都有几次尝试关闭的机会,每次如果不成功,就会显示睡眠。

顺便说一下,从错误中恢复可以以更好的方式进行(自从创建这些函数的那一刻起,MT已经学会了生成一个与ERR_CONTEXT_BUSY不同的代码)。

我试图完全删除 "睡眠",但它是不同的。
 
Vitaly Muzichenko:
你可以用这个 代替这两个,对我来说效果很好,但很多时候取决于你的经纪公司执行订单的速度。

这是一只完整的猫头鹰还是什么东西的部分代码?
 

我已经为这个问题工作了三天。我在我的专家顾问中使用了标准功能(我到处都看到了),使用wininet.dll从互联网上读取一个文件进行进一步分析。


string ReadHTML()

{

if(!IsDllsAllowed())

{

Alert("你需要在设置中允许DLLs;)

return(")。

}

int rv = InternetAttemptConnect(0);

如果(RV != 0)

{

Alert("调用InternetAttemptConnect()时出错")。

return(")。

}

int hInternetSession = InternetOpenW("Microsoft Internet Explorer", 0, "", "", 0);

如果(hInternetSession <= 0)

{

Alert("Error calling InternetOpenW()")。

return(")。

}

int hURL = InternetOpenUrlW(hInternetSession,URL, "", 0, 0, 0);

如果(hURL <= 0)

{

Alert("Error calling InternetOpenUrlW();

InternetCloseHandle(hInternetSession)。

return("")。

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = ""。

while(!IsStopped())

{

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

如果(dwBytesRead[0] == 0)

突破。

string text = ""。

string text0= ""。

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

{

text0= CharToStr((char)(cBuffer[i] & 0x000000FF))。

if (text0!="\r") text = text + text0;

否则dwBytesRead[0]--。

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

text0= CharToStr((char)(cBuffer[i]>>(8 & 0x000000FF))。

if (text0!="\r") text = text + text0;

否则dwBytesRead[0]--。

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

text0= CharToStr((char)(cBuffer[i]>>(16 & 0x000000FF))。

if (text0!="\r") text = text + text0;

否则dwBytesRead[0]--。

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


text0= CharToStr((char)(cBuffer[i]>>(24 & 0x000000FF))。

if (text0!="\r") text = text + text0;

否则dwBytesRead[0]--。

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

}

TXT = TXT + 文本。

睡眠(1)。

}

InternetCloseHandle(hURL)。

InternetCloseHandle(hInternetSession)。

return(TXT)。

}


一切正常,只读过一次网站,随后被更新,在随后调用这个函数时(周期为1分钟或更短,尽管网站更新更频繁),给出的是同一个网站,没有变化(就像第一次读取的那样)。重新启动Expert Advisor并没有帮助,因为文件是在启动终端后第一次读取的,所以看起来是这样。更新的唯一方法是用所需的网站手动打开IE浏览器(分别是更新的信息),该功能开始读取更新的信息,然后冻结该网站的配置,或者在重启终端MT4时(也可以在重启终端后首次读取,所以一直在输出)。我怀疑它与参数InternetOpenW或InternetOpenUrlW有关,我在默认情况下到处都是零,但我找不到任何明确的描述,而且它不知为何与其他EA一起工作(我从向终端转发网站新闻的专家顾问那里得到的)。是的,在终端设置 中,为所需的网站 "允许WebRequest for..."。

 

下午好。

我的内存已经在发火了:EA出现了一个问题,在拿下TP或SL后,它又打开了一个订单!这让我很不舒服。

我想不出在什么情况下EA会只绑定在指标信号后的第2个条形上。

或如果TP或SL触发了,它将等待新的信号,但只有当指标信号改变时才会出现。


空白的OnTick()

{

uptr =NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4)。

dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);

如果(DN_Trend()==true)

{

如果(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);

如果 (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits)。

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits)。

如果(OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("Sales error");

}

}

 
d1w4m3:

下午好。

我的内存已经在发火了:EA出现了一个问题,在拿下TP或SL后,它又打开了一个订单!这让我很不舒服。

我想不出在什么情况下EA会只绑定在指标信号后的第2个条形上。

或者,如果TP或SL触发了,专家顾问会等待新的信号,但只有在指标信号改变时才会出现。

如果最后关闭的头寸 与信号的类型相同,并且该头寸是在其中一个止损单上关闭的,那么就不要开仓。
 
Artyom Trishkin:
如果最后关闭的头寸 与信号进来时的类型相同,并且如果这个头寸是在其中一个止损单上关闭的,那么就不要开仓。


谢谢你的回答,但我才刚开始学了几个星期,如何在代码中实现这个问题,或者请告诉我在哪里可以读到。还是根据伊戈尔-金的说法?

而它却会开出一个位置,不按照系统的要求,在刚开始工作的时候,你的条件并不能避免这个问题。