错误、漏洞、问题 - 页 2744

 
Aliaksandr Hryshyn:

错误。


谢谢你的留言。
纠正了。

 
Ilyas:

优化的问题。在测试器中,每打一个勾,我都需要得到一个勾,以便进一步工作。我是这样做的。

void OnTick()
{
  static MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    // ...
}


很明显,这种变体的速度会比较慢。

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(Symbol(), Tick))
    // ...
}


但是SymbolInfoTick也比较慢,因为它的字符串参数不是通过引用传递的。


是否可以有常规的SymbolInfo*重载,其中字符串是通过引用传递的?


最好能有

const MqlTick _Tick; // Текущий _Symbol-тик.


在优化器中,这些函数被调用了数百亿次。

 
Ilyas:
你是否建议添加GetNextEvent函数?

并非如此,我宁愿把这个函数称为HandleNextEvent,这是一个可能的签名。

bool HandleNextEvent (ENUM_EVENT_TYPE);


当被调用时,类似于GetNextEvent,检查指定的ENUM_EVENT_TYPE是否存在于队列中,
,如果此事件存在,自动将控制权传递给相应处理程序的用户代码(OnChartEvent, OnTrade, OnTradeTransaction, ...(感谢fxsaber 的 补充))。
如果队列中有一个事件,则返回 true,否则返回 false。


可能的用例。

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....
 
fxsaber:

优化的问题。在测试器中,每打一个勾,我都需要得到一个勾,以便进一步工作。我是这样做的。
很明显,这种变体的速度会比较慢。

你在实践中检查过这种说法吗?它可能看起来正好相反。

MqlTick由未被初始化的原始数据类型组成。
相应地,在选择上根本不浪费时间,因为这是同样的 "sub esp "操作,只是大小不同。
结果,瓶颈可能在处理器的缓存上,用于从内存中读取数值的操作。

一般来说,我们应该测试一下))。

 
Sergey Dzyublik:

当该事件发生时,自动将控制权转移到相应处理程序的用户代码中。

可能的用例。

一个非常好的和有用的解决方案!

 
Sergey Dzyublik:

你在实践中检验过这一说法吗?结果可能恰恰相反。

在这里进行理论研究。我还没有检查过。但在字符串链接上的转移似乎是合适的。

 
Sergey Dzyublik:

一个可能的使用案例。

你没有任何意义。

根据签名和你的描述,终端应该调用一个函数来处理下一个事件,然后在调用handlenextevent的地方将控制权还给程序

如果handlenextevent在处理过程中被再次调用怎么办?

那些没有通过参数中的过滤器的事件会发生什么? 它们被跳过吗? 它们会改变队列吗?

脚本根本就没有事件队列,既然有专家顾问和指标,为什么还要拄着拐杖加上去?

 
TheXpert:

1)你在暗示某种无稽之谈。
2)根据签名和你的描述,终端应该通过函数调用下一个事件处理,然后将控制权返回到程序中的handlenextevent调用点
3)如果在处理过程中再次调用handlenextevent怎么办?
4)不属于参数中的过滤器的事件会怎样? 它们会被跳过吗? 它们会改变顺序吗?


1)我的工作是提供,但是否是疯狂的东西--这取决于开发人员,而不是你,他们更清楚一点......
2)好的。如果我对处理一个特定的事件感兴趣,而不是对系统中的所有事件感兴趣,那么最好是能够只处理这种类型的事件,而让其他事件的处理保持正常。
3) 如果HandleNextEvent在处理过程中被再次调用--调用并处理。唯一可能发生的是堆栈溢出,但这是用户和代码的问题,不是开发者的问题。
4) 不属于过滤器的事件仍然在相同的序列中,当用户像往常一样将控制权返回给系统时,将被调用。


 
TheXpert:

脚本根本就没有事件队列,既然有了EA和指标,为什么还要拄着拐杖加上去?

下面是 一个异步打开和关闭其头寸/订单的脚本的例子。

// Максимально быстро все закрывает. Возврат, когда действие подтверждено.
bool CloseAll()
{
  uint RequestID[];
  
  for (int i = ArrayResize(RequestID, OrdersTotal()) - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      // Отправили асинхронный приказ
      RequestID[i] = (OrderType() <= OP_SELL) ? OrderCloseAsync(OrderTicket(), OrderLots(), OrderClosePrice(), 100) : OrderDeleteAsync(OrderTicket());
  
  return(Transactions.Waiting(RequestID)); // Дождались ответа от сервера на все асинхронные приказы
}
TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 
Sergey Dzyublik:

1)建议是我的工作,是否是一个两难的问题,不是由你决定的,而是由开发商决定的,他们更清楚一点...

如果你建议的东西更容易实施,那么实施的机会就更大。删除了你的选项,因为它几乎什么都没有给出。