今回は、MT4からヒストリカルデータをエクスポートしたCSVファイルをExcelで加工しやすいようにするVBスクリプトを作ってみました。
【問題点】
MT4からエクスポートしたCSVファイルは、日付のフォーマットがExcelに対応していないため、日付が文字列として認識されます。その為、Excelのありがたい関数郡(例:月別計算or曜日計算or時間の抽出)がそのまま使えません。
【対応】
そこで、MT4の時間フォーマットをExcelで認識できるフォーマットに変更するスクリプトを作りました。
MT4の時間フォーマット【年.月.日,時間】をExcelフォーマット【年/月/日 時間】に変更します。
スクリプトのDLは、こちら【
Time_format_conversion.vbs】
- Option Explicit
- Dim datename,ob,reader,writer,text
- Dim re,maches,name,ctext
-
- If WScript.Arguments.Count = 0 Then
- WScript.Echo "ファイルをドラッグ&ドロップしてください。"
- WScript.Quit
- Else
- datename = WScript.Arguments(0)
- End If
-
-
- Set ob = CreateObject("Scripting.FileSystemObject")
- Set re = New RegExp
-
-
- Set reader = ob.OpenTextFile(datename,1,false)
-
-
- re.Pattern = "\.csv"
- name = re.Replace(datename, "c.csv")
-
-
- Set writer = ob.OpenTextFile(name,2,true)
-
-
- re.Pattern = "(\d{4})\.(\d{2})\.(\d{2})\,"
-
-
- Do Until reader.AtEndOfStream
- text = reader.ReadLine
- ctext = re.Replace(text,"1/2/$3 ")
- writer.WriteLine ctext
- Loop
-
- reader.Close()
- writer.Close()
-
-
- WScript.Echo name &"を出力しました。"
Option Explicit
Dim datename,ob,reader,writer,text
Dim re,maches,name,ctext
'ファイル名を取得
If WScript.Arguments.Count = 0 Then
WScript.Echo "ファイルをドラッグ&ドロップしてください。"
WScript.Quit
Else
datename = WScript.Arguments(0)
End If
'オブジェクトの設定
Set ob = CreateObject("Scripting.FileSystemObject")
Set re = New RegExp
'ファイルの読み込み
Set reader = ob.OpenTextFile(datename,1,false)
'新しいファイル名の作成
re.Pattern = "\.csv"
name = re.Replace(datename, "c.csv")
'書き込み用のファイル作成
Set writer = ob.OpenTextFile(name,2,true)
'正規表現のパターン設定
re.Pattern = "(\d{4})\.(\d{2})\.(\d{2})\,"
'書き換え
Do Until reader.AtEndOfStream
text = reader.ReadLine
ctext = re.Replace(text,"$1/$2/$3 ")
writer.WriteLine ctext
Loop
'ファイルを閉じる
reader.Close()
writer.Close()
'完了メッセージ
WScript.Echo name &"を出力しました。"
【使い方】
スクリプトをDL後、ヒストリカルデータからエクスポートしたCSVファイルをスクリプトファイルの上にドラッグ&ドロップしてください。エクスポートしたCSVファイルのあるフォルダにCSVファイル名c.csvというファイルが作成されます。作成されたファイルを開くと以下の様に表示され、Execlで日付が認識されるようになります。
さて、ここまで来たら完成ですが少し遊んでみます。例えば、月別に見た時間別のボラリティの計算をしてみます。
各列にラベルを付けて、月関数【MONTH(シリアル数値)】、時間関数【HOUR(シリアル値)】を追加し、高値と安値の差をHi-Lw(pips)に入れたものです。
これをピボットテーブルで表すと以下の様になり月間別に見た時間ボラリティの平均が出来ます。
※横軸:月 縦軸:時間です。
グラフ化すると以下の様になります。
サマータイムの影響が出ているかな(・・?
【まとめ】
VBスクリプトの勉強もかねて作成してみました。
それと。。。今年もATC2012に出場できそうです^^;