システムトレードブログ

株の自動売買ツールを作る(14)

トレシズ自動売買の開発方法

SBI対応のUWSC自動発注コード完成です笑

ライブスターに比べますとIFD注文がないため簡単というのもあったのですが、

それ以上にhtmlのソースコードがしっかりしている証券会社なので作りやすかったですね〜笑

このコードはライブスターのコードと同時に使うことを想定しておりまして、

ライブスターのウィンドウが開いている際に以下のコードが起動された場合には、

新たなウィンドウを立ち上げるような仕組みにしてあります。

そのため、無駄にログイン+ログアウトが繰り返されることはなく、比較的高速(?)な発注が実現できるような形ですね〜。

これで明日からオーバーナイトブレイクをSBIで使えそうです笑

次の段階としてはカブドットコムの発注に行くか、

それとも保有銘柄一覧+手仕舞いに行くかは結構迷うところですが、

ひとまずは後者から先に行くことになると思います。

■UWSC側(Dドライブ直下に「UWSC」フォルダを作り、その中にEXE化したorder_sbi.exeを保存)
----------------------------------------------------
Public LOGINURL = "https://k.sbisec.co.jp/bsite/visitor/top.do" // SBIログインURL
Public LOGFILE = "./log.txt" // ログファイルへのパス
Public CONFIGFILE = "./config.txt" // 設定ファイルへのパス
Public IE = 0 // IEオブジェクト用
Public SLEEPTIME // 画面遷移時の休止時間
Public CHANGESG // 信用建禁止銘柄の場合現物で発注する場合:1 しない場合
Public TEST // テストの場合1 実際に発注する場合0

// 設定ファイル読み込み
fid = FOPEN(CONFIGFILE,F_READ)
SLEEPTIME = getNumber(FGET(fid, 1))*0.1
CHANGESG = getNumber(FGET(fid, 2))
TEST = getNumber(FGET(fid, 3))
FCLOSE(fid)

//PARAM_STR[0]: 証券会社 SBI
//PARAM_STR[1]: ログインID
//PARAM_STR[2]: ログインパスワード
//PARAM_STR[3]: 取引パスワード
//PARAM_STR[4]: 制度信用S 現物G
//PARAM_STR[5]: 買いL 売りS
//PARAM_STR[6]: 銘柄コード
//PARAM_STR[7]: 銘柄名
//PARAM_STR[8]: 成行N 引成H 指値S 寄指Y 引指I 不成F 逆指値G 逆指値(指値指定)J
//PARAM_STR[9]: 株数
//PARAM_STR[10]: 指値
//PARAM_STR[11]: 逆指値
//PARAM_STR[12]: 注文ID

// IEのウィンドウが開いているかどうかチェック
flg = 0
Obj_Shell = CreateOleObj("Shell.Application")
for i = 0 to Obj_Shell.Windows.Count - 1
Obj = Obj_Shell.Windows.Item(i)
Try
ifB Obj > 0 and pos("iexplore.exe", Obj.Fullname) > 0
IE = Obj

// ライブスターと同じページの場合には新規ページにする
ifB pos("メインメニュー",IE.document.body.innerText)

else
IE.visible = True
flg = flg + 1
BREAK
Endif
Endif
Except

EndTry
NEXT

// IEのウィンドウが開いていない場合
ifB flg = 0

// ログイン処理へ
login(PARAM_STR[1], PARAM_STR[2], PARAM_STR[3], PARAM_STR[4], PARAM_STR[5], PARAM_STR[6], PARAM_STR[7], PARAM_STR[8], PARAM_STR[9], PARAM_STR[10], PARAM_STR[11], PARAM_STR[12], PARAM_STR[13], PARAM_STR[14], PARAM_STR[15], PARAM_STR[16])

// IEのウィンドウが開いている場合はメインメニューにいるかどうか調べる
else
// メインメニューにいるかどうか調べる
ifB pos("当社からのお知らせ",IE.document.body.innerText)
// ログイン中は何もしない
else
// ウィンドウを閉じてからログイン処理へ
IE.quit
login(PARAM_STR[1], PARAM_STR[2], PARAM_STR[3], PARAM_STR[4], PARAM_STR[5], PARAM_STR[6], PARAM_STR[7], PARAM_STR[8], PARAM_STR[9], PARAM_STR[10], PARAM_STR[11], PARAM_STR[12], PARAM_STR[13], PARAM_STR[14], PARAM_STR[15], PARAM_STR[16])
Endif
Endif

