UTC+0のヒストリカルデータを、UTC+2/+3や日本時間(UTC+9)にするVBスクリプト

前回の記事でJForexを使ってDukascopyのヒストリカルデータをダウンロードしましたが、時間はUTC+0固定になっています。
これをUTC+2夏時間有(UTC+2/+3)や、日本時間(UTC+9)に変換するVBスクリプトを作成しました。 
 
UTC+0のhstファイルをUTC+2夏時間有に変換.vbs
Option Explicit

'----------------------------------------------------------------------------
' UTC+0のヒストリカルデータ(.hst)を、UTC+2夏時間有に変換するVBScript
' スクリプトファイルに.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
        
        ' アメリカ東部夏時間(EDT)の期間は1時間進める (UTC+0/+0 → UTC+0/+1)
        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
        
        ' さらに2時間進める (UTC+0/+1 → UTC+2/+3)
        dteDatetime = dteDatetime + TimeSerial(2, 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

 
UTC+0のhstファイルを日本時間に変換.vbs
Option Explicit

'----------------------------------------------------------------------------
' UTC+0のヒストリカルデータ(.hst)を、日本時間(UTC+9)に変換するVBScript
' スクリプトファイルに.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
        
        ' 9時間進める (UTC+0 → UTC+9)
        dteDatetime = dteDatetime + TimeSerial(9, 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として保存して下さい。
使い方はスクリプトのコメントに記載したとおりです。
.hstファイル(複数可)を.vbsファイルへドラッグ&ドロップ後、暫く待つと処理終了のダイアログが表示されますので、workフォルダに作成された.hstファイルを元の.hstファイルと差し替えて下さい。
 
なおスクリプトで修正可能な時間足は、1分足~1時間足までです。
それ以上の長時間足では正しく修正できません。
長時間足は、Period ConverterなどのMT4スクリプトで作成し直して下さい。
 
ちなみに、2003年~2016年の1分足ヒストリカルデータを変換する場合、1ファイルあたり数分掛かります。
 

テーマ : FX(外国為替証拠金取引)
ジャンル : 株式・投資・マネー

コメント

Secret

スクリプト実行方法

nekonoteさま

とても役立情報を沢山公開くださってありがとうございます。

このスクリプトを使ってみたいのですが、当方のwindows10パソコンでは.vbsに変えても種類がテキストファイルのままで.hstファイルを重ねても何も起こりません。

関連づけができてないのだろうとおもったのですが、windows based script hostやらが見当たらず......

ど素人で大変恐縮ですが、お分かりのことあれば御指南頂ければ幸いです。
プロフィール

nekonote

Author:nekonote

EAを作るのが趣味になってしまったらしい。

あとマニアックな運用とかetc...その時の気分で書き殴る(?)
そんなブログ

※当ブログ記事へのリンクはご自由にどうぞ

 
運用は…fx-onのみんなのMT4に公開しているかも?
fx-on 通常会員ページ
fx-on 出品者ページ

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
ブログランキング
にほんブログ村 為替ブログ システムトレード 自作EA派へ





QRコード
QR
RSSリンクの表示
リンク
FX情報サイト
 優秀トレーダーの投資法をゲット!
FX投資情報コミュニティfx-on.com


国内MT4取扱会社
外為ファイネスト カコテン iOsMA (type DI) EURAUD タイアップキャンペーン

アヴァトレード・ジャパン株式会社 カコテン iOsMA (type DI) EURAUD タイアップキャンペーン

FOREX.com×タイアップキャンペーン☆Beatrice-07 FXTF×ForexSolidタイアップキャンペーン



自作EA紹介


EAフォワード集計結果
海外MT4業者
海外業者を選ぶ際は、まず金融庁の「注意喚起」を熟読して下さい。無登録業者で事故っても自己責任ですよ!
自分はゲムトレード&GEMFOREXに突撃してみましたw




自分もカコテンシリーズを幾つか出品しています。 運用結果でネタが集まれば時々記事にします。

ゲムトレードはEAの将来価値をリスクヘッジするには良い仕組みを提供していると思います。ただし本当に実力のあるEAはfx-on等から買った方が良いでしょう。
取引明細には現れませんがIBのような仕組みでゲムトレードへ報酬が渡っていますので、単一EAの長期運用ではデメリットが成績に現れると思われます。

※繰り返しますが海外業者でトラブっても自己責任です。お忘れなく!
FX専用VPS
レンタルサーバーなら使えるねっと



みんなのMT4
紫色:リアル口座
水色:デモ口座
ねこぱんち | fx-on.com
ねこぱんちMAXでも | fx-on.com
ねこのまえあし | fx-on.com
€$ XM demo | fx-on.com
£$ FxPro demo | fx-on.com
€¥ IFC Markets demo 2nd! | fx-on.com
£¥ IC Markets demo  | fx-on.com
$¥ MGK Global demo | fx-on.com
BigBoss demo AUDJPY | fx-on.com
€x LandFX demo | fx-on.com
KAKO10 iIchimoku リアル OANDA | fx-on.com
KAKO10 iIchimoku デモ FXTF | fx-on.com
KAKO10_iMA(H27.5~) | fx-on.com
KAKO10 iMA デモ Axiory(運用終了) | fx-on.com
KAKO10 iMA デモ Axiory新鯖 | fx-on.com
Ava demo iOsMA方向性スイング(運用終了) | fx-on.com
カコテン iOsMA (type DI) デモ Centrade | fx-on.com
カコテン iMomentum (type DI) デモ Arena | fx-on.com
瞬殺!!! NCSEC demo ※運用終了 | fx-on.com
GEMFOREX demo 新サーバーお試し ※破綻 | fx-on.com
 | fx-on.com
 | fx-on.com
 | fx-on.com
 | fx-on.com