ゆのみん
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日