mql5言語の特徴、微妙なニュアンスとテクニック - ページ 207

 
mktr8591:

実際の使用例 - VirtualライブラリのVIRTUALクラスには、static const VIRTUAL_DELETE VirtualDeleteが含まれています。

static const VIRTUAL static_Virtual で置き換えることができる。

(もちろんデストラクタもVIRTUALに移動) .

しないでください。new-objectは、プログラム終了時にデストラクタを呼び出さない。

 
fxsaber:

できません。新しいオブジェクトは、プログラムが終了しても、それ自身のデストラクタを呼び出すことはありません。

すみません、VIRTUAL_DELETEのどこが新しいのか理解できないのですが?
 
mktr8591:
申し訳ありませんが、VIRTUAL_DELETE newのどこがわからないのですが?

VIRTUAL::Createでは。


ZZZ このスレッドはVirtualについてではないのですが・・・。

 

Alertウィンドウを マイニングする。

#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より小さい場合があります。ブローカーソフトのバグに違いない。


GUIではこのように表示されます。


おそらく、バグだと思います。

でも、普通にできるんですよね?部分実行後にユーザー/ソフトウェアによって指値注文を変更した場合、ORDER_TIME_SETUPが 更新されます。

 
mktr8591:

でも、これもアリですよね?部分実行後、ユーザー/ソフトウェアによって指値注文が変更された場合、ORDER_TIME_SETUPが 更新されます。

このフィールドは定数である。チケットと一緒に書かれています。

 
fxsaber:

このフィールドは定数である。チケットと一緒に書かれています。

どうやら、私は取引状況を誤解していたようだ。

私のイメージでは、保留中の指値が複数の取引を通じて実行されました。この間、ライブ注文でハングアップし、ORDER_TIME_SETUP フィールドが定数でないことがありました。最後の取引後、履歴に入りました。その瞬間、ORDER_TIME_SETUPは 定数化された。

それとも、そうでなかったのか?