- ベストアンサー
VBAで売りと買いのサインを求める方法
- VBAを使って売りと買いのサインを求める方法について説明します。
- 買いのあとは必ず売りで、売りのあとは必ず買いにするにはどうすればいいかについても解説します。
- 具体的な条件判定のコード例も提供します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 回答遅くなり、すみません。 >最後の日にち(行305)では、必ず売買しなければならないという条件にしたいときはどうしたらいいでしょうか? 「If ... Then」、「ElseIf ... Then」で売買条件を判断していますが、この部分で最終日(最終行)にどちらかを実行するように変更すれば良いでしょう。 また、最終日(最終行)の変数を用意して、「For i = 2 To 最終日」と変えたほうが良いですね。 >それと、全部の売買回数の求め方も教えてください。 "売り"、"買い"のサインを記入する毎に、セルH2に記入数をカウントさせました。 '--------マクロコード--------始まり Sub test() Dim i As Long, f As Long, pb As Currency, ps As Currency Dim FDay As Long FDay = 305 '最終日(最終行)を設定 f = 0 For i = 2 To FDay If ((ActiveSheet.Cells(i - 1, 4) > 20 And ActiveSheet.Cells(i, 4) < 20) _ Or i = FDay) And f = 0 Then ActiveSheet.Cells(i, 6) = "買い" f = 1 pb = ActiveSheet.Cells(i, 4) If ps > 0 Then With ActiveSheet.Cells(i, 7) .Value = ps - pb .NumberFormatLocal = "G/標準" End With End If ActiveSheet.Cells(2, 8) = ActiveSheet.Cells(2, 8) + 1 '記入数のカウント ElseIf ((ActiveSheet.Cells(i - 1, 4) < 80 And ActiveSheet.Cells(i, 4) > 80) _ Or i = FDay) And f = 1 Then ActiveSheet.Cells(i, 6) = "売り" f = 0 ps = ActiveSheet.Cells(i, 4) With ActiveSheet.Cells(i, 7) .Value = ps - pb .NumberFormatLocal = "G/標準" End With ActiveSheet.Cells(2, 8) = ActiveSheet.Cells(2, 8) + 1 '記入数のカウント End If Next End Sub '--------マクロコード--------終わり 「If」、「ElseIf」の判定について説明します。 内容は、下のようになっています。 「If ((条件1 And 条件2) Or 条件3) And 条件4 Then」 ここでは、最優先される条件は、「条件4」が「True」になる事です。 次に、「条件1 And 条件2」または「条件3」のどちらかが「True」になれば、その後のコードを実行します。 なお、中の条件を()で括るのは、条件同士の関係を明示的にするためです。
その他の回答 (2)
- e10go
- ベストアンサー率38% (47/122)
こんばんわ。 >"買い"のときの値段から"売り"のときの値段の差額(収益)を"売り"のサインのとなりの列(i,7)に、"売り"のときの値段から"買い"のときの値段の差額(収益)を"買い"のサインのとなりの列(i,7)に求めたいのですがどうすればいいですか? >例えば、101.50Buy→103.05Sell→102.82Buy→102.60Sell の売買のときは、 >-101.50+103.05=1.35を売りのサインの行に >103.05-102.82を買いのサインの行に つまり、 F列に"買い"のサインを入た時に、G列に「前の"売り"の株価」-「今回の"買い"の株価」を入れる。 F列に"売り"のサインを入た時に、G列に「今回の"売り"の株価」-「前の"買い"の株価」を入れる。 という事ですね。 でしたら、サインを入れた時の"買い"の株価と"売り"の株価を記憶して、次回サインを入れる時に、その値を元に差額を計算して、入れれば良いでしょう。 '--------マクロコード--------始まり Sub test() Dim i As Long, f As Long, pb As Currency, ps As Currency '売り・買い状態を、"f"にフラグを立てて判別する。 '"f = 0"買い状態でない '"f = 1"買い状態である '"pb";買いの株価、"ps";売りの株価 f = 0 For i = 2 To 10 If ActiveSheet.Cells(i - 1, 4) > 20 And ActiveSheet.Cells(i, 4) < 20 _ And f = 0 Then ActiveSheet.Cells(i, 6) = "買い" f = 1 pb = ActiveSheet.Cells(i, 4) If ps > 0 Then With ActiveSheet.Cells(i, 7) .Value = ps - pb .NumberFormatLocal = "G/標準" End With End If ElseIf ActiveSheet.Cells(i - 1, 4) < 80 And ActiveSheet.Cells(i, 4) > 80 _ And f = 1 Then ActiveSheet.Cells(i, 6) = "売り" f = 0 ps = ActiveSheet.Cells(i, 4) With ActiveSheet.Cells(i, 7) .Value = ps - pb .NumberFormatLocal = "G/標準" End With End If Next End Sub '--------マクロコード--------終わり (注) .Value = ps - pb .NumberFormatLocal = "G/標準" について、 「.Value = ps - pb」のコード実行後、G列の表示形式が「通貨型」になり、「\」付きの表示になります。 そのため、「.NumberFormatLocal = "G/標準"」で表示形式を「標準」に戻しています。 なお、株価は"Currency"型で記憶しました。 株価は小数が2桁のため、"Double"型(または"Single"型)でも良いのですが、私は、金額の数値を扱う場合は、計算誤差を防ぐため"Currency"型を使うようにしています。
お礼
詳しい解説ありがとうございました。 とても参考になりました。
補足
たびたびすみません。 最後の日にち(行305)では、必ず売買しなければならないという条件にしたいときはどうしたらいいでしょうか? ただし、最終日の前に”買い”であったときは最後日は“売り“になり、最終日の前に”売り”であったときは最後日は“買い”になることにします。 例えば、300行目で”買い”のとき、最終日である305行目では”売り”で終わらなければならない(301行目から304行目では取引はない)と、いうようにです。 それと、全部の売買回数の求め方も教えてください。 “買い”で1回、“売り“で1回です。買って、売ったら2回です。
- e10go
- ベストアンサー率38% (47/122)
こんにちわ。 買い条件になってから、2つのケースに分かれるのですね。 「前回買ってから、まだ売っていなければ、何もしない。」 「前回買っていない。または、前回買った後、売っている場合は、買う。」 しかし、売り条件が、「買いのあとは必ず売りで」となっていますが、 「買いのあと売りが2回続いたら」どうなんでしょう。 売り条件は、「前回買ってから、まだ売っていなければ、売る。」だけで良いでしょうか。 でないと、空売りになるので、一応、そう考えてマクロコードを作りました。 '--------マクロコード--------始まり Sub test() Dim i As Long, f As Long '売り・買い状態を、"f"にフラグを立てて判別する。 '"f = 0"買い状態でない '"f = 1"買い状態である f = 0 For i = 18 To 305 If ActiveSheet.Cells(i - 1, 4) > 20 And ActiveSheet.Cells(i, 4) < 20 _ And f = 0 Then ActiveSheet.Cells(i, 6) = "買い" f = 1 ElseIf ActiveSheet.Cells(i - 1, 4) < 80 And ActiveSheet.Cells(i, 4) > 80 _ And f = 1 Then ActiveSheet.Cells(i, 6) = "売り" f = 0 End If Next End Sub '--------マクロコード--------終わり なお、コードは実際に動かしていないので、動作がおかしかったら、すみません。
補足
ありがとうございました。無事に起動しました。 もう一つ質問があります。 "買い"のときの値段から"売り"のときの値段の差額(収益)を"売り"のサインのとなりの列(i,7)に、"売り"のときの値段から"買い"のときの値段の差額(収益)を"買い"のサインのとなりの列(i,7)に求めたいのですがどうすればいいですか? 例えば、101.50Buy→103.05Sell→102.82Buy→102.60Sell の売買のときは、 -101.50+103.05=1.35を売りのサインの行に 103.05-102.82を買いのサインの行に
お礼
何度も何度もありがとうございました。