• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA(売り、買い))

VBAで売りと買いのサインを求める方法

このQ&Aのポイント
  • VBAを使って売りと買いのサインを求める方法について説明します。
  • 買いのあとは必ず売りで、売りのあとは必ず買いにするにはどうすればいいかについても解説します。
  • 具体的な条件判定のコード例も提供します。

質問者が選んだベストアンサー

  • ベストアンサー
  • e10go
  • ベストアンサー率38% (47/122)
回答No.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」になれば、その後のコードを実行します。 なお、中の条件を()で括るのは、条件同士の関係を明示的にするためです。

hiro526
質問者

お礼

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

その他の回答 (2)

  • e10go
  • ベストアンサー率38% (47/122)
回答No.2

こんばんわ。 >"買い"のときの値段から"売り"のときの値段の差額(収益)を"売り"のサインのとなりの列(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"型を使うようにしています。

hiro526
質問者

お礼

詳しい解説ありがとうございました。 とても参考になりました。

hiro526
質問者

補足

たびたびすみません。 最後の日にち(行305)では、必ず売買しなければならないという条件にしたいときはどうしたらいいでしょうか? ただし、最終日の前に”買い”であったときは最後日は“売り“になり、最終日の前に”売り”であったときは最後日は“買い”になることにします。 例えば、300行目で”買い”のとき、最終日である305行目では”売り”で終わらなければならない(301行目から304行目では取引はない)と、いうようにです。 それと、全部の売買回数の求め方も教えてください。 “買い”で1回、“売り“で1回です。買って、売ったら2回です。

  • e10go
  • ベストアンサー率38% (47/122)
回答No.1

こんにちわ。 買い条件になってから、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 '--------マクロコード--------終わり なお、コードは実際に動かしていないので、動作がおかしかったら、すみません。

hiro526
質問者

補足

ありがとうございました。無事に起動しました。 もう一つ質問があります。 "買い"のときの値段から"売り"のときの値段の差額(収益)を"売り"のサインのとなりの列(i,7)に、"売り"のときの値段から"買い"のときの値段の差額(収益)を"買い"のサインのとなりの列(i,7)に求めたいのですがどうすればいいですか? 例えば、101.50Buy→103.05Sell→102.82Buy→102.60Sell の売買のときは、 -101.50+103.05=1.35を売りのサインの行に 103.05-102.82を買いのサインの行に

関連するQ&A