ホーム | アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


Tips >

マクロ、VBA の条件式のネスト

更新 : 2008/12/02

 



解説:
少し込み入った条件式を考えて見ます。いわゆるネスト(ネスティング、入れ子ともいいます。if 文の中に別の if 文がはめ込まれるような状態を指します)した if 文です。

ここで書く条件式は、ストラテジーとして有効かどうかの検証はしていません。セル、マクロの記述方法としてのサンプルなので、ストラテジーとしては参考にとどめておいた方が無難です。実際に使う場合は、十分に検証してからご利用ください。

解説は、"sample4.xls" を参照しながら行います(こちらからダウンロード)。

サンプルコード:
(例 1)
もし当日の終値(セル E4)が 5 日 SMA より高いか、当日の 5 日 SMA(セル G4)が前日
(セル G5)、前々日(セル G6)より高ければ買い(セル H4 に 1 と表示)。売るのは、当日の終値(セル E4)が 5日前の終値(セル E8)か高値(セル C8)より下落している場合だけとする(セル H4 に -1 と表示)、であれば =IF(OR(E4>G4,AND(G4>G5,G5>G6)),1,IF(OR(E4<E8,E4<C8),-1,1)) と記述します。

(例 2)
もし当日の終値(セル E4)が 5 日 SMA より高いか、当日の 5 日 SMA(セル G4)が前日(セル G5)、前々日(セル G6)より高ければ買い(セル H4 に 1 と表示)。売る場合は、当日の終値(セル E4)が 5日前の終値(セル E8)か高値(セル C8)より下落している、なおかつ当日の終値(セル E4)が当日の始値(セル B4)より下がった場合だけとする(セル G4 に -1 と表示)、であれば =IF(OR(E4>G4,AND(G4>G5,G5>G6)),1,IF(AND(OR(E4<E8,E4<C8),E4<B4),-1,1)) と記述します。

1 ヶ月程度の 4 本値とひとつのテクニカル指標(それも 5 日 SMA だけ)でも、いろいろなストラテジーが作れ、条件式は複雑になっていきます。これから先(複数のテクニカル指標、クロスタイミング、ブレイクアウトなどの組み合わせ)のことを考えると、やはりセルだけで処理を続けるのは、難しく感じます。

使用例:
Macro3 を使って(例 1)の条件式を引数付きプロシージャとして作成してみます。マクロ名は、 Macro4 とします。

Sub Macro4(days As Integer)

    Dim i As Integer
    Dim endrow As Integer
    Dim ret As Variant
    Dim msg As String
    Dim days As Integer

    ' メッセージを表示
    msg = Str(days) + "日SMA(単純移動平均線)を算出しますか? "
    ret = MsgBox(msg, vbYesNo + vbQuestion + vbDefaultButton2, "確認")

    '実行しない
    If ret = vbNo Then
        Exit Sub
    End If

    '画面の描画を停止
    Application.ScreenUpdating = False

    '終値列の一番最後の行番号(空白行の手前まで)を取得
    endrow = Range("E4").End(xlDown).Row

    For i = 4 To endrow - days + 1
        '=AVERAGE(E4:E8)
         Cells(i, 10) = WorksheetFunction.Average(Range(Cells(i, 5), Cells(i + days - 1, 5)))
    Next

    For i = 4 To endrow - days + 1 - 2

        '=IF(OR(E4>G4,AND(G4>G5,G5>G6)),1,IF(OR(E4<E8,E4<C8),-1,1))
        If Cells(i, 5) > Cells(i, 7) Or _
                (Cells(i, 7) > Cells(i + 1, 7) And Cells(i, 7) > Cells(i + 2, 7)) Then
            Cells(i, 11) = 1
        Else
            If Cells(i, 5) < Cells(i + 4, 5) Or Cells(i, 5) < Cells(i + 4, 3) Then
                Cells(i, 11) = -1
            Else
                Cells(i, 11) = 1
            End If
        End If

    Next

    'セルの形式を整える
    Range(Cells(4, 10), Cells(endrow - days + 1, 10)).NumberFormatLocal = "0"

    '画面の描画を再開
    Application.ScreenUpdating = False

End Sub

次に Macro4 を呼び出すプロシージャ Do_Macro4 を書いておきます。

'引数付きプロシージャを実行する
Sub Do_Macro4()

    'Macro4を動かす
    Call Macro4(5) '5日を指定

End Sub

こうすることで、長期や短期の SMA が引数を変えるだけで作成できるようになります(正解には、Macro4 で扱う変数や日にちの指定期間と株価データとの関係など、もう少し工夫する必要があります)。汎用性を考えたプログラミングは、C++Builder とも共通します。



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.