fx-onの人気EA「さざなみ」は、バックテストを行う際に日本時間のヒストリカルデータを用意する必要があるそうです。
そこで、
前回のVBスクリプトの派生で、UTC+2,夏時間有のヒストリカルデータを、日本時間に変換するスクリプトを作成してみました。
UTC+2夏時間有のhstファイルを日本時間に変換.vbsOption Explicit
'----------------------------------------------------------------------------
' UTC+2,夏時間有のヒストリカルデータ(.hst)を日本時間に変換するVBScript
' スクリプトファイルに.hstファイルをドラッグアンドドロップして使用する
' 出力先はスクリプト実行フォルダに作成される work フォルダの中
'
' ※作成された.hstで上書きする前にオリジナルの.hstをバックアップしましょう。
'----------------------------------------------------------------------------
' ★★FXDDのヒストリカルデータを変換する場合はTrueにする★★
' (2013/11/3~2014/3/8の冬時間がUTC+3になっている問題を修正する)
Const FXDDmode = False
Const adTypeBinary = 1
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Const adReadAll = -1
Dim lngDatetime, binDatetime ' bar start timeの整数値とバイナリ配列
Dim dteDatetime ' bar start timeの日付型変換後
Dim workFolder, workFile ' 出力フォルダ、出力ファイル
Dim objFs ' ファイル操作(FileSystemObject)
Dim objStBin, objStIn, objStOut ' バイナリ操作(ADODB.Stream)
Dim lngStPos ' ファイル操作位置
Dim intVersion ' Version番号
Dim intBarsStructSize ' Bars構造体のサイズ
Dim intStructPosition ' 構造体のデータ位置
Dim i
' 引数が無いなら終了
If WScript.Arguments.Count < 1 Then WScript.Quit
Set objFs = CreateObject("Scripting.FileSystemObject")
Set objStBin = CreateObject("ADODB.Stream")
Set objStIn = CreateObject("ADODB.Stream")
Set objStOut = CreateObject("ADODB.Stream")
' 出力フォルダ作成
workFolder = objFs.BuildPath(objFs.GetFile(WScript.ScriptFullName).ParentFolder.Path, "work")
If Not objFs.FolderExists(workFolder) Then objFs.CreateFolder (workFolder)
' hstファイル書き換え
For i = 0 To WScript.Arguments.Count - 1
If Right(WScript.Arguments(i), 4) = ".hst" Then
If objFs.FileExists(WScript.Arguments(i)) Then
' .hstファイルを開く
objStIn.Type = adTypeBinary
objStIn.Open
objStIn.LoadFromFile WScript.Arguments(i)
' 出力側のストリームを開く
objStOut.Type = adTypeBinary
objStOut.Open
' 出力ファイル名を指定
workFile = objFs.GetFileName(WScript.Arguments(i))
workFile = objFs.BuildPath(workFolder, workFile)
' 出力側ストリームへコピー
objStIn.Position = 0
objStOut.Write objStIn.Read(adReadAll)
' バージョン取得(400 or 401)
objStIn.Position = 0
intVersion = CLng("&H" & Hex(AscW(objStIn.Read(2))))
If intVersion = 400 Then
intBarsStructSize = 44 ' 構造体サイズ
intStructPosition = 0 ' 書込位置
Else
intBarsStructSize = 60 ' 構造体サイズ
intStructPosition = 0 ' 書込位置
End If
' バー配列のbar start timeを書き換える
' ※ヘッダー部148bytes、バー構造体は44 or 60bytes
For lngStPos = (148 + intStructPosition) To objStIn.Size - 1 Step intBarsStructSize
' 時間の読み取り
objStIn.Position = lngStPos
lngDatetime = CLng("&H" & Hex(AscW(objStIn.Read(2))))
lngDatetime = lngDatetime + CLng("&H" & Hex(AscW(objStIn.Read(2)))) * &H10000
dteDatetime = 25569 + lngDatetime / 86400
' FXDDの場合は2013/11/3~2014/3/8の冬時間がUTC+3になっているので修正
If FXDDmode Then
If dteDatetime >= #2013/11/3# And dteDatetime <= #2014/3/8# Then
dteDatetime = dteDatetime - TimeSerial(1, 0, 0)
End If
End If
' 夏時間を冬時間に戻す(UTC+3 → UTC+2)
If Year(dteDatetime) >= 2007 Then
If dteDatetime >= DateSerial(Year(dteDatetime), 3, 14 - (Weekday(DateSerial(Year(dteDatetime), 3, 1)) + 5) Mod 7) Then
If dteDatetime < DateSerial(Year(dteDatetime), 11, 7 - (Weekday(DateSerial(Year(dteDatetime), 11, 1)) + 5) Mod 7) Then
dteDatetime = dteDatetime - TimeSerial(1, 0, 0)
End If
End If
Else
If dteDatetime >= DateSerial(Year(dteDatetime), 4, 7 - (Weekday(DateSerial(Year(dteDatetime), 4, 1)) + 5) Mod 7) Then
If dteDatetime < DateSerial(Year(dteDatetime), 11, 0 - (Weekday(DateSerial(Year(dteDatetime), 11, 1)) + 5) Mod 7) Then
dteDatetime = dteDatetime - TimeSerial(1, 0, 0)
End If
End If
End If
' 日本時間に変換(UTC+2 → UTC+9)
dteDatetime = dteDatetime + TimeSerial(7, 0, 0)
lngDatetime = CLng((dteDatetime - 25569) * 86400)
' 日本時間のバイナリ配列作成
objStBin.Type = adTypeText
objStBin.Charset = "unicode"
objStBin.Open
objStBin.WriteText ChrW(lngDatetime Mod &H10000)
objStBin.WriteText ChrW(lngDatetime \ &H10000)
objStBin.Position = 0
objStBin.Type = adTypeBinary
objStBin.Position = 2 ' 先頭2bytesはBOMなので読まない
binDatetime = objStBin.Read(4)
objStBin.Close
' 時間を更新
objStOut.Position = lngStPos
objStOut.Write binDatetime
Next
' 出力ファイル保存
objStOut.SaveToFile workFile, adSaveCreateOverWrite
objStOut.Close
objStIn.Close
End If
End If
Next
Set objStBin = Nothing
Set objStOut = Nothing
Set objStIn = Nothing
Set objFs = Nothing
MsgBox "出力しました。workフォルダを確認して下さい", vbInformation
※夏時間/冬時間の移行日は米国式
テキストをコピペし、ファイル拡張子.vbsとして保存して下さい。
FXDDのヒストリカルデータを変換するときは、13行目を
Const FXDDmode = True
にすると、2013年~2014年の冬時間の問題も解消できます。
使い方はスクリプトのコメントに記載したとおりです。
.hstファイル(複数可)を.vbsファイルへドラッグ&ドロップ後、暫く待つと処理終了のダイアログが表示されますので、workフォルダに作成された.hstファイルを元の.hstファイルと差し替えて下さい。
なおスクリプトで修正可能な時間足は、1分足~1時間足までです。
それ以上の長時間足では正しく修正できません。
長時間足は、Period ConverterなどのMT4スクリプトで作成し直して下さい。
ちなみにヒストリカルデータが夏時間無しの場合は、MT4インポート時に時間をシフトさせるだけで日本時間に変更出来ますので、このVBスクリプトは必要ありません。
テーマ : FX(外国為替証拠金取引)
ジャンル : 株式・投資・マネー