岡三オンライン証券(代理記入)
当社に寄せられた質問「保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文について」
225先物です。複数の建玉の利益確定あるいは損切り(OCO)を行うため,
保有情報取得関数OPPOS1TI0Nで表示される評価損益額を使い、シートモジュール上に下記コードを書きました。
しかし、コンパイルエラー(プロシージャの宣言が、イベント又はプロシージャの定義と一致しません)と表示されました。修正すべき箇所をご教授いただければ、有難く存じます。宣しくお願い致します。
(シートモジュール)
Private Sub Worksheet_Change
Dim i as integer
For i =3 to 25
if Cells(i,9)<=-5000 then “評価損益額はCells(3.9)から記入
if cells(i, 1)=“買" then “建玉の売買の別は,Cells(3,1)から記入
Call 決済売
Else
Call 決済買
End if
End if
if Cells(i,9)>=5000 then
if cells(i, 1)=“買" then
Call 決済売
Else
Call 決済買
End if
End if
Next
End Sub
*損切り、利益確定ともそれぞれ-5000円 、5000円としています。
**決済売,買とも標準モジュールに於て、
sub 決済売 ()
kessaiuri=fneworder(成行・決裁売)
End Sub
をそれぞれ作成しています。
***3~25行まで保有の注文までの処理としています。
以上
2017年05月25日
小笠原聖史
おおた様
新規は偶数、決済は奇数とのアイデアで問題ないかと思います。
2017年05月29日
おおた
小笠原聖史 様
すいません。ご教示いただいたプログラムを走らせようとしたのですが,次の疑問ができました。宣しくご教授下さい。
1、Sub 決済発注 ()の中の発注ID=Cells(i,10)部分ですが、FOPPOS1T10Nには、,発注IDの項目はありません。メモの中に発注IDを入れておくのでしょうか?
2,Sub 決済発注 ()は、標準モジュールへの記入と思われます。何かトリガーがないとこのモジュールは,走らないと思いますが、何をドリガーにしているのでしょうか? シートモジュールに入れているのでしょうか?
おおた
2017年05月29日
小笠原聖史
foppositionを使ったOCO.xlsx (11.3KB)
おおた様の今までのコメントを拝見して、おやりになりたいことはこんなことかなと想像しながら、仕組みを作ってみました。
1、発注IDは、現在日時をセットすることでユニークにしてみました。
2、決済発注は、建玉の評価損益が±5000円以上になることをトリガーにしてみました。
添付のエクセルファイルにfoppositionをセットしております。
これに以下のプロシージャを標準モジュールにコピペしていただいて、「保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文」を実行していただくと、1秒おきに評価損益をチェックして、評価損益が±5000円以上となった建玉を決済していくという仕組みです。
黄色の網掛けが空白のうちは、1秒おきの繰り返しロジックが走り続けますので、止めたいときには、何かしらの文字なり数字を黄色の網掛けに入力してください。するとマクロが止まります。
以上、一度お試しいただけますでしょうか。
Sub 保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文()
If Cells(1, 15) <> "" Then
MsgBox "決済発注判定を修了します。"
Exit Sub
End If
Call 決済発注判定
反復時刻 = TimeValue(Now) + TimeValue("00:00:01")
Application.OnTime 反復時刻, "保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文"
Cells(1, 16) = TimeValue(Now)
End Sub
Sub 決済発注判定()
Dim i As Integer
Dim 建玉NO As String
Dim 発注ID As String
For i = 3 To 25
If Cells(i, 12) <= -5000 Or Cells(i, 12) >= 5000 Then
建玉NO = Cells(i, 10)
発注ID = Now()
If Cells(i, 5) = "買" Then
Call 決済売(建玉NO, 発注ID)
Else
Call 決済買(建玉NO, 発注ID)
End If
End If
Next
End Sub
Sub 決済売(建玉NO As String, 発注ID As String)
Rs = FNEWORDER("N225mini", "201706", 2, 建玉NO, "1", 1, 0, 0, 1, 0, 1, "", "password", 発注ID, 1, "trade10", "", "")
End Sub
Sub 決済買(建玉NO As String, 発注ID As String)
Rb = FNEWORDER("N225mini", "201706", 2, 建玉NO, "1", 3, 0, 0, 1, 0, 1, "", "Password", 発注ID, 1, "trade10", "", "")
End Sub
2017年05月30日
小笠原聖史
foppositionを使ったOCO.xlsx (11.4KB)
おおた様
すみません、
先ほどアップしたファイルではなく、こちらをお使いください。
※L3から評価損益額を表示するよう関数を設定していなかったので、修正いたしました。
2017年05月30日
おおた
小笠原聖史 様
わざわざ新らたなコードを、早速に作成頂き有り難うございました。コードをコピペして実行しました。以下2ケースともエラーが出てしまいます。
1.Sub 保有情報取得関数OPPOS1T10Nに表示される‥‥OCO注文()を実行すると、“決済建玉がありません“というエラーをが1秒毎でてきます。
2.新規売1枚を取得した後に(Sub 新規売()を実行し,1枚を取得)、Sub 保有情報取得関数OPPOS1T10Nに表示される‥‥OCO注文()を実行すると、又同じく“決済建玉がありません"というエラーがでます。FOPPOS1T10Nの決済注文中数量の表示は0となっています。
またまた、恐縮ですが、チェックの程を宣しくお願いします。
おおた
2017年05月30日
小笠原聖史
おおた様
申し訳ありません、ご不便をおかけいたしました。
1秒おきのループ処理だとエラーが出てしまいますので、10秒おきに修正しました。
※決済発注→大証にて約定→エクセルに建玉がなくなった旨データが送信される→RSSがエクセルから建玉情報を消す、以上のプロセス完了しないうちにループ処理をかけると、「決済処理は走るけれども建玉がない」ためにエラーとなっておりました。
その他、いくつか修正しております。以下のコードをお試しいただけますでしょうか?
Sub 保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文()
If Cells(1, 15) <> "" Then
MsgBox "決済発注判定を終了します。"
Exit Sub
End If
Call 決済発注判定
反復時刻 = TimeValue(Now) + TimeValue("00:00:10")
Application.OnTime 反復時刻, "保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文"
Cells(1, 16) = TimeValue(Now)
End Sub
Sub 決済発注判定()
Dim i As Integer
Dim 建玉NO As String
Dim 発注ID As String
For i = 3 To 25
If Cells(i, 12) = "***END***" Then
Exit For
End If
If Cells(i, 12) <> "" And Cells(i, 12) * 1 <= -5000 Or Cells(i, 12) >= 5000 Then
建玉NO = Cells(i, 10)
発注ID = Now()
If Cells(i, 5) = "買" Then
Call 決済売(建玉NO, 発注ID)
Else
Call 決済買(建玉NO, 発注ID)
End If
End If
Next
End Sub
Sub 決済売(建玉NO As String, 発注ID As String)
Rs = FNEWORDER("N225mini", "201706", 2, 建玉NO, "1", 1, 0, 0, 1, 0, 1, "", "password", 発注ID, 1, "trade10", "", "")
End Sub
Sub 決済買(建玉NO As String, 発注ID As String)
Rb = FNEWORDER("N225mini", "201706", 2, 建玉NO, "1", 3, 0, 0, 1, 0, 1, "", "password", 発注ID, 1, "trade10", "", "")
End Sub
2017年05月30日
おおた
小笠原聖史 様
修正コードを載きました。有難うございます。
コピペしたコードで実行しました。しかし.損切り価格に来ると、エラー"決済建玉がありません"がでてきます。I列の決済注文中数量は. 0となっています。申し訳ございませんが,再度、チェック頂けませんでしょうか?
おおた
2017年05月31日
小笠原聖史
おおた様
今朝も手元のPCでやってみたのですが、新規買い発注→約定→建玉の評価損益を監視→決済条件に合致→決済注文発注→約定、の流れは動作することが確認できております。ので、もしよろしければ、おおた様が標準モジュールに張り付けたVBAの記述を、パスワードの部分を無規則文字列に変換したうえで、このスレッドに張り付けていただくことはできますでしょうか?
2017年05月31日
おおた
すいません。夕方に戻りますので、至急送付させて頂きます〟
2017年05月31日
おおた
小笠原聖史様
遅れましてすいません。下記の通り使用したコードを送付します。よろしくお願いします。
Option Explicit
Dim 反復時刻 ’追加
Sub 保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文()
Sheets("決済").Select ’追加
If Cells(1, 15) <> "" Then
MsgBox "決済発注判定を終了します。"
Exit Sub
End If
Call 決済発注判定
反復時刻 = TimeValue(Now) + TimeValue("00:00:10")
Application.OnTime 反復時刻, "保有情報取得関数OPPOS1TI0Nに表示される評価損益額を使ったOCO注文"
Cells(1, 16) = TimeValue(Now)
End Sub
Sub 決済発注判定()
Dim i As Integer
Dim 建玉NO As String
Dim 発注ID As String
Sheets("決済").Select ’追加
For i = 3 To 25
If Cells(i, 12) = "***END***" Then
Exit For
End If
If Cells(i, 12) <> "" And Cells(i, 12) * 1 <= -1000 Or Cells(i, 12) >= 1000 Then
建玉NO = Cells(i, 10)
発注ID = Now()
If Cells(i, 5) = "買" Then
Call 決済売(建玉NO, 発注ID)
Else
Call 決済買(建玉NO, 発注ID)
End If
End If
Next
End Sub
Sub 決済売(建玉NO As String, 発注ID As String)
Dim Rs As String ’追加
Rs = FNEWORDER("N225mini", "201706", 2, 建玉NO, "1", 1, 0, 0, 1, 0, 1, "", "kkk7777", 発注ID, 1, "trade10", "", "")
End Sub
Sub 決済買(建玉NO As String, 発注ID As String)
Dim Rb As String ’追加
Rb = FNEWORDER("N225mini", "201706", 2, 建玉NO, "1", 3, 0, 0, 1, 0, 1, "", "kkk7777", 発注ID, 1, "trade10", "", "")
End Sub
おおた
2017年05月31日