FXDDのヒストリカルデータの時間をUTC+2,夏時間有に修正するVBスクリプト

FXDDのヒストリカルデータは基本的にUTC+2,夏時間有(米国式)なのですが、2013/11/3~2014/3/8の冬季の期間がUTC+3(夏時間シフト)になっている問題があります。(→関連記事
 
この問題を修正する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(外国為替証拠金取引)
ジャンル : 株式・投資・マネー

コメント

Secret

プロフィール

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