mql5语言的特点、微妙之处以及技巧 - 页 207

 
mktr8591:

一个真实的使用例子--在虚拟库中,VIRTUAL类包含静态的const VIRTUAL_DELETE VirtualDelete。

它可以被静态常量VIRTUAL static_Virtual取代。

(当然也可以把析构器移到VIRTUAL).

不要。当程序终止时,new-objects不调用其析构器。

 
fxsaber:

你不能。当程序终止时,新对象不会调用自己的析构器。

对不起,我不明白VIRTUAL_DELETE中哪里是新的?
 
mktr8591:
对不起,不知道在VIRTUAL_DELETE新的哪里?

在VIRTUAL::Create。


ZZZ 该主题不是关于虚拟...

 

挖掘你的警报窗口

#ifdef __MQL5__
  #include <WinAPI\WinAPI.mqh>
#else // #ifdef __MQL5__
  #define long int
    #define  pack(A)  
      #include <WinAPI\WinAPI.mqh>
    #undef  pack
  #undef long
  
  #undef  HANDLE
  #define  HANDLE int
#endif // #ifdef __MQL5__ #else

uint GetProcessID( const HANDLE Handle )
{
  uint ID = 0;
  
  user32::GetWindowThreadProcessId(Handle, ID);
  
  return(ID);
}

// Возвращает хендл Alert-окна.
HANDLE GetAlertHandle( void )
{  
  static HANDLE Handle = 0;
  
  if (!Handle)
  {
    static const string AlertCaptions[] = {"Alert", "Алерт"};
    static const uint ProcessID = GetProcessID((HANDLE)::ChartGetInteger(0, CHART_WINDOW_HANDLE));  
    
    for (int i = 0; i < sizeof(AlertCaptions) / 12; i++)  
    {
      Handle = user32::FindWindowW("#32770", AlertCaptions[i]);
      
      if (Handle && (GetProcessID(Handle) == ProcessID))
        break;
      else
        Handle = 0;
    }
  }
    
  return(Handle);
}
 

自定义事件中的CPU负载。

void OnInit()
{
  EventChartCustom(0, 0, 0, 0, NULL);
}

void OnChartEvent( const int id, const long&, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
  {
    Sleep(0); // Без этой строки будет 100%-я нагрузка ядра CPU.
    
    EventChartCustom(0, 0, 0, 0, NULL);
  }
}
 
 

有时DEAL_TIME小于DEAL_ORDER_TIME_SETUP。一定是经纪人软件中的一个错误。

// Показывает ордера, которые имеют время выставления ПОЗЖЕ сделок, которые породил.
#property script_show_inputs

input datetime inFrom = D'2021.06.01';

void OnStart()
{
  if (HistorySelect(inFrom, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Deal = HistoryDealGetTicket(i);
      const ulong Order = HistoryDealGetInteger(Deal, DEAL_ORDER);
      
      if ((HistoryOrderGetInteger(Order, ORDER_TICKET) == Order) &&
          (HistoryOrderGetInteger(Order, ORDER_TIME_SETUP_MSC) > HistoryDealGetInteger(Deal, DEAL_TIME_MSC)))
        Print((string)Order + " - " + (string)Deal);
    }
}


这是它在GUI中的样子。


 
fxsaber:

有时DEAL_TIME小于DEAL_ORDER_TIME_SETUP。一定是经纪人软件中的一个错误。


这是它在图形用户界面中的样子。


很可能,这是一个错误。

但正常情况下是可以做到的,不是吗?如果我们在部分执行后由用户/软件改变限价单,ORDER_TIME_SETUP 将被更新。

 
mktr8591:

但这也是可能的,对吗?如果限价单在部分执行后被用户/软件改变,ORDER_TIME_SETUP 被更新。

这个字段是一个常数。它是和票据一起写的。

 
fxsaber:

这个字段是一个常数。它是和票据一起写的。

显然,我误解了交易情况。

我想象的方式是:通过几笔交易来执行待定限额。在这段时间里,它被挂在实时订单中,ORDER_TIME_SETUP 字段不是一个常数。在最后一次交易后,它进入了历史。在那一刻,ORDER_TIME_SETUP 成为一个常量。

还是没有呢?