VBScript入門 for ITicker
■ 第1章 For...Next ステートメント
ITickerでスクリプトを作成する場合、For Nextステートメントは要のひとつです。
前章でもFor Nextステートメント説明していますが、For Nextステートメンの利便性を知っていただくため、移動平均のスクリプトを例にもう少し説明を行います。

1 .3日移動平均
'ここから
Option Explicit
Dim pen, index, sum, ave
ITCreateObjStdPen 1
Set pen = ITObjStdPen(0)
pen.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen

For index = 0 To ITMaxCnt-1
    sum = ITGetClose(index) '@:indexの日の終値
    sum = sum + ITGetClose(index-1) 'A:indexの日の1日前の終値を加算
    sum = sum + ITGetClose(index-2) 'B:indexの日の2日前の終値を加算
    'この時点で'sumには3日間の終値の合計値が入っている
    ave = sum / 3 '3日平均の計算
    pen.SetData index, ave, 0, True, RGB(255,0,0)
Next
ITDraw
' ここまで
  • 3日移動平均は短すぎて実用的ではないですが、これは後の説明のためのネタ振りです。辛抱してお付き合い願います。
  • さて上記スクリプト、一見問題無さそうに見えますが、実は重大な欠陥があります。わかりますか?
  • 前章で説明したように、ITGetClose( )関数の( )内に設定できる数値は0〜ITMaxCnt-1です。
  • indexが0の時、@は問題ありませんが、Aで計算するITGetClose( )の( )内の数値は-1、Bの場合は-2となります。このためスクリプトを実行するとエラーになります。
  • これを回避する主な方法としては以下の2つがあります。
'方法@
For index = 2 To ITMaxCnt-1
    sum = ITGetClose(index)
    sum = sum + ITGetClose(index-1)
    sum = sum + ITGetClose(index-2)
    ave = sum / 3
    pen.SetData index, ave, 0, True, RGB(255,0,0)
Next
  • 方法@はFor文の開始値を2にすることにより、ITGetClose( )の( )内の数値が負になる場合を未然に防いでいます。
'方法A
For index = 0 To ITMaxCnt-1
    If index-2 >= 0 Then
        sum = ITGetClose(index)
        sum = sum + ITGetClose(index-1)
        sum = sum + ITGetClose(index-2)
       ave = sum / 3
    End If
    pen.SetData index, ave, 0, True, RGB(255,0,0)
Next
  • 方法AはIf文でindex-2の値をチェックすることにより、ITGetClose( )の( )内の数値が負になる場合を未然に防いでいます。
  • これ以降の説明では、このAの方法を使用します。
2. 5日移動平均
'ここから
Option Explicit
Dim pen, index, sum, ave
ITCreateObjStdPen 1
Set pen = ITObjStdPen(0)
pen.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen

For index = 0 To ITMaxCnt-1
    ave = 0
    If index-4 >= 0 Then
       sum = 0 '0で初期化しておく
       sum = sum + ITGetClose(index-0) 'indexの日の終値
       sum = sum + ITGetClose(index-1) 'indexの日の1日前の終値を加算
       sum = sum + ITGetClose(index-2) 'indexの日の2日前の終値を加算
       sum = sum + ITGetClose(index-3) 'indexの日の3日前の終値を加算
       sum = sum + ITGetClose(index-4) 'indexの日の4日前の終値を加算
       'この時点で'sumには5日間の終値の合計値が入っている
       ave = sum / 5 '5日平均の計算
    End If
    pen.SetData index, ave, 0, True, RGB(255,0,0)
Next
ITDraw
' ここまで
  • 3日移動平均のスクリプトに数行加えただけで5日移動平均の出来上がりです。
  • 14、20・・・日移動平均もこの要領できます。しかしこの方法では日数が多くなると行数も増えて何かと面倒です。そこでFor文が活躍します。
  • For文を用いると「sum = sum〜」部分を以下の様に書くことができます。
'ここから
Option Explicit
Dim pen, index, sum, ave, j
ITCreateObjStdPen 1
Set pen = ITObjStdPen(0)
pen.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen

