Bloomberg Automation - (3).Login 及 Logout

Auto login / logout Bloomberg

本系列的主題如下,所有的程式碼可以從 這裡 下載。

 

Bloomberg Terminal 在一段時間無人操作時會自動登出系統,因此若是採用排程執行程式有可能會發生未登入Bloomberg 而無法執行DDE指令,另外Bloomberg 可以依據不同的帳號設定所屬的資料篩選方式,在此情況下就需登入特定帳號才可取得所需的資料,因此若有重新登入的需求就可採用本篇的作法。

Bloomberg 登入及登出

使用者開啟Bloomberg後按下<Enter>或<GO>鍵出現登入畫面,輸入帳號及密碼按下<Enter>登入系統,並顯示主畫面

 

程式邏輯

程式傳送 ON<GO>指令至Bloomberg就會出登入畫面,在這個畫面需要填入帳號及密碼,程式可直接傳送帳號字串至Bloomberg,Bloomberg會自動將文字帶到帳號欄位,接下來要解決游標如何從帳號移至密碼欄位的問題,最簡單的作法就是模擬按 TAB 鍵,在 Bloomberg DDE中可以直接用 <TABR> 指令,TABR 的R代表Right,亦即按下TAB游標往右的意思,因此輸入帳號及密碼的指令就是 UserName<TABR>Password<GO>

有<TABR>同時也會有按下 Shift+Tab讓游標往左一個欄位的指令,各位應該可以猜到就是<TABL>,在前一篇文章建立的BloombergKeys Class 中有定義TabRight、TabLeft兩個變數,就是對應到<TABR>及<TABL>的字串。

登入畫面講完了,登出的功能就簡單了,只要輸入OFF就會登出Bloomberg。

我已經將幾個常用的指令定義在BloombergFunctions Class,指令定義如下供各位參考:

public static class BloombergFunctions
{
  public const string Login = "ON";      // Login
  public const string Logout = "OFF";    // Logout
  public const string GRAB = "GRAB";     // Sending Screenshots
  public const string Language = "LANG"; // Change UI Language
  public const string Home = "Home";     // Go Home
  public const string GoPrev = "GO BACK";    // Go Back
  public const string GoNext = "GO FWD";    // Go FWD
}

接下來開始講解登入系統程式,在BloombergDDEBase Class加入下面程式

// Login Terminal, input id/pwd
public void InputLoginUser(string userName, string password)
{
  int windowsNum = 1;

  // Logout first: <CANCEL>OFF<GO>
  DDEInputCommand(windowsNum, BloombergKeys.Cancel + BloombergFunctions.Logout + BloombergKeys.Go);

  Sleep(TimeSpan.FromSeconds(3));

  // Login : ON<GO>
  DDEInputCommand(windowsNum, BloombergFunctions.Login + BloombergKeys.Go);

  Sleep(TimeSpan.FromSeconds(3));

  // Input Username / Password : {userName}<TABR>{password}<GO>
  DDEInputCommand(windowsNum, userName + BloombergKeys.TabRight + password + BloombergKeys.Go);
  Sleep(TimeSpan.FromSeconds(10));
}
		
public void Sleep(int milliseconds)
{
  if (milliseconds != 0)
  {
    Thread.Sleep(milliseconds);
  }
}

public void Sleep(TimeSpan delay)
{
  if (delay.TotalMilliseconds != 0)
  {
    Thread.Sleep(delay);
  }
}

在 InputLoginUser method 中,windowsNum = 1指定使用第1個視窗執行指令,接下來先登出目前的帳號以避免目前已有其它帳號登入的情況下無法用新的帳號登入,我們傳送 <CANCEL>OFF<GO> 給Bloomberg 做登出的動作,OFF指令是登出的指令,而<CANCEL>是告訴Bloomberg要取消目前的作業,會傳送<CANCEL>的原因是假設目前Terminal 有前一位使用者操作到一半而Bloomberg 正在等待使用者輸入與該指令相關的資料時,在這種情況下程式輸入的指令有可能不被Bloomberg接受而導致發生未預期的結果,因此比較保險的作法是先送出<CANCEL>指令取消目前的作業再做我們要執行的指令。

送出登出 OFF指令後,先給Bloomberg 一點時間處理登出的動作,所以執行 Sleep指令等待3秒,接下來再送出 ON<GO> 登入系統並等待3秒,這時Bloomberg 會跳到輸入帳號密碼的畫面,此時要模擬輸入 UserName 、按下Tab鍵、輸入密碼等動作,可透過程式傳送 UserName<TABR>Password 指令,最後等待10秒讓Bloomberg 執行完登入的動作。

接下來寫一支測試程式,我們繼續延用上一篇文章建立的 frmDDE Form , 增加 ReLogin 按鈕

程式碼如下

private void btnReLogin_Click(object sender, EventArgs e)
{
  using (BloombergDDEBase bloombergDDE = new BloombergDDEBase())
  {
    LogPrint("Before Login");
    bloombergDDE.InputLoginUser("YourId", "YourPassword");
    LogPrint("After Login");
  }
}

將程式中的 "YourId""YourPassword" 改成你登入Bloomberg 的帳號及密碼,執行後可看到Bloomberg 會先登出目前的帳號,顯示登入的畫面,並自動填入帳號及密碼,最後完成登入並跳至主畫面。

下一篇文章將會說明讓Bloomberg 界面顯示不同語系的功能。