大野 了
バージョンアップ後の日本株発注関数をマクロから動かす方法について(NEWORDER、MARGINORDER、REPAYMENTORDER)
2020/2/22(猫の日、にゃー)に岡三RSSがバージョンアップされて、
日本株の新規発注関数に注文番号表示機能が追加されましたが、
表示機能が追加されたことにより、発注関数がVBAから関数を呼び出すことができなくなっているようです。
(呼び出すとVBAでエラーが発生する。)
回避策としては、マクロから直接発注するのではなく、
下記のように一度、セルに書き出して発注関数を実行させる必要があります。
※今までは大丈夫だった記述(2/22以降はエラーになる)
Call MARGINORDER("8609", "", 3, 0, "", 100, "T", "", "", 0, 0, "PASSWORD", 10, 0, 0, 0, 0, 0)
↓
※対応策 (Sheet1のA1のセルに、発注関数を書き込んで実行させる)
Sheet1.Range("A1").Value = "=MARGINORDER(""8609"", """", 3, 0, """", 100, ""T"", """", """", 0, 0, ""PASSWORD"", 10, 0, 0, 0, 0, 0)"
ただ、この方法でも一点問題があり、
マクロで書き出した発注関数は、マクロが終わるまで実際の発注がかかりません。
発注後マクロを抜けるようなVBAの中身だと問題がないのですが、
もし発注後に後処理がある場合、VBAを大きく作り変えないといけない状況が出てくると思われます。
DoEventsというVBAの関数を使うと、この問題も解決できるため、
使えそうなサンプルを2つ記述したいと思います!!
※上記の『=』や『/』は全角になっています。半角に変換してご使用ください。
2020年02月26日
大野 了
DoEventsを使用しつつ、発注が完了するのを待つ方式
1.マクロから直接呼んでいたMARGINORDERをコメントアウト
2.発注関数を任意のセルに書き込み(以下のサンプルではSheet1のA1)
この時、任意のセルに発注番号が出力されるようにする(サンプルではSheet1のB1))
3.B1に発注番号やエラーが戻ってくるまで、DoEventsを呼びながら待機
=============================================
'元々あった、発注関数を以下の様に変更
'Call MARGINORDER("8609", "", 3, 0, "", 100, "T", "", "", 0, 0, "PASSWORD", 10, 0, 0, 0, 0, 0)
' ↓
'Sheet1のA1セルに発注関数を書き出し、B1のセルに発注番号を戻す
Sheet1.Range("A1").Value = "=MARGINORDER(""8609"", """", 3, 0, """", 100, ""T"", """", """", 0, 0, ""PASSWORD"", 10, 0, 0, 0, 0, 0, B1)"
'Sheet1のB1に発注番号が戻ってくるまで待機
Call WaitForOrder(Sheet1.Range("B1"))
'発注待機関数
Private Sub WaitForOrder(TargetCell As Range)
Dim LimitTime As Date
'最大10秒待ちます。もしもっと待ちたい場合は下の数字を増やしてください
LimitTime = Now + TimeValue("00:00:10")
Do
DoEvents
If TargetCell.Value <> "" Then Exit Do
If Now >= LimitTime Then Exit Do
Loop
End Sub
=============================================
※上記の記号(『=』『/』『<』『>』『+』)は全角になっています。半角に変換してご使用ください。
2020年02月26日
大野 了
発注関数のような関数を作成し呼び出す方式
MARGINORDER_EXのような、
発注関数を同じような引数を持つ関数を作成し、その中で発注関数の書き込みと待機処理を行う
※追加するコードは増えますが、引数などを岡三RSSの関数と同じにできるため、発注の際のPG修正が少なくなります。
1.マクロから直接呼んでいたMARGINORDERをコメントアウト
2.新しく作った関数へ切り替え
=============================================
'元々あった、発注関数を以下の様に変更
'Call MARGINORDER("8609", "", 3, 0, "", 100, "T", "", "", 0, 0, "PASSWORD", 10, 0, 0, 0, 0, 0)
' ↓
'Sheet1のA1セルに発注関数を書き出し、B1のセルに発注番号を戻す
Call MARGINORDER_EX("8609", "", 3, 0, "", 100, "T", "", "", 0, 0, "PASSWORD", 10, 0, 0, 0, 0, 0, "B1", Sheet1.Range("A1"))
'拡張した発注待機関数
Public Sub MARGINORDER_EX(BrandCD As String, _
MarketCD As String, _
SalesType As String, _
ExecutiveCondition As String, _
OrderPrice As String, _
OrderAmmaunt As String, _
DurationType As String, _
Duration As String, _
AccountType As String, _
NoCommitConfirm As String, _
NoShowOrderWindow As String, _
Password As String, _
OrderCode As String, _
ExecutiveCondirionRev As String, _
OrderPriceRev As String, _
NoConfirm As String, _
NoShowWarning As String, _
MarginTradingType As String, _
DisplayArea As String, _
TargetArea As Range)
Dim OrderMessage As String
Dim LimitTime As Date
OrderMessage = "=MARGINORDER("
OrderMessage = OrderMessage & """" & BrandCD & ""","
OrderMessage = OrderMessage & """" & MarketCD & ""","
OrderMessage = OrderMessage & """" & SalesType & ""","
OrderMessage = OrderMessage & """" & ExecutiveCondition & ""","
OrderMessage = OrderMessage & """" & OrderPrice & ""","
OrderMessage = OrderMessage & """" & OrderAmmaunt & ""","
OrderMessage = OrderMessage & """" & DurationType & ""","
OrderMessage = OrderMessage & """" & Duration & ""","
OrderMessage = OrderMessage & """" & AccountType & ""","
OrderMessage = OrderMessage & """" & NoCommitConfirm & ""","
OrderMessage = OrderMessage & """" & NoShowOrderWindow & ""","
OrderMessage = OrderMessage & """" & Password & ""","
OrderMessage = OrderMessage & """" & OrderCode & ""","
OrderMessage = OrderMessage & """" & ExecutiveCondirionRev & ""","
OrderMessage = OrderMessage & """" & OrderPriceRev & ""","
OrderMessage = OrderMessage & """" & NoConfirm & ""","
OrderMessage = OrderMessage & """" & NoShowWarning & ""","
OrderMessage = OrderMessage & """" & MarginTradingType & ""","
OrderMessage = OrderMessage & DisplayArea
OrderMessage = OrderMessage & ")"
TargetArea.Value = OrderMessage
'最大10秒待ちます。もしもっと待ちたい場合は下の数字を増やしてください
LimitTime = Now + TimeValue("00:00:10")
Do
DoEvents
If TargetArea.Parent.Range(DisplayArea) <> "" Then Exit Sub
If Now >= LimitTime Then Exit Do
Loop
Call MsgBox("発注結果が取得できませんでした", vbCritical, "エラー")
End Sub
=============================================
※上記の記号(『=』『/』『<』『>』『+』)は全角になっています。半角に変換してご使用ください。
2020年02月26日
大野 了
Test.xlsx (25.9KB)
一応、作成したサンプルのExcelファイルも上げておきます。
マクロ付きファイルがあげれないため、拡張子をxlsxにしてあります
ダウンロード後、xlsmに変更しご使用ください!!
また、本サンプルはすべてのパラメータを完全にテストしたわけではありませんので、ご使用の際は自己責任にてよろしくお願い致します!!
2020年02月26日
RSSユーザー
今回の修正(バージョンアップ?,バージョンダウン?)は変更のタイミングといい内容といい私にとって最悪のものでした。
関数の属性が変更になり表示関数化によりマクロで実行できなくなりました。
一つの条件で最大6取引(返済、新規等)をこなさなければならない私のシステムではご提案の変更を加えてもスリッページの可能性大です。
異なる取引関数名で機能を追加すべきものだったと考えています。
涙です!!!
2020年02月29日
岡三オンライン証券
RSSユーザーさま
このたびの「岡三RSS(国内株式・先物OP)の機能拡充」において、ご迷惑をおかけしたことをお詫び申し上げます。
今後とも、より使い勝手の良い環境をご用意していきたいと思っております。
引き続きご利用くださいますようお願い申し上げます。
2020年03月02日
きゃべつ
>大野様
いつも情報ありがとうございます。
>発注関数がVBAから関数を呼び出すことができなくなっているようです。
>(呼び出すとVBAでエラーが発生する。)
こちらについてVBAから呼び出せるように、岡三側にバージョンアップ予定があるかご存じでしたらご教示いただけますか?
直接証券へ確認するのが筋ではありますが、週末となってしまったため、お手数ですがご存じでしたらお願いいたします。
>RSSユーザー様
今回の修正ひどいですよね...
周知も不十分で、私は本日ようやく今回の修正を知りました。(エラーは出てましたが自分のプログラムミスと思っていました)
マニュアルも実装の後に出されたようですし、、、はぁ、、、
2020年02月29日
岡三オンライン証券
きゃべつさま
このたびの「岡三RSS(国内株式・先物OP)の機能拡充」において、ご迷惑をおかけしたことをお詫び申し上げます。
いまのところ、VBAから関数を呼び出せるようにする対応を行う予定はございません。
なにとぞ、ご理解賜りますようお願い申し上げます。
2020年03月02日
RSSユーザー
全く同様、同感です!!
2020年02月29日
大野 了
>RSSユーザさん
自分がサンプルを作ってる時の話だけでいえば、一瞬(1秒未満)の遅延で済みそうです。
ですが、RSSユーザさんがおっしゃられます通り、
直接発行するより、確かにタイミングは遅くはなるので、
残念ながらスリッページ的には大きくなる方向にはなると思います。
何かいい方法を思い付いたら、また投稿しまっす!!
確かに今週は大きく動きすぎたのでタイミングが・・・(涙
>きゃべつさん
すみません・・・
今後、対応のバージョンアップがあるかどうかまでは・・・
元と同じようにマクロから直接動かせるようになるのが一番ですね、確かに・・・
2020年02月29日
sakai
〉大野様
匿名で失礼しました
3年ほど前に当サイトで大変お世話になりました
その後も皆さんもお悩みの情報取得関数(私の場合は返済取引のためのPosition関数)の誤動作(別Sheetへの書き込み)等もあり苦労しましたが何とか克服し、お陰様でそれなりに稼働する物ができ、システム作り、自動売買を楽しんでおりました ありがとうございました
上記誤動作はSheetへの書き込みに時間がかかるのが原因の一つかと思われますが、爾来情報表示関数への信頼が若干失せています
大部分の取引がスピードが求められる高速system相手の昨今の市場では私の 現strategy、systemの限界かとも感じています
近頃では更なる大変動ですが、河岸を変えて先物での再挑戦を考慮中です
先物での取引関数の情報取得関数化のないことを祈りつつ
2020年03月01日
大野 了
sakaiさん、こんにちは!!
以前にVBAの件でやり取りさせて頂いた方ですよね?(間違っていたらすみません。
その節はこちらこそ、お世話になりました。
なにはともあれ、システムが完成されたとことで、良かったです!!
ちゃんと動いた時の喜びはなんとも言えないですよね!!
別シートへの書き込みは、office365の環境だけの問題だったようで
現在は対応されているみたいです。
自分も先物で取引をしているのですが、先物はメモ機能などがあって
現物と比べてシステムがだいぶ作りやすいです!!
注文番号が落ちてくるのはものすごくありがたいので、
戻り値のような形で戻ってくるとありがたいのですが、
それはそれで、互換性が失われてしまうので難しそうですね・・・
2020年03月01日
岡三オンライン証券
いつも岡三RSSをご利用いただき、誠にありがとうございます。
2020/3/28(土)に岡三RSSの機能拡充を予定しています。
【新設】
NEWORDER_CL関数 : 現物注文(注文番号なし)
MARGINORDER_CL関数 : 信用新規注文(注文番号なし)
REPAYMENTORDER_CL関数 : 信用返済注文(注文番号なし)
これらの関数をご利用いただければ、VBAマクロから直接実行することができるようになります。
岡三RSSマニュアル(関数マニュアル・関数一覧)はこちら
https://www.okasan-online.co.jp/ont/rss/manual/
ぜひ、お試しくださいますようお願い申し上げます。
2020年03月27日
sakai
わーい!!!
どう対応したものか思案して、自動売買をお休みしていましたが、復帰できそうです
機能追加ありがとうございました
2020年03月28日
岡三オンライン証券
sakaiさま
お待たせいたしました。
ぜひ、お取引にご活用ください。
引き続き、よろしくお願いいたします。
2020年03月30日