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

 
PolarSeaman:

对不起,我不明白你为什么不能。

你可以,但它不会完全是一个定时器

if (IsTesting()) OnTimer();
 
PolarSeaman:

这就对了...如果虱子没来怎么办? 你需要在没有虱子的情况下 "开始"。

第一个刻度是用于同步的,如果开始的刻度没有到来,市场就会关闭,没有什么可做的。

 

晚上好!

我不得不再次请求帮助。

必须在一定的时间范围内开出一个订单,如果在过去30分钟内已经用这个魔法开出了一个订单,就不必再开了。像这样写。

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

如果你只留下第一部分,问题是,如果在这半小时内关闭了一个止损/止盈头寸,另一个就会打开。因此,我增加了第二部分,进入订单历史,如果在过去30分钟内已经有一个订单是这个磁带,那么就不要打开它。但第二部分出了问题--它仍然打开。

请指教!

 

你必须以秒计算。

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

你必须以秒计算。

不幸的是,这并不奏效。

又试了一下,也没有。

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

不幸的是,这并不奏效。

我又试了一下,但也没有成功。

你为什么要比较所有的线路?塔拉斯说得很对--以秒计算。他的版本不起作用,因为你仍然没有进入账户历史。

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

这是一个工作订单的循环。如果我们看一下历史,循环会是这样的。

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

那么,我们应该在循环中采用订单的关闭时间,而不是其打开时间

 
Ihor Herasko:

你为什么要比较所有的线路?塔拉斯说的没错,他说以秒计算。他的版本并不符合,因为你从未接触过账户历史。

这是一个工作订单的循环。如果我们看一下历史,循环会是这样的。

然后在循环中,我们应该取订单的收盘时间,而不是其开盘时间


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

如果我理解正确的话,你是指TimeToStr,也就是说,你已经把它翻译成了文字?

纠正了,但仍然是。

测试员

对不起,如果我是完全愚蠢的。

 
YanSay:

如果我理解正确,你是指TimeToStr--即翻译成文字?

纠正了,但还是。

如果我是完全愚蠢的,我很抱歉。

大声说出你的情况,你就会知道发生了什么事)。

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

如果以前的一个指标缓冲值被分配为空值,它是否会被从图表中删除?

还是在缓冲区内有一个空值,而绘图将保留在图表上?

 
YanSay:

如果我理解正确,你是指TimeToStr--即翻译成文字?

是的,将时间 转换为字符串 是没有意义的,因为时间是一个秒的数字。这个数字比字符串更容易和更快地工作。

纠正了,但还是。

如果我完全是愚蠢的,请原谅。

你纠正了一件事,破坏了另一件事)。

在第二部分,而不是。

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

把它带回来。

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

在你之前的尝试中,你的这一行是正确的。

原因: