ITickerによるテクニカル分析検証例

ITickerのダウンロード

三点チャージ

はらみ線

チャネルブレイクアウト

曜日と株価

ゴールデンクロスとデッドクロス

検証:はらみ線
  左図の様に前日の値幅以内の小幅な値動きになっている場合を「はらみ線」と呼び、相場の流れが変わる前兆として位置付けて注視する考え方があります。つまり、トレンドが下降傾向にあるとき「はらみ線A」が現れると上昇に転じ、またトレンドが上昇時にあるとき「はらみ線B」が現れると下降に転じるのではないか、というものです。
  ここではこのトレンドの判定にRSIを用いて、
  • RSI<40では下降トレンド
  • RSI>60では上昇トレンド
とみなして、ITickerの検証例を作成してみました。

検索例
・RSI5日が60以上、上図のはらみ線Bの場合の検索例です。


シミュレーション例
[ウィザードでの設定例]
ITickerではウィザードを使って各項目を設定するだけで様々なシミュレーションを簡単に行うことが出来ます。
また、ユーザ定義でユーザ独自の判定条件を定義・設定することができます。
下図はRSIとはらみ線の設定例です。


指標3領域の[設定]では下図のようなはらみ線判定のユーザ関数を定義しています。
・上記 Sub UserDef1(hC, aRet) 〜 End Sub の中身です
'ここから
Dim i, cnt
cnt = hC.GetCnt()
aRet.Init cnt, 0
For i=1 To cnt-1
  If hC.GetOpen(i-1) > hC.GetClose(i-1) And hC.GetOpen(i) > hC.GetClose(i-1) _
    And hC.GetClose(i) < hC.GetOpen(i-1) And hC.GetOpen(i) < hC.GetClose(i) Then
    aRet.SetData i, 1
  ElseIf hC.GetOpen(i-1) < hC.GetClose(i-1) And hC.GetOpen(i) < hC.GetClose(i-1) _
    And hC.GetClose(i) > hC.GetOpen(i-1) And hC.GetOpen(i) > hC.GetClose(i) Then
    aRet.SetData i, -1
  Else
    aRet.SetData i, 0
  End If
Next
'ここまで
◎以下のような操作で上記コードをユーザ定義のエディット画面にコピーできます。
  1. マウスで「'ここから」〜「'ここまで」までを選択
  2. 右クリック→コピー(C)でクリップボードにコピー
  3. ユーザ定義を開く
  4. エディット画面上でマウス右クリック
  5. 貼り付け(P)を選択
上記設定を実行させた場合のチャート例です。
ウィザードのバックテストはシグナルが出た翌営業日の始値で売買を行います。


[スクリプトの作成例]
ウィザードを使用しないで、ユーザがスクリプトを作成して様々な処理を行うことも出来ます。
ここでは以下のような条件でスクリプトを作成してみました。
  • 売買ルールは以下の様にしています。
    • RSI<40ではらみ線Aの時、その翌日の始値で買い、三日後の始値で売却
    • RSI>60ではらみ線Bの時、その翌日の始値で売りから入り、三日後の始値で買い戻し
  • RSIを作画し、RSI<40、RSI>60、はらみ線A、はらみ線Bの時マーキングを行います。
  • 売買した場合の取引値・日をラインで表示します。(利益時は緑線、損した時は赤線)
  • 最後に売買記録をダイアログで表示します。


こういった検証の場合、シグナルが出た後の反対売買のやり方によっても成績が大きく異なります。ここでは単純に20日後に反対売買を行っているだけです。ロスカットやルール変更・追加等、後は皆さんの工夫次第です。

◎以下のような操作を行えば、下記サンプルスクリプトがそのまま実行出来ます。
  1. マウスで「'//スクリプト開始」〜「'//スクリプト終わり」までを選択
  2. 右クリック→コピー(C)でクリップボードにコピー
  3. メモ帳などのテキストエディターに貼り付け
  4. 名前はなんでも構いませんが、拡張子を必ずitcにして保存。
    (*メモ帳で保存する場合は、ファイルの種類を必ず「すべてのファイル」に指定して拡張子itcを付けて保存して下さい。)
  5. ITickerからチャートを開き、をクリック。
  6. 選択のダイアログから保存したファイルを選択。
尚、RSIや売買の期間を変えたい場合は、スクリプト中の以下の部分

Const TERM_RSI = 5 'RSIの計算期間の設定
Const HOLD_TERM = 3 '売買期間の設定

を、RSIの下限上限を変えたい場合は、

markRsi.IsSetDataConst aData, ">", 60, aSell, aSell, True, colSell '60より大きい場合のみマーク
markRsi.IsSetDataConst aData, "<", 40, aBuy, aBuy, True, colBuy '40より小さい場合のみマーク

を変更するだけでOKです。

'//スクリプト開始
Option Explicit '変数の明示的な宣言を強制

'//////////////////////
'//関数の定義
'//
'はらみ線Aパターンの判定(はらみ:True、以外:False)
Function CheckHaramiA(index, hC)
    CheckHaramiA = False
    If hC.GetOpen(index-1) > hC.GetClose(index-1) _
            And hC.GetOpen(index) > hC.GetClose(index-1) _
            And hC.GetClose(index) < hC.GetOpen(index-1) _
            And hC.GetOpen(index) < hC.GetClose(index) Then
        CheckHaramiA = True
    End If
End Function

'はらみ線Bパターンの判定(はらみ:True、以外:0)
Function CheckHaramiB(index, hC)
    CheckHaramiB = False
    If hC.GetOpen(index-1) < hC.GetClose(index-1) _
           And hC.GetOpen(index) < hC.GetClose(index-1) _
           And hC.GetClose(index) > hC.GetOpen(index-1) _
           And hC.GetOpen(index) > hC.GetClose(index) Then
        CheckHaramiB = True
   End If
End Function

'売買取引のライン引き、差額を返す
Function Trade(i0, i1, pL, hC)
    Dim x0, x1, y0, y1
    Dim col
    x0 = ITGetXPixelFromIndex(i0)
    y0 = hC.GetOpen(i0)
    x1 = ITGetXPixelFromIndex(i1)
    y1 = hC.GetOpen(i1)

    Trade = Round(y1 - y0, 3)

    If Trade > 0 Then
        col = RGB(0,196,0)
    ElseIf Trade < 0 Then
        col = RGB(255,0,0)
    Else
        col = RGB(0,0,255)
    End if
    '取引のライン引き
    pL.SetCnd ITAreaStock, ITStyleSolid, 2, ITModeCopypen
    pL.SetData x0, y0, x1, y1, True, col
End Function

'/////////////////////
'// オブジェクト・変数の設定
'//
'テクニカル計算、チャート作成用
Dim colBuy, colSell
Dim penRsi, markRsi, markHarami
Dim hChart
Dim aData, aSell, aBuy
Const TERM_RSI = 5 'RSIの計算期間の設定
colBuy = RGB(191,191,127)
colSell = RGB(191,191,255)

'売買検証用
Dim index
Dim fRecord
Dim strLog
Dim sum, diff
Dim cntWin, cntEven, cntLoss
Dim cntLine 'ライン線数の判定用
Const LINE_MAX = 200 'ライン線の最大数
Const HOLD_TERM = 3 '売買期間の設定

'「ITCreateObjStdPen」はスクリプト内で一回しか設定できません。
ITCreateObjStdPen 3
Set penRsi = ITObjStdPen(0)
Set markRsi = ITObjStdPen(1)
Set markHarami = ITObjStdPen(2)

'「ITCreateObjLinePen」はスクリプト内で一回しか設定できません。
ITCreateObjLinePen LINE_MAX '売買履歴のライン

'時系列データオブジェクトITObjHistDataを作成
Set hChart = ITCreateObjHistData
Set aSell = ITCreateObjArrayData
Set aBuy = ITCreateObjArrayData

'配列データ処理用のITObjArrayDataを作成
Set aData = ITCreateObjArrayData

'///////////////////////////
'// テクニカル計算、チャート作成
'//
hChart.SetCurrentChart '現在開いているチャートの時系列データを取得
aSell.Init hChart.GetCnt, -10 '-10で初期化
aBuy.Init hChart.GetCnt, 10 '10で初期化

'RSI
penRsi.SetCnd ITAreaOpt3, ITChartLine1, ITStyleSolid, 1 , ITModeCopypen 'pen設定
markRsi.SetCnd ITAreaOpt3, ITChartBar2 , ITStyleSolid, ITRosokuWidth , ITModeMaskpen 'マーク設定
ITSetYRange ITAreaOpt3, 100, 0, 25 'RSIの縦軸を最大値100、最小値0、目盛幅25に
ITCalRSI hChart, TERM_RSI, aData 'RSI14日を計算して結果をaDataへ一括格納
penRsi.SetAllData aData, aData, True, RGB(0, 0, 255) 'aDataをpenへ一括格納
markRsi.IsSetDataConst aData, ">", 60, aSell, aSell, True, colSell '60より大きい場合のみマーク
markRsi.IsSetDataConst aData, "<", 40, aBuy, aBuy, True, colBuy '40より小さい場合のみマーク

'はらみマークの設定
markHarami.SetCnd ITAreaStock, ITChartBar2, ITStyleSolid, ITRosokuWidth , ITModeMaskpen

'////////////////////
'//売買検証
'//<BR>strLog = "": cntLine = 0: sum = 0<BR>cntWin = 0: cntLoss = 0: cntEven = 0
For index = TERM_RSI-1 To hChart.GetCnt - 1 - HOLD_TERM
    fRecord = False<BR>    If markRsi.GetData1(index) = 10 And CheckHaramiA(index, hChart) = True Then
        markHarami.SetData index, 0, 0, True, colBuy
        If cntLine < LINE_MAX Then
            diff = Trade(index+1, index+HOLD_TERM, ITObjLinePen(cntLine), hChart) '買いから入る
            cntLine = cntLine + 1< BR>             fRecord =  True<BR>        End If<BR>    ElseIf markRsi.GetData1(index) = -10 And CheckHaramiB(index, hChart) = True Then
        markHarami.SetData index, 0, 0, True, colSell
        If cntLine < LINE_MAX Then
            diff = Trade(index+HOLD_TERM, index+1, ITObjLinePen(cntLine), hChart) '売りから入る
            cntLine = cntLine + 1
            fRecord = True
        End If
    End If

    '売買記録の追加
    If fRecord = True Then
        If diff > 0 Then
            cntWin = cntWin + 1
        ElseIf diff < 0 Then
            cntLoss = cntLoss + 1
        Else
            cntEven = cntEven + 1
        End if
        sum = sum + diff
        strLog = hChart.GetDate(index+HOLD_TERM) & ": " & diff & vbNewLine & strLog
    End If        
Next

ITDraw 'セットしたPenを画面に出力
strLog = "Loss: " & cntLoss & "回" & vbNewLine & strLog
strLog = "Even: " & cntEven & "回" & vbNewLine & strLog
strLog = "Win : " & cntWin & "回" & vbNewLine & strLog
strLog = "Total: " & sum & vbNewLine & strLog
ITMsgBox strLog '売買記録の表示

'//
'// スクリプト終わり 
[トップページへ戻る]