取得したヒストリカルデータを他社のMT4に流用する場合、シンボル名が"USDJPY
-a01"とか"EURUSD
pro"とか通貨ペア以外の文字が付加されていると、そのままではテストで使えません。
これはヒストリカルのファイル名の変更だけでは不十分で、バイナリエディタでデータヘッダー部のシンボル名も書き換える必要があるためです。
ヒストリーセンターでインポートすれば使えるようになりますが、かなり面倒です
(^_^;)そこでファイル名とデータヘッダー部のシンボル名を同時に書き換えるVBScriptを作ってみました。
hstファイルのシンボルに文字を付加.vbsOption Explicit
'----------------------------------------------------------------------------
' ヒストリカルデータ(.hst)のシンボル名に"-a01"などの文字を付加したり
' 外したりするVBScript
' スクリプトファイルに.hstファイルをドラッグアンドドロップして使用する
' 出力先はスクリプト実行フォルダに作成される work フォルダの中
'----------------------------------------------------------------------------
Const adTypeBinary = 1
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
Const adReadAll = -1
Dim supplement, supBin ' シンボルに付加する文字、文字のバイナリ配列
Dim workFolder, workFile ' 出力フォルダ、出力ファイル
Dim objFs ' ファイル操作(FileSystemObject)
Dim objStBin, objStIn, objStOut ' バイナリ操作(ADODB.Stream)
Dim period ' 時間軸
Dim i
' 引数が無いなら終了
If WScript.Arguments.Count < 1 Then WScript.Quit
' シンボルに付加する文字の入力
supplement = InputBox("シンボルに付加する文字を入力して下さい(付加しない時はブランクを入力)")
If TypeName(supplement) = "Empty" 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)
' 文字のバイナリ配列作成
objStBin.Type = adTypeText
objStBin.Charset = "shift_jis"
objStBin.Open
objStBin.WriteText Left(supplement & String(6, vbNullChar), 6)
objStBin.Position = 0
objStBin.Type = adTypeBinary
supBin = objStBin.Read(6)
objStBin.Close
' 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
' 時間軸設定を取得(手抜きで2バイトのみ)
objStIn.Position = 80
period = CLng("&H" & Hex(AscW(objStIn.Read(2))))
' 出力ファイル名を指定
workFile = objFs.GetBaseName(WScript.Arguments(i))
workFile = Left(workFile, 6) & supplement & CStr(period) & ".hst"
workFile = objFs.BuildPath(workFolder, workFile)
' 全てコピー
objStIn.Position = 0
objStOut.Write objStIn.Read(adReadAll)
' hstのシンボル名後半6バイト更新
objStOut.Position = 74
objStOut.Write supBin
' 出力ファイル保存
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
【利用方法】
(1) hstファイルを選択しVBScriptファイルへドラッグアンドドロップ(複数選択可)
(2) InputBoxが出るのでシンボルに付加する文字("-a01"等)を指定。
(3) VBScriptの実行フォルダのworkフォルダに変換したhstファイルが保存される
(4) 変換したhstファイルを、MT4のヒストリカルデータ格納フォルダに移動
※hstファイルを移動する前にMT4は閉じて下さいVBScriptのバイナリ操作は以下のブログを参考にしました。多謝!
VBScriptでバイナリファイルを読み書きする: ここにはいないボクへの伝言
VBScriptでバイナリを読む2なお不具合等ありましたらコメント下さい。nya!