order(PARAM_STR[1], PARAM_STR[2], PARAM_STR[3], PARAM_STR[4], PARAM_STR[5], PARAM_STR[6], PARAM_STR[7], PARAM_STR[8], PARAM_STR[9], PARAM_STR[10], PARAM_STR[11], PARAM_STR[12], PARAM_STR[13], PARAM_STR[14], PARAM_STR[15], PARAM_STR[16])

//■数字を取得
Function getNumber(str)
Dim regex = CREATEOLEOBJ("VBScript.RegExp")
WITH regex
.Pattern = "\D" // 数字以外の文字に一致
.Global = TRUE // 全部が対象
str2 = .Replace(str, "") // 一致した文字を""に置き換える
ENDWITH
Result = str2
Fend

//■日付取得
Function getDateStr()
GETTIME()
Result = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
Fend

//■指値文字列取得
Function getSashineStr(ls, how, sashine)
Dim sashineStr = ""
ifB how = "N" OR how = "H" OR how = "G"
sashineStr = ""
else
sashineStr = sashine + "円"
Endif
Result = sashineStr
Fend

//■逆指値文字列取得
Function getSashineGStr(ls, how, sashineG, child=0)
Dim sashineGStr = ""
ifB how = "G" OR how = "J"
ifB ls = "S" // 信用売り(逆指値)
sashineGStr = sashineG + "円"
ifB child = 1
sashineGStr = sashineGStr + "以上"
else
sashineGStr = sashineGStr + "以下"
Endif
else // 買い(逆指値)
sashineGStr = sashineG + "円"
ifB child = 1
sashineGStr = sashineGStr + "以下"
else
sashineGStr = sashineGStr + "以上"
Endif
Endif
else
sashineGStr = ""
Endif
Result = sashineGStr
Fend

//■スリープ
Procedure ieSleep(IE)
REPEAT
SLEEP(SLEEPTIME)
UNTIL !IE.busy AND IE.readystate=4
Fend

//■エラー時の処理
Procedure error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, ok, msg, oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)

Dim fid = FOPEN(LOGFILE, F_READ or F_WRITE)
FPUT(fid, getDateStr() + "," + sgStr + "," + lgStr + "," + mCode + "," + mName + "," + howStr + "," + kabusu + "株" + "," + getSashineStr(ls, how, sashine) + "," + getSashineGStr(ls, how, sashineG) + "," + ocoifd + "," + c_howStr + "," + getSashineStr(ls, c_how, c_sashine) + "," + getSashineGStr(ls, c_how, c_sashineG, 1) + "," + ok + "," + msg + "," + oid)
FCLOSE(fid)

IELINK(IE,"トップ")
ieSleep(IE)

EXITEXIT
Fend

//■信用→現物変更時の処理
Procedure orderChange(sgStr, lgStr, howStr, loginId, loginPw, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, ok, msg, oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)

Dim fid = FOPEN(LOGFILE, F_READ or F_WRITE)
FPUT(fid, getDateStr() + "," + sgStr + "," + lgStr + "," + mCode + "," + mName + "," + howStr + "," + kabusu + "株" + "," + getSashineStr(ls, how, sashine) + "," + getSashineGStr(ls, how, sashineG) + "," + ocoifd + "," + c_howStr + "," + getSashineStr(ls, c_how, c_sashine) + "," + getSashineGStr(ls, c_how, c_sashineG, 1) + "," + ok + "," + msg + "," + oid)
FCLOSE(fid)

IELINK(IE,"トップ")
ieSleep(IE)

order(loginId, loginPw, orderPw, "G", ls, mCode, mName, how, kabusu, sashine, sashineG, oid, ocoifd, c_sashine, c_sashineG, c_how)
Fend

//■発注時の処理
Procedure complete(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, ok, msg, oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)

Dim fid = FOPEN(LOGFILE, F_READ or F_WRITE)
FPUT(fid, getDateStr() + "," + sgStr + "," + lgStr + "," + mCode + "," + mName + "," + howStr + "," + kabusu + "株" + "," + getSashineStr(ls, how, sashine) + "," + getSashineGStr(ls, how, sashineG) + "," + ocoifd + "," + c_howStr + "," + getSashineStr(ls, c_how, c_sashine) + "," + getSashineGStr(ls, c_how, c_sashineG, 1) + "," + ok + "," + msg + "," + oid)
FCLOSE(fid)

IELINK(IE,"トップ")
ieSleep(IE)

EXITEXIT
Fend

//■ログイン
Procedure login(loginId, loginPw, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, oid, ocoifd, c_sashine, c_sashineG, c_how)

sgStr = "現物" // 現物or信用
lgStr = "買い" // 買いor売り
howStr = "成行" // 仕掛け方法

