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

ITickerのダウンロード

三点チャージ

はらみ線

チャネルブレイクアウト

曜日と株価

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

検証:ゴールデンクロスとデッドクロス

2つの異なる期間の移動平均が交差する時を相場の転換時として捕らえようとする考え方です。
大雑把には、短期(中期)の移動平均線が中期(長期)の移動平均線を上回った時をゴールデンクロス、逆の場合をデッドクロスと呼ぶ場合が多いようです。

検索例
前日25日平均が5日平均を上回り、当日5日平均が25日平均と重なるか突き抜けた場合の検索例です。
検索例

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

指標2領域の[設定]では下図のような5日と25日の移動平均のクロス判定のユーザ関数を定義しています。
ユーザ関数定義

上記設定を実行させた場合のチャート例です。
ウィザードのバックテストはシグナルが出た翌営業日の始値で売買を行います。
チャート例

[スクリプトの作成例]
ウィザードを使用しないで、ユーザがスクリプトを作成して様々な処理を行うことも出来ます。
ゴールデンクロス/デッドクロス ゴールデンクロス/デッドクロスは単に交点のみだけでなく、左図@、Aの様に平均線が上向いているのか・下向いているのか、また終値が平均線より上回っているか・下回っているか等、それぞれの組合せで色々なゴールデンクロスのパターンがあります。
ここでは左図@の様に最も強いシグナルといわれているパターン、すなわち短期・中期の平均値ががともに前日を上回り、且つ、終値が平均値より上回っている時をゴールデンクロス、短期・中期の平均値ががともに前日を下回り、且つ、終値が平均値より下回っている場合をデッドクロスとして判定するようにして、ITickerでの検証用スクリプトを作成してみました。
  • 売買ルールは以下の様にしています。
    • 短期平均日数:5日、中期平均日数:25日
    • 買:ゴールデンクロス、売:デッドクロス
    • クロスしたと判定された翌営業日の始値で売買
    • 新規に売買した後は、反対のクロスが出るまで同じクロスは無視して売買は行わない
  • ゴールデンクロス、デッドクロス時にマーキングを行います。
  • 売買した場合の取引値・日をラインで表示します。(利益時は緑線、損失時は赤線)
  • 最後に売買記録をダイアログで表示します。
実行チャート

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

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

Const TERM_SHORT = 5 '短期移動平均日数
Const TERM_LONG = 25 '中長期移動平均日数

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

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

'//////////////////////
'//関数の定義
'//
'クロスの判定
Function CheckCross(index, h, pS, pL)
    '1:Golden, -1:Dead
    CheckCross = 0

    If pS.GetData1(index) >pS.GetData1(index-1) And pL.GetData1(index) > pL.GetData1(index-1) And _
       pL.GetData1(index-1) > pS.GetData1(index-1) And pL.GetData1(index) <= pS.GetData1(index) And _
       h.GetClose(index) > pS.GetData1(index) _
    Then
        CheckCross = 1
        Exit Function
    End if

    If pS.GetData1(index) < pS.GetData1(index-1) And pL.GetData1(index) < pL.GetData1(index-1) And _
       pL.GetData1(index-1) < pS.GetData1(index-1) And pL.GetData1(index) >= pS.GetData1(index) And _
       h.GetClose(index) < pS.GetData1(index) _
    Then
        CheckCross = -1
        Exit Function
    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 penShort, penLong, markCross
Dim hChart
Dim aData
Const TERM_SHORT = 5 '短期移動平均日数
Const TERM_LONG = 25 '中長期移動平均日数
colBuy = RGB(191,191,127)
colSell = RGB(191,191,255)

'//売買検証用
Dim index, startIndex
Dim check, fRecord
Dim nowStatus
Dim strLog
Dim sum, diff
Dim cntWin, cntEven, cntLoss
Dim cntLine 'ライン線数の判定用
Const LINE_MAX = 200 'ライン線の最大数
Const STATUS_SELL = -1
Const STATUS_BUY = 1
Const STATUS_IDLE = 0

'「ITCreateObjStdPen」はスクリプト内で一回しか設定できません。
ITCreateObjStdPen 3 '移動平均(2本)・マーキング
Set penShort = ITObjStdPen(0)
Set penLong = ITObjStdPen(1)
Set markCross = ITObjStdPen(2)

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

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

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

'///////////////////////////
'// テクニカル計算、チャート作成
'//
hChart.SetCurrentChart '現在開いているチャートの時系列データを取得

'移動平均 短期
penShort.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen
ITCalMA hChart, TERM_SHORT, aData
penShort.SetAllData aData, aData, True, RGB(255, 0, 0)

'移動平均 長期
penLong.SetCnd ITAreaStock, ITChartLine1, ITStyleSolid, 1, ITModeCopypen
ITCalMA hChart, TERM_LONG, aData
penLong.SetAllData aData, aData, True, RGB(0, 255, 0)

'クロスマーク用の設定
markCross.SetCnd ITAreaStock , ITChartBar2 , ITStyleSolid, ITRosokuWidth , ITModeMaskpen

'////////////////////
'//売買検証
'//
nowStatus =  STATUS_IDLE
strLog = "": cntLine = 0: sum = 0
cntWin =0: cntLoss = 0: cntEven = 0
For index = TERM_LONG To hChart.GetCnt - 1
    fRecord = False
    check = CheckCross(index-1, hChart, penShort, penLong) '前日のクロス判定
    '前日クロスしていた時、本日のそれぞれの場合での売買処理
    If check = 1 Then 'GoldenCross
        '前日のクロスマーキング
        markCross.SetData index-1, 0, 0, True, RGB(0,128, 255)
        '本日の新規・反対売買の処理
        If nowStatus = STATUS_IDLE Then '新規買
            startIndex = index
            nowStatus = STATUS_BUY
        ElseIf nowStatus = STATUS_SELL Then '既に売っている場合は買
            If cntLine < LINE_Max Then
                diff = Trade(index, startIndex, ITObjLinePen(cntLine), hChart)
                cntLine = cntLine + 1
                fRecord = True
            End If
            nowStatus = STATUS_IDLE
        End If
    ElseIf check = -1 Then 'DeadCross
        '前日のクロスマーキング
        markCross.SetData index-1, 0, 0, True, RGB(255, 128, 0)
        '本日の新規・反対売買の処理
        If nowStatus = STATUS_IDLE Then '新規売
            startIndex = index
            nowStatus = STATUS_SELL
        ElseIf nowStatus = STATUS_BUY Then '既に買っている場合は売
            If cntLine < LINE_Max Then
                diff = Trade(startIndex, index, ITObjLinePen(cntLine), hChart)
                cntLine = cntLine + 1
                fRecord = True
            End If
            nowStatus = STATUS_IDLE
        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) & ": " & 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 '売買記録の表示

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