Windows APIのPathFileExistsW関数を使うべし
特定のインジケーターを読み込むことを前提にしたEAやインジケーターを作りたい時ってありますよね。
当然ながら読み込むインジケーターが存在しないと、そのEAやインジケーターは正しく動作しません。
エラーで止まってくれれば良いのですが、親切?にも動いてしまいます。そのため、異常に気づきにくいやっかいな問題です。
じゃあ、読み込むインジケーターがちゃんと存在しているか最初にチェックすればいいんじゃない?と思うのが自然です。
で、何か関数ないかな~とMQL4のリファレンスを検索するわけです。
ありました、FileIsExist関数。
「これで万事解決だ!」と言いたいところですが、そうは問屋が卸しません。
MQL4組み込み関数のFileIsExist関数はFilesフォルダしか参照できない仕様になっています。
はい、詰んだ。/(^o^)\
実現したいのはIndicatorsフォルダ内の参照ですね。インジケーターはIndicatorsフォルダに設置しますから。
チェックするのは諦めるかーとなりがちです。
でも、大丈夫です。
Windows APIのPathFileExistsW関数を使えばFilesフォルダ以外のフォルダも参照できるようになります。
PathFileExistsW関数に与える引数は存在有無を確認したいインジケーターファイルのフルパスだけです。
あればtrue、なければfalseが戻ってきます。
Windows APIを使う時は、#importで使いたい関数をインポートし、それから呼び出したい箇所で呼び出せばOKです。
サンプルコードを以下に載せておきます。
#import "shlwapi.dll" bool PathFileExistsW(string pszPath); #import int OnInit() { // 必要インジケーターのチェック if(PathFileExistsW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Indicators\\インジケーターファイル名.ex4") == false){ MessageBox("インジケーターファイル名.ex4がIndicatorsフォルダに設置されていません。\n設置してから本EAをチャートに適用してください。", "ファイル存在チェックエラー", MB_ICONSTOP); return(INIT_FAILED); } }
困った時はWindows API。Windows上の操作なら大抵のことは実現できるはずです。