ifB sg = "S"
sgStr = "信用" // 信用
ifB ls = "S" // 信用売り
lgStr = "売り" // 売り
Endif
Endif

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = True
IE.navigate(LOGINURL)
ieSleep(IE)

IESETDATA(IE,loginId,"username")
IESETDATA(IE,loginPw,"password")
IESETDATA(IE,True,"login")
ieSleep(IE)

// 該当銘柄が存在しない場合
ifB pos("違います",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "ログインID/パスワードエラー", oid, ocoifd, c_sashine, c_sashineG, c_how, "")
Endif

Fend

//■発注
Procedure order(loginId, loginPw, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, oid, ocoifd, c_sashine, c_sashineG, c_how)

sgStr = "現物" // 現物or信用
lgStr = "買い" // 買いor売り
howStr = "成行" // 仕掛け方法
c_howStr = "" // 未使用

ifB sg = "S"
sgStr = "信用" // 信用
ifB ls = "S" // 信用売り
lgStr = "売り" // 売り
Endif
Endif

IELINK(IE,"取引/株価照会")
ieSleep(IE)

// 銘柄検索
IESETDATA(IE,mCode,"ipm_product_code")
IESETDATA(IE,True,"id")
ieSleep(IE)

// 該当銘柄が存在しない場合
ifB pos("ありません",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "該当銘柄なし", oid, ocoifd, c_sashine, c_sashineG, c_how, "")
// セッション切れの際の処理
elseif pos("現物買",IE.document.body.innerText) = FALSE
IE.quit
login(loginId, loginPw, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, oid, ocoifd, c_sashine, c_sashineG, c_how)
order(loginId, loginPw, orderPw, "G", ls, mCode, mName, how, kabusu, sashine, sashineG, oid, ocoifd, c_sashine, c_sashineG, c_how)
Endif

// SOR対象銘柄の場合のみ優先市場をクリック
ifB pos("SOR",IE.document.body.innerText)
ifB pos("東証*",IE.document.body.innerText)
IELINK(IE,"東証*")
ieSleep(IE)
elseif pos("JASDAQ*",IE.document.body.innerText)
IELINK(IE,"JASDAQ*")
ieSleep(IE)
Endif
Endif

ifB sg = "S"

ifB ls = "S" // 信用売り

// 信用新規売をクリック
IELINK(IE,"信用新規売")
ieSleep(IE)

else // 信用買い

// 信用新規買をクリック
IELINK(IE,"信用新規買")
ieSleep(IE)
Endif

else // 現物買い

// 現物買をクリック
IELINK(IE,"現物買")
ieSleep(IE)
Endif

// エラーの際には戻って再度同じリンクをクリック
ifB pos("ご利用いただけません",IE.document.body.innerText)
IE.goBack
ifB sg = "S"

ifB ls = "S" // 信用売り

// 信用新規売をクリック
IELINK(IE,"信用新規売")
ieSleep(IE)

else // 信用買い

// 信用新規買をクリック
IELINK(IE,"信用新規買")
ieSleep(IE)
Endif

else // 現物買い

// 現物買をクリック
IELINK(IE,"現物買")
ieSleep(IE)
Endif
Endif

// 逆指値の場合
ifB how = "G" OR how = "J"
IELINK(IE,"逆指値注文はこちら")
ieSleep(IE)

IESETDATA(IE,sashineG,"trigger_price")

ifB ls = "S" // 信用売り
IESETDATA(IE,"以下","trigger_zone")
Endif

ifB how = "J"
IESETDATA(IE,"指値:無条件","sasinari_kbn")
IESETDATA(IE,sashine,"price")
else
IESETDATA(IE,"成行:無条件","sasinari_kbn")
Endif
Endif

IESETDATA(IE,kabusu,"quantity")

ifB how = "N" // 成行
IESETDATA(IE,"成行:無条件","sasinari_kbn")
elseif how = "H" // 引成
howStr = "引成"
IESETDATA(IE,"成行:引成","sasinari_kbn")
elseif how = "S" // 指値
howStr = "指値"
IESETDATA(IE,"指値:無条件","sasinari_kbn")
IESETDATA(IE,sashine,"price")
elseif how = "Y" // 寄指
howStr = "寄指"
IESETDATA(IE,"指値:寄指","sasinari_kbn")
IESETDATA(IE,sashine,"price")
elseif how = "I" // 引指
howStr = "引指"
IESETDATA(IE,"指値:引指","sasinari_kbn")
IESETDATA(IE,sashine,"price")
elseif how = "F" // 不成
howStr = "不成"
IESETDATA(IE,"指値:不成","sasinari_kbn")
IESETDATA(IE,sashine,"price")
Endif

IESETDATA(IE,orderPw,"password")

IESETDATA(IE,True,,"確認")
ieSleep(IE)

// エラーチェック
ifB pos("違います",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "取引パスワードエラー", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("誤っております",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "売買単位エラー", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("不足しております",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "余力不足", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("超えています",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "値幅制限エラー", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("制限値幅の範囲内で設定してください",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "逆指値:値幅制限エラー", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("指定はできません",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "アップティックルール規制", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("お取扱しておりません",IE.document.body.innerText)
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "非取扱銘柄", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
elseif pos("信用新規買は発注できません",IE.document.body.innerText)
ifB sg = "S" AND ls = "L" AND CHANGESG = 1 // 現物で発注
orderChange(sgStr, lgStr, howStr, loginId, loginPw, orderPw, "G", ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "信用規制銘柄", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
else
error(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "×", "信用規制銘柄", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
Endif
Endif

ifB TEST = 0 // 実際に発注する場合
IESETDATA(IE,True,,"注文発注")
ieSleep(IE)

complete(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "○", "発注完了", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
else // テストの場合
complete(sgStr, lgStr, howStr, orderPw, sg, ls, mCode, mName, how, kabusu, sashine, sashineG, "○", "発注完了(テスト)", oid, ocoifd, c_sashine, c_sashineG, c_how, c_howStr)
Endif
Fend
----------------------------------------------------

■設定ファイル(Dドライブ直下に「UWSC」フォルダを作り、その中にconfig.txtという名前で保存)
----------------------------------------------------
SLEEPTIME = 1 // 画面遷移時の休止時間
CHANGESG = 1 // 信用建禁止銘柄を現物で発注する場合1 しない場合0(半角)
TEST = 1 // テストの場合1 実際に発注する場合0(半角)
----------------------------------------------------

■コマンドプロンプト側
・通常注文の場合
----------------------------------------------------
"D:\UWSC\order_sbi.exe" "SBI" "証券会社ログインID" "証券会社ログインパスワード" "証券会社取引パスワード" "G" "L" "4755" "楽天" "N" "100" "0" "0" "12345"
----------------------------------------------------

・逆指値注文の場合(1102円以上になったら逆指値で成行買い)
----------------------------------------------------
"D:\UWSC\order_sbi.exe" "SBI" "証券会社ログインID" "証券会社ログインパスワード" "証券会社取引パスワード" "G" "L" "4755" "楽天" "G" "100" "0" "1102" "12345"
----------------------------------------------------

・EXE化していない場合:通常注文の場合
----------------------------------------------------
"C:\Program Files (x86)\UWSC\UWSC.exe" "D:\UWSC\order_sbi.uws" "SBI" "証券会社ログインID" "証券会社ログインパスワード" "証券会社取引パスワード" "G" "L" "4755" "楽天" "N" "100" "0" "0" "12345"
----------------------------------------------------

・EXE化していない場合:逆指値注文の場合(1102円以上になったら逆指値で成行買い)
----------------------------------------------------
"C:\Program Files (x86)\UWSC\UWSC.exe" "D:\UWSC\order_sbi.uws" "SBI" "証券会社ログインID" "証券会社ログインパスワード" "証券会社取引パスワード" "G" "L" "4755" "楽天" "G" "100" "0" "1102" "12345"
----------------------------------------------------

・EXE化していない場合:逆指値注文の場合(1102円以上になったら逆指値で1100円指値で買い)
----------------------------------------------------
"C:\Program Files (x86)\UWSC\UWSC.exe" "D:\UWSC\order_sbi.uws" "SBI" "証券会社ログインID" "証券会社ログインパスワード" "証券会社取引パスワード" "G" "L" "4755" "楽天" "J" "100" "1100" "1102" "12345"
----------------------------------------------------

トレシズの「自動売買の開発方法」の記事

前々記事:UWSCでイザナミを自動的に操作する(4)
前の記事:株の自動売買ツールを作る(13)
今の記事:株の自動売買ツールを作る(14)
次の記事:UWSCでイザナミを自動的に操作する(5)
次々記事:株の自動売買ツールを作る(15)

おすすめ記事

分足シストレの研究(1)

これまでの分足シストレの研究の成果(?)をシリーズ化していこうと思っています笑…

株の自動売買ツールを作る(15)

個人的な一括発注ツールのIFDO注文対応が完了しました笑これでおそらくは先日のエス…

> このページのURLをPCメールアドレスに送る