For index = 0 To ITMaxCnt-1
    ave = 0
    If index-4 >= 0 Then
        sum = 0 '0で初期化しておく
        For j = 0 To 4
               sum = sum + ITGetClose(index-j) 'indexの日のj日前の終値をsumに加算
        Next
       'この時点で'sumには5日間の終値の合計値が入っている
        ave = sum / 5 '5日平均の計算
    End If
    pen.SetData index, ave, 0, True, RGB(255,0,0)
Next
ITDraw
' ここまで
 
  • 更に、「If index-4 >= 0 Then」の「4」、「For j = 0 To 4」の「4」、「ave = sum / 5」の「5」、これらの数値は、移動平均の計算期間が決まれば自ずと決まってきます。
  • ということで、次はN日移動平均です。
3. N日移動平均
'ここから
Option Explicit
Dim IdouKikan '移動平均を計算する期間を指定するための変数
Dim pen, index, sum, ave, j
ITCreateObjStdPen 1
Set pen = ITObjStdPen(0)
pen.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen

For index = 0 To ITMaxCnt-1
    IdouKikan = 5
    ave = 0
    If index-(IdouKikan-1) >= 0 Then
        sum = 0 '0で初期化しておく
        For j = 0 To IdouKikan-1
               sum = sum + ITGetClose(index-j) 'indexの日のj日前の終値をsumに加算
        Next
       'この時点で'sumにはIdouKikan日間の終値の合計値が入っている
        ave = sum / IdouKikan 'IdouKikan日平均の計算
    End If
    pen.SetData index, ave, 0, True, RGB(255,0,0)
Next
ITDraw
' ここまで
  • これでIdouKikanに代入する数値を変更するだけで、お好きな期間の移動平均を描くことが出来ます。
  • 1〜3まで述べた考え方・プロセスは、プログラミングを行う場合色々な場面で応用できます。
  • For文を上手に使うと、スクリプトがすっきりし、変更などが簡単になります。
4. 移動平均を複数描く
  • 「IdouKikan = 5」〜「End If」をコピー、期間日数等を変更して、移動平均を3つ描くスクリプトがあっという間に完成です。
  • ITickerは標準で3本描けますので、このスクリプトを利用すると併せて6本同時表示できることになります。
  • 勿論、同様にして5,6・・個と更に増やすことも可能です。
'ここから
Option Explicit
Dim IdouKikan '移動平均を計算する期間を指定するための変数
Dim pen1, pen2, pen3, index, sum, ave, j
ITCreateObjStdPen 3
Set pen1 = ITObjStdPen(0)
Set pen2 = ITObjStdPen(1)
Set pen3 = ITObjStdPen(2)
pen1.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen
pen2.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen
pen3.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen

For index = 0 To ITMaxCnt-1
    '5日移動平均
    IdouKikan = 5
    ave = 0
    If index-(IdouKikan-1) >= 0 Then
        sum = 0
        For j = 0 To IdouKikan-1
               sum = sum + ITGetClose(index-j)
        Next
        ave = sum / IdouKikan
    End If
    pen1.SetData index, ave, 0, True, RGB(255,0,0)

    '20日移動平均
    IdouKikan = 20
    ave = 0
    If index-(IdouKikan-1) >= 0 Then
        sum = 0
        For j = 0 To IdouKikan-1
               sum = sum + ITGetClose(index-j)
        Next
        ave = sum / IdouKikan
    End If
    pen2.SetData index, ave, 0, True, RGB(0,255,0)

    '60日移動平均
    IdouKikan = 60
    ave = 0
    If index-(IdouKikan-1) >= 0 Then
        sum = 0
        For j = 0 To IdouKikan-1
               sum = sum + ITGetClose(index-j)
        Next
        ave = sum / IdouKikan
    End If

    pen3.SetData index, ave, 0, True, RGB(0,0,255)

Next
ITDraw
' ここまで

  • このスクリプトを良く見ると、「ave = 0」〜「End If」という全く同じコードが3回出てきています。この辺り何か工夫が出来そうです。
  • と、ネタを振りつつ次章に続きます。


第0章へ← →第2章へ

[トップページに戻る]