マーケットスピード自動起動 補足

旧記事です。2012年の時点では、下記の方法は不要です。参考に残しておきます。

ログアウト→ログイン(ファイル名:MSSreStart.UWS)

マケスピをログアウト→ログインすることで接続し直す方法を示します。(Excelファイルを閉じて再び開くことでも接続し直す方法があるみたいだ。)

「ログアウトします」のダイアログ

右上のログアウトボタンをクリックし、ログアウトのダイアログを表示させます。「ログアウトします」のダイアログのボタンには、「はい」と「OK」との2種類があります。両方に対応させます。
ログアウトします 2 ログアウトします 1

「ログアウトします」のダイアログが表示されない場合

お客様情報に未読の重要なお知らせがあると、ログインしたときに自動的にお客様情報の画面に変更される。お客様情報が表示されている時にログアウトすると、この「ログアウトします」のダイアログは表示されない。従って、お客様情報に未読が残っている場合に、MSSstart.UWS実行後MSSreStart.UWSを実行するとログアウト・再ログインに成功していても、エラーNo.2となる。これを避けるには、例えばF10に先物OP市況情報を設定し、UWSCでF10のキー操作をマーケットスピードに送り、ログイン後の画面を常に先物OP市況情報にする方法が考えられる。(2008-04-01)

「サーバとの接続が切断されました」のダイアログ

同様に、「サーバとの接続が切断されました」のダイアログのボタンにも、「はい」と「OK」との2種類があります。両方に対応させます。
サーバとの接続が切断されました2 サーバとの接続が切断されました1

また、ONLINE ONLINEの表示の状態のままで、「サーバとの接続が切断されました」ダイアログが表示される時があります。このダイアログの「OK」ボタンを押すと、OFFLINE OFFLINEになります。ただし、サーバとの接続が切断されたのであるから、ONLINEと表示されていても、タスクトレイのRSSアイコンは「接続処理中」になるようです。

MSNAME = "Market Speed Ver8.0"	// マーケットスピードの名前を設定する。
PassWord = "*****"	//ログイン用パスワードを設定

// 変数を設定
PUBLIC エラーチェック
エラーチェック = 0

// ログアウトをし再ログインする。
CTRLWIN(GETID(MSNAME, "MDIFrame"), SHOW)
CTRLWIN(GETID(MSNAME, "MDIFrame"), NORMAL)	//ウインドウが表示されていないと、ログアウト確認などダイアログのボタンのクリックがうまくいかない。
CTRLWIN(GETID(MSNAME, "MDIFrame"), ACTIVATE)
SLEEP(1)
	
ID = GETID("Market Speed", "#32770")
IFB POS("サーバとの接続が切断されました。再ログインが必要です。", GETSTR(ID, 2, 1)) > 0 THEN
	// 例えばプロバイダとの接続を切断して再接続した場合、
	// Market Speedには「サーバとの接続が切断されました。再ログインが必要です。」のダイアログが表示され、
	// OKボタンを押すとログアウトした状態になる。(ルータ再起動で確認)
	CLKITEM(ID, "はい", clk_acc OR CLK_SHORT, TRUE, 1)	// 「はい」「OK」の2種類のダイアログがあるため、それら2つに対応。
	CLKITEM(ID, "OK", clk_acc OR CLK_SHORT, TRUE, 1)
ELSE
	// ログアウトを行う処理。
	// ログアウトボタンをクリックする。
	// 仮に「サーバとの接続が切断されました。再ログインが必要です。」のダイアログが表示されたままの状態で、
	// この処理を行うと、「ログアウトしますか?」のダイアログは表示される。「はい」ボタンも押すことはできる。

	//ウインドウのサイズを取得し、右上からログアウトボタンのある位置をクリックする。
	wNum = GETID(MSNAME, "MDIFrame")
	CTRLWIN( wNum, ACTIVATE)

	xx = STATUS( wNum, ST_X )
	yy = STATUS( wNum, ST_Y )
	width = STATUS( wNum, ST_CLWIDTH )
	// height =  STATUS( wNum, ST_CLHEIGHT )
	BTN(LEFT, CLICK, xx + width - 30, yy + 45, 300)	//「ログアウト」のボタンをクリック。 - 30, + 45はウインドウの右上からの補正した位置。適宜調節が必要。VISTAは + 45, XPのクラシック表示は + 30あたり。
	SLEEP(1)
	
	現在時刻秒 = GETTIME(0)
	WHILE (GETID("ログアウト確認", "#32770") < 0 ) AND (GETTIME(0) < 現在時刻秒 + 60)
		SLEEP(1)
	WEND
	SLEEP(2)

	// この時点で「サーバとの接続が切断されました。再ログインが必要です。」が出る可能性はある。
	// この場合、「ログアウトしますか?」の「はい」ボタンは押せる。(ルータ再起動で確認)

	id = GETID("ログアウト確認", "#32770")
	wks = GETSTR(id, 2, STR_STATIC)
	IFB POS("ログアウトしますか?", wks) > 0 THEN
	CLKITEM(id, "はい", CLK_BTN)
	ELSE
		エラーチェック = 1
	ENDIF
	SLEEP(3)

	// この時点で「サーバとの接続が切断されました。再ログインが必要です。」のダイアログは出る可能性がある。
	// ただし、この場合、「ログアウトしますか?」で「はい」を押しても、「ログアウトします。」のダイアログが出ない。
	// (再ログインが必要です。で、OKボタンを押したら、OFFLINEになるからか?)
	
	現在時刻秒 = GETTIME(0)
	WHILE (GETID("Market Speed", "#32770") < 0 ) AND (GETTIME(0) < 現在時刻秒 + 60)
		SLEEP(1)
	WEND
	SLEEP(3)	// ログアウトしますのOKボタンが押されない場合があるので、ここにSleepを入れてうまくいくかどうかテストする。

	// 「ログアウトします。」のダイアログが表示されているこの時点で
	// 「サーバとの接続が切断されました。再ログインが必要です。」のダイアログは出ないようだ。
	// 「ログアウトします。」で、「はい」を押してOFFLINEになる。

	エラーチェックB = 0
	現在時刻秒 = GETTIME(0)
	WHILE (GETID("Market Speed", "#32770") > 0) AND (GETTIME(0) < 現在時刻秒 + 60)	//60秒間で中断
		id = GETID("Market Speed", "#32770")
		wks = GETSTR(id, 2, STR_STATIC)
		IFB POS("サーバとの接続が切断されました。再ログインが必要です。", wks ) > 0 THEN
			CLKITEM(id, "はい", clk_acc OR CLK_SHORT, TRUE, 1)
			CLKITEM(id, "OK", clk_acc OR CLK_SHORT, TRUE, 1)
			エラーチェックB = 1
			SLEEP(2)
			// OKボタンを押したら、自動的にOFFLINEの状態になる。従って、ログアウトしますダイアログが表示される必要はないようだ。
			// PRINT "「再ログインが必要です」ダイアログが、ログアウト確認以後に表示されました。"
		ENDIF
		IFB POS("ログアウトします。", wks) > 0 THEN
			CLKITEM(id, "はい", clk_acc OR CLK_SHORT, TRUE, 1)	// 「はい」「OK」の2種類のダイアログがあるため、それら2つに対応。
			CLKITEM(id, "OK", CLK_BTN)
			エラーチェックB = 2
			SLEEP(2)
		ENDIF
	WEND
	IF エラーチェックB = 0 THEN エラーチェック = 2
ENDIF

SLEEP(2)

// ログインする。
CTRLWIN(GETID(MSNAME, "MDIFrame"), ACTIVATE)
SLEEP(1)
SCKEY(GETID(MSNAME, "MDIFrame"), VK_ALT, VK_F10)	// 「総合サマリー」画面に設定したショーカットキーを送る。
SCKEY(GETID(MSNAME, "MDIFrame"), VK_RETURN)
SLEEP(5)
LoginWindow = GETID("Market Speed - ログイン")
SENDSTR(LoginWindow, PassWord)
SLEEP(1)
SCKEY(LoginWindow, VK_RETURN)

// ログインに失敗した場合に備えたログイン処理。(ログインが出来ないのは、サーバが混んでいる時か?)
// Market Speed - ログインの表示は出ており、パスワード入力が出来なかった状態を想定する。
// 未読の重要なお知らせのウインドウを閉じる処理。
現在時刻秒 = GETTIME(0)
WHILE (GETID("Market Speed - ログイン") > 0) AND (GETTIME(0) < 現在時刻秒 + 60)	//60秒間で中断
	id = GETID("Market Speed", "#32770")
	wks = GETSTR(id, 2, STR_STATIC)
	IF POS("ネットワークに接続できません", wks) > 0 THEN CLKITEM(id, "OK", CLK_BTN)
	IF POS("「未読の重要なお知らせ」があります。", wks) > 0 THEN CLKITEM(id, "OK", CLK_BTN)
	IF POS("お知らせがあります。", wks) > 0 THEN CLKITEM(id, "OK", CLK_BTN)

	ID2 = GETID("Market Speed - ログイン")
	IFB ID2 >= 0 THEN
		SENDSTR(ID2, PassWord , 2)
		CLKITEM(ID2, "OK", CLK_BTN)
		SLEEP(2)
	ENDIF
WEND

// MSScheck.UWSが処理中の間に再びログイン処理を行うと、
// タスクトレイのアイコンが、「接続処理中」の場合に重なり(と思われる)エラーメールが送信される場合がある。
CALL MSScheck.UWS	// RSSの接続を確認するなら呼び出す。

ただし、昼のMSSreStart.UWSでログアウトに失敗した場合は、RSSの接続が途切れていても「RSS 接続中」と表示される(はず)なので、これを回避するために、ログアウトかログインに失敗した場合、エラーチェック = 1 または 2 または 3にして、処理に失敗したと判断します。

処理結果をメールで送信 方法2

basp21.dllを利用して、メールを送信する方法もあります。
(basp21.dllをWindows VISTA,7 64bitで利用するには設定すれば出来るかもしれませんが、詳細は調べていません。)
basp21.dllをインストールし、次のように、// メール送信以下のスクリプトを変更します。

// basp21.dll を利用して、メールを送信
bobj = CreateOLEObj("basp21")

svname = "mail.example.com"	//通常、SMTPサーバ名
mailfrom = "HOGE@FUGA.or.jp"	//送信元
mailto = "FUGE@HOGA.or.jp"	//送信先
files = ""

output = bobj.SendMail(svname,mailto,mailfrom, 件名,文書,files)

昼にRSSが一端途切れるのを回避する方法

ツールバーで為替を表示しておくと途切れないようです。為替(USD)は昼も更新されるため。

マーケットスピード ツールバー

環境設定画面 設定方法

昼のRSS切断対策

方法は2つあります。

  • MSSstart.UWSを実行し、マーケットスピードを一端終了させ、ログインする。
    単純で良いと思います。
  • MSSreStart.UWSを実行し、マーケットスピードを終了させることなく、ログアウト→ログインする。
    複雑です。

メモ

MSSreStart.UWSを利用したログアウト・再ログインは、エラー処理が複雑なため、これを避け、別の方法として、「一端マーケットスピードを閉じて再起動・ログインを行う」やり方もある。最初は、私もマーケットスピードを閉じ再起動する方法を行っていたが、これは力業な方法でよろしく無いだろうと考えたので、ログアウト・再ログインのスクリプトを作った。しかし、こんなに苦労するとは思わなかった。

履歴

2012-06-18
一部記事を補足に移動した。