2011/06/25

MT4用EA開発時代 - 大域変数(Global Variables)のバックアップについて



さて前回は、MT4用EA開発における残課題の検証と検討結果について書いてみました。今回は、前回のブログ記事の大域変数(Global Variables)でふと疑問におもったことと、大域変数のバックアップについて書いてみたいと思います。


さて、大域変数(Global Variables)で一体何が疑問かと言うと、以下。

【大域変数(Global Variables)の疑問】
----------------------
1.なぜ読み込みの際、ディスク異常系のエラーが返却されないのか
2.なぜ書き込みの際、排他エラーにならないのか
----------------------


そもそも、なんでこんな事気にしているかと言うと、それは障害対策。

【大域変数(GlobalVariables)の疑問の背景】
--------------------------------
MT4が異常終了した時とか、PCが突如ブルースクリーンになった時に、大域変数を格納している、「gvariables.dat」は一体どうなってるのかと言うこと。
さらに言うと、上記障害発生時に、予備用のPCに大域変数の引継ぎが上手くできるかどうかが気になっていた。

現状、「gvariables.dat」を5分に1回NASにバックアップをとっていて、トレード用のPCがお釈迦になっても、予備用PCでトレードを再開できるのかどうかの瀬戸際。

今回の共通部品「ahfw」では大域変数を結構使っているので、「gvariables.dat」を上手く引き継げれば完璧なんだけど、所詮そんな異常時にファイルI/Oの結果なんて保証しきれない。なので、少しでも大域変数の仕組みを知っておきたい。
--------------------------------

「gvariables.dat」の実装方法ナゾについて少しでもヒントがあればと思い、Windows7についてる、「リソースモニター」を見てみたら、MT4での大域変数「Global Variables」の実装方法に仮説がたった。

まずは、リソースモニターで、MT4のプロセス名である「terminal.exe」に注目してみると、
以下の事に気付いた。

【リソースモニター画面】
--------------------------
--------------------------

上記で注目してもらいたいのが、行選択されてる「FileMappingほにゃらら」という箇所。
つまり、大域変数は、ファイル・マッピングされたメモリにアクセスしているのではないかという仮説。

なので、大域変数の読み込み時は実質的にメモリから読み込むので、よっぽど不安定な状態じゃない限り、エラーなんて起こりえない。
大域変数への書き込みに関しても、MT4側から見ると、単なるメモリへの書き込みなので、通常のファイル操作で発生しうるファイルI/Oエラーなんてそのタイミングではおこらない。
そして、メモリ操作なので排他制御はMutexか何かを使っているのだと思う。

この実装方法だと、エラーコードにも納得いくし、前回記事の排他制御検証結果も納得がいく。

ちなみに、「ファイル・マッピング」が一体何者かというのは以下のページがわかりやすいです。
 ●「第5回 ファイル・マッピング・オブジェクトによるプロセス間メモリー共有の仕組みを学ぶ
つまり大雑把に言うと、一回準備すると、メモリにアクセスすると、リアルタイムじゃないにせよ、自動的にファイルにも反映されるという仕組み。

【大域変数(Global Variables)のバックアップ方式】
-----------------------------------
じゃあバックアップ/リカバリという事を踏まえると、メモリ上の内容がいつファイルに反映されるのかが重要なところ。ネットで検索しところ、特定のWindowsAPIを使えば、強制的にメモリ上の内容をファイルに反映してくれるけど、そうでなければOSが適当な時(つまり不定)に反映するっぽい。
つまるところ、MT4内のロジックがわからない限り、ファイルにいつ反映されるのかはわからないということ。

もっと言うと、GlobalVariableSet()を成功したといっても、ファイルに反映されたかどうかは別の話。

そして、以前の記事でトレード用PC故障時(ブルースクリーン等)に備えて、大域変数をリアルタイムでバックアップする事を考えていたけど、やっぱり完璧は無理っぽい。
なので、大域変数のバックアップを使って、トレード用PC故障時に予備のトレード環境でトレードを再開するためには、予備の環境にバックアップされた「gvariables.dat」を適用しても、MT4起動後に、ある程度大域変数の補正が必要という事に。

なので、あんまり「大域変数」のバックアップに高速なリアルタイム性を求めても意味が無いので、5分に一回ぐらいのバックアップ頻度で十分やと思う。
-----------------------------------


結局、トレード用PC故障時の大域変数補正のドキュメント書かないと。。。


【大域変数バックアップに使うフリーソフト】
----------------------------
ファイル更新のたびにバックアップ(リアルタイムバックアップ)してくれるフリーソフトとして、以下のフリーソフトを見つけたけど、結局「Backup」というフリーソフトを使う事にした。

●試したバックアップ用フリーソフト
 1.「AirBack
   これは、リストア時に同じPCにしかリストアできなという理由で却下。
   バックアップされたファイル形式もソフト固有の形式。
 2.「Lazulite
   仕様としてはよかったんだけど、ずっと動かしてると、エラーで停止してしまうので却下。
 3.「Backup
   結局これに落ち着いてる。
   使い方をマスター仕切れてないのかもしれないけど、ずっとファイル更新毎にバックアップ
   させる機能は無いっぽい変わりに、指定した時間毎にバックアップする事が可能。
   今のところ落ちた事は無い。
----------------------------


少なくとも、大域変数を予備トレードPCに引き継ぐためには、整合性を保つために最低限変更が必要な大域変数を整理しなきゃ。。。

まぁ、そもそもなんで今回のブログ記事がこういうネタかというと、









ネタ切れだから。







それが何か?







そして、以前と同じオチでお茶を濁して、「FXシステムトレード初心者奮闘記」の「MT4用EA開発時代」は、MT4用EA共通部品「ahfw」改修版リリースに向かうのでした。
#ここ最近新たに健在化したバグは発生しないけど、新たなエラーコード検出も発生してない。。

0 件のコメント:

コメントを投稿