質問掲示板
岡三RSS
集いの広場

アップロードされたファイルおよび投稿内容についての注意事項 別窓

複数の単語で検索する方法 別窓

【国内株式、先物・オプション】岡三RSS質問箱

ゆのみん

VBAでのドテン処理

VBAでのドテン処理について質問です。

下記のような売りポジション1枚保持からドテン処理をすると、
売りポジションのロスカットはできますが、
反対売買の処理ができないようです。

反対売買処理前のポジションチェックのタイミングでは、
タイミング的にポジションが残ってる状況になるのでしょうか?

もし、そうだとすると反対売買時にはポジションチェックせずに
発注処理することになりますが、
その場合、一時的にポジションを倍持つことになり、
証拠金は倍必要ということになるのでしょうか?


'売りポジション1枚保持からドテン処理

'ポジションのチェック
PosSize = PosReturn(2)

'Doten LossCut
If PosSize > 0 And PosType = "売" Then
Call 強制_LossCut1_3
End If 'if Range

'ポジションのチェック
PosSize = PosReturn(2)

'1枚もポジションを持ってなかったら処理
If PosSize = 0 Then
Call Buy1_成行
End If

よろしくお願いします。

2021年05月15日

大野 了

ゆのみんさん、こんにちは!!

PosReturn(2)の中身がわからないので、完全な妄想ですが(笑

もしこの関数の中身がポジション関数の吐き出したセルの内容を見ているだけで
Doeventsなどの処理が入っていないとすると、
Call 強制_LossCut1_3 でロスカットした後、
VBAの処理が終わっていないため、
岡三RSSがポジション情報を更新することが出来ず、
まだ、Excelのシート上はポジションが残っているように見えていると思われます。

これを回避するには、
onTimeを利用して、VBAを一度抜けるように作り直すか
Doeventsを入れて岡三RSSがセルを更新できるようにしてあげる必要があります!!

2021年05月15日

ログインしてコメントを投稿する

ゆのみん

大野さん回答ありがとうございます。

仰る通り、ポジション関数のセル出力を読み取ってるだけです。
メインのLoop処理は3秒毎に売買ロジックとポジション管理を処理をするようにしてます。

コメント頂いた意味が理解できませんでした。
Doeventsを入れて岡三RSSがセルを更新できるようにするとは具体的にどうすれば良いのでしょうか?

よろしくお願いします。

Static Sub Loop()

'ポジションのチェック
PosReturn = PosCheck()
PosSeries = PosReturn(0)
PosType = PosReturn(1)
PosSize = PosReturn(2)

'買いトリガー
If BuyTrigger=1 then

'Doten LossCut
If PosSize > 0 And PosType = "売" Then
Call 強制_LossCut1_3
End If 'if Range

'ポジションのチェック
PosReturn = PosCheck()
PosSeries = PosReturn(0)
PosType = PosReturn(1)
PosSize = PosReturn(2)

'1枚もポジションを持ってなかったら処理
If PosSize = 0 Then
Call Buy1_成行
End If

End if

'回帰処理 3sec毎にLoop
Application.OnTime Now + 3 / 86400, Procedure:="Loop"

End Sub

Function PosCheck() As Variant

Dim ddd As Integer
Dim PosSeries As Integer
Dim PosSize As Integer
Dim PosType As String

For ddd = 0 To 10
'保有照会 数量
If Cells(4 + ddd, 64).Value = "***END***" Then
Exit For
Else
'保有照会 行数
PosSeries = ddd + 1
'保有照会 売買
PosType = Cells(4 + ddd, 63).Value
'保有照会 数量
PosSize = PosSize + Cells(4 + ddd, 64).Value
End If
Next ddd

PosCheck = Array(PosSeries, PosType, PosSize)
End Function

2021年05月15日

ログインしてコメントを投稿する

大野 了

ゆのみんさん、こんにちは!!

Doeventsの件、説明不足で申し訳ありません。

今回、VBAの大まかな流れがわかったので説明しますと・・・
まず岡三RSSはVBA実行中は情報をセルに更新することができません。
※ExcelがVBAの処理につきっきりになってしまう。

ですので、ゆのみんさんのソースですとLoop()が3秒間隔で動きますが、
一度、Loop()の処理を抜けてVBAの処理がいったん終わり、
次のLoop()が動く3秒間の間にやっと岡三RSSのセルの更新が可能となります。

今回ですと、Call 強制_LossCut1_3の後にVBAを抜けることなく、
続けてPosCheck()で確認されていますので、
FNEWORDERで決済した結果(ポジションが無くなる)が、
セルに更新される前にセルの値として落ちてきません。


このため、これを回避させるためには、以下の3点が対応策となります。

1.3秒後の次に起きるLoop()の中でドテンの発注を行う
2.DoEventsを使用してVBA実行中でも、岡三RSSが更新できるようにする。
※Doeventsは、OSに他のイベント(岡三RSSのセル更新イベント)の処理をVBA実行中にやらせるための関数です。
3.ポジション関数に頼らず、変数などでポジションを管理しておき、決済したら変数を減算させる。

3は危険なので、一番のおすすめは安定的な処理の1です。(俺もこのやり方です)
ですが、もしそのほかのPGの関係で厳しい場合は、

Call 強制_LossCut1_3 と PosCheck()の間に
DoEventsの繰り返し処理を入れてあげると大丈夫と思います

例)

Call 強制_LossCut1_3

'DoEventsを無限に実行
Do while true
DoEvents

'DoEventsを実行し続けて、岡三RSSがセルを更新できるようにしてポジション情報が落ちてくるのを待つ
If ロスカットしたポジションが無くなれば Then
Exit Do
End If
Loop

'ポジションのチェック
PosReturn = PosCheck()

※テストしてないので、構文とか間違ってたらごめんなさい

という感じでしょーかー

DoEventsを実行すると、他のイベントの処理を動いてしまうので、
PGの作りによっては危険な動きをしてしまう可能性がありますのでお気を透けください!!

2021年05月16日

ログインしてコメントを投稿する

ゆのみん

大野さん

詳細な説明ありがとうございます。

VBA処理を抜けないとポジション情報は更新されないのですね。
理解できました。

1か2を試してみます。

2021年05月16日

ログインしてコメントを投稿する

大野 了

ゆのみんさん、こんばんは!!

上手く行くことを祈ってます!!

2021年05月16日

ログインしてコメントを投稿する

ゆのみん

大野さん

おはようございます。

2.は少し不安だったので、
1.の処理を下記のように追加しました。

ロスカット後に発注フラグをオンに設定。
次回のLoop処理の初めに発注フラグを確認。
発注フラグがオンなら発注処理を実行。
発注後はフラグをオフに設定。

昨晩、ドテン処理がうまく動作してることを確認しました。

ありがとうございました。

2021年05月22日

ログインしてコメントを投稿する

大野 了

ゆのみんさん、こんにちは!!

おぉぉ!!うまく行きましたか!!よかったです!

俺も他のコードとの兼ね合いが大丈夫であれば、1の方がよいと思います

なにはともあれ、上手くいってよかったです!!

2021年05月22日

ログインしてコメントを投稿する

すべての投稿を表示する

to_top
to_top

アップロードされたファイルにはウイルスチェックを行っておりますが、未知のウイルス等に感染されている場合がありますので、アップロードされたファイルのご利用はご注意ください。
また、取引パスワード等の重要な情報を投稿内容に含めないようご注意ください。
なお、アップロードされたファイルの利用や投稿内容によって、投稿者自身や他の利用者が被った損害に対して当社は一切責任を負いません。

また、セキュリティの関係上、一部コマンド等を含む内容を送信するとエラー画面が表示され、投稿ができない場合がございます。何卒ご了承ください。

岡三RSS集いの広場では、複数の単語による検索が可能です。

例)関数 and サンプル
→AND検索となり、「関数」および「サンプル」を含む検索結果が表示されます。

例)関数 or サンプル
→OR検索となり、「関数」または「サンプル」を含む検索結果が表示されます。

例)関数 not サンプル
→NOT検索となり、「関数」を含むが「サンプル」は含まない検索結果が表示されます。

※and、or、notの前後は半角スペースで区切ってください。
※単語の間を半角スペースで区切るだけだと、OR検索となります。