|
||
解説: 少し込み入った条件式を考えて見ます。いわゆるネスト(ネスティング、入れ子ともいいます。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 とも共通します。 |