任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 846

 
Pokrov:

我在函数后面有GetLastError,如果发生错误,不是会转到这个块吗(按照写法),命令就不会被执行?我明白这个链条,例如OrderSend() -> GetLastError -> 错误块Sleep(3000) RefreshRates() -> 退出该块,如果条件不变,则再次请求OrderSend()。或者我的推理和概念是错误的。我明白你想在块中写出返回值1或0,但我的函数很简单,与布尔值无关,如SignalBuy,如果我理解正确,返回值应该在那里返回。

在错误的交易尝试次数上做一个循环。刷新交易环境。重置前一个错误的值,并发送一个交易请求,对返回的结果进行检查。如果返回一个错误,对其进行分析,根据错误代码,要么完全终止循环,要么执行必要的行动来纠正错误,并进入循环的下一个迭代。如果交易操作成功,中断循环并向调用程序返回与程序逻辑相对应的值,以便进一步处理交易请求结果(要么是函数执行成功标志,要么是未平仓订单号码,等等)。
 
Pokrov:

我在函数后面有GetLastError,如果发生错误,不是会转到这个块吗(按照写法),命令就不会被执行?我明白这个链条,例如OrderSend() -> GetLastError -> 错误块Sleep(3000) RefreshRates() -> 退出该块,如果条件不变,则再次请求OrderSend()。或者我的推理和概念是错误的。我明白你想在块中写出返回值1或0,但我的函数很简单,与布尔值无关,如SignalBuy,如果我理解正确,返回值应该在那里返回。

我还要补充一点,在你的例子中,在得到一个错误后没有任何反应。我们检查了一下,没有,只是我们决定睡一会儿,或者刷新一下数据。在OnTick()函数 完成后退出即可
 
下午好!

我需要一些建议。根据条件,该仓位应被关闭,121秒后应打开一个新的仓位。我怎么能用Sleep(121000)来做呢?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
日安!

我需要一些建议。根据条件,该仓位应被关闭,121秒后应打开一个新的仓位。我怎么能用Sleep(121000)来做呢?

帮助:OnTimer()
 
artmedia70:
OnTimer()来拯救
谢谢你!我从未使用过OnTimer(),这部分代码是在void OnTick()中。 我可以用OnTimer()处理OpenPosition()函数吗?如果可以的话,请纠正代码,如何在那里正确插入OnTimer()...
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

我刚刚重装了Windows 7,想安装Mt4,问题是文件无法下载,我应该怎么做?

 
阿列克谢和阿蒂姆,感谢你们的专家意见和建议!
 
abeiks:
谢谢!我从未使用过OnTimer(),这部分代码是在void OnTick()中。 那么OpenPosition()函数是否会由OnTimer()处理?如果可以的话,请纠正代码,如何在那里正确插入OnTimer()...

计时器是在OnInit()中启动的。

EventSetTimer(1); // раз в секунду

要开始倒计时,你需要在计时器中找到最后一个位置的关闭时间,并从这个时间开始计算121个苏昆德。为了传递允许你打开一个新位置的标志,使用一个全局变量,其范围涵盖整个程序。你可以让它最初包含一个大于121的值,例如122(你可以在设置中改变等待时间)。

在OnTick()中,检查这个变量。如果它大于121,并且没有头寸,你就打开一个头寸,在检查它是否成功打开后,将变量重置为零。

一旦仓位关闭,计时器就会看到关闭的时间(每秒连续进行一次),如果从当前时间到仓位关闭的时间少于121秒,计时器就开始计数--每秒钟的变量值就会增加1。

大约如此。其中可能存在一个错误--如果尚未平仓,其平仓时间等于零。这可能会导致启动倒计时的问题。例如,你可以将该变量重置为-1。

是的,别忘了在OnDeinit()中销毁定时器。

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

计时器是在OnInit()中启动的。

为了开始倒计时,你需要在计时器中找到最后一个位置被关闭的时间,并从该时间开始计算121秒。为了传递允许你打开一个新位置的标志,使用一个全局变量,该变量可由整个程序扩展。你可以让它最初包含一个高于121的值,例如122(你可以在设置中改变等待时间)。

在OnTick()中,你检查这个变量。如果它大于121并且没有位置--打开一个位置--在检查是否成功打开后,将变量重置为零。

一旦仓位关闭,计时器就会看到关闭的时间(每秒连续进行一次),如果从当前时间到仓位关闭的时间少于121秒,计时器就开始计数--每秒钟的变量值就会增加1。

大约如此。其中可能存在一个错误--如果尚未平仓,其平仓时间等于零。这可能会导致启动倒计时的问题。例如,你可以将该变量重置为-1。

是的,别忘了在OnDeinit()中销毁定时器。

明白了,谢谢。我希望能在一条线上完成,但可能我还得再努力一下。

 
abeiks:

我明白了,谢谢你。我希望能在一条线上完成,但我想这要花更多的功夫。

原因: