FXDDのヒストリカルデータの時間をUTC+2,夏時間有に修正するVBスクリプト
FXDDのヒストリカルデータは基本的にUTC+2,夏時間有(米国式)なのですが、2013/11/3~2014/3/8の冬季の期間がUTC+3(夏時間シフト)になっている問題があります。(→関連記事)
この問題を修正するVBスクリプトを作成してみました。
FXDDのhstファイルの時間をUTC+2夏時間有に修正.vbs
テキストをコピペし、ファイル拡張子.vbsとして保存して下さい。
使い方はスクリプトのコメントに記載したとおりです。
.hstファイル(複数可)を.vbsファイルへドラッグ&ドロップ後、暫く待つと処理終了のダイアログが表示されますので、workフォルダに作成された.hstファイルを元の.hstファイルと差し替えて下さい。
なおスクリプトで修正可能な時間足は、1分足~1時間足までです。
それ以上の長時間足では正しく修正できません。
長時間足は、Period ConverterなどのMT4スクリプトで作成し直して下さい。
この問題を修正するVBスクリプトを作成してみました。
FXDDのhstファイルの時間をUTC+2夏時間有に修正.vbs
Option Explicit
'----------------------------------------------------------------------------
' FXDDのヒストリカルデータ(.hst)の時間をUTC+2夏時間有に修正するVBScript
' (2013/11/3~2014/3/8の冬時間がUTC+3になっているのをUTC+2に修正する)
'
' スクリプトファイルに.hstファイルをドラッグアンドドロップして使用する
' 出力先はスクリプト実行フォルダに作成される work フォルダの中
'
' ※作成された.hstで上書きする前にオリジナルの.hstをバックアップしましょう。
'----------------------------------------------------------------------------
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
' 2013/11/3~2014/3/8の冬時間がUTC+3になっているのでUTC+2に修正
If dteDatetime >= #2013/11/3# And dteDatetime <= #2014/3/8# Then
' UTC+3 → UTC+2
dteDatetime = dteDatetime - TimeSerial(1, 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
End If
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として保存して下さい。
使い方はスクリプトのコメントに記載したとおりです。
.hstファイル(複数可)を.vbsファイルへドラッグ&ドロップ後、暫く待つと処理終了のダイアログが表示されますので、workフォルダに作成された.hstファイルを元の.hstファイルと差し替えて下さい。
なおスクリプトで修正可能な時間足は、1分足~1時間足までです。
それ以上の長時間足では正しく修正できません。
長時間足は、Period ConverterなどのMT4スクリプトで作成し直して下さい。
テーマ : FX(外国為替証拠金取引)
ジャンル : 株式・投資・マネー