セクションとキーから値を取得する
テキストファイルの読み込み方で、テキストファイルを読み込むする方法を説明しましたが、今回はiniファイルの読み込み方法について説明します。
iniファイルは設定ファイルとして使われます。EAやインジケーターのパラメータを外部ファイル化できるイメージですね。
複数のEAやインジケーターでパラメータを共通化したい時(というケースは稀でしょうが)に役立つかもしれません。
まずは、サンプルコードをご覧ください。
01 | //+------------------------------------------------------------------+ |
02 | //| Sample.mq4 | |
03 | //| Copyright (c) 2018, りゅーき | |
04 | //| https://autofx100.com/ | |
05 | //+------------------------------------------------------------------+ |
06 | #property copyright "Copyright (c) 2018, りゅーき" |
07 | #property link "https://autofx100.com/" |
08 | #property version "1.0" |
09 | #property strict |
10 |
11 | //+------------------------------------------------------------------+ |
12 | //| ライブラリ | |
13 | //+------------------------------------------------------------------+ |
14 | #include <stderror.mqh> |
15 | #include <stdlib.mqh> |
16 | #include <WinUser32.mqh> |
17 | #include <Original/Application.mqh> |
18 | #include <Original/Basic.mqh> |
19 | #include <Original/DateAndTime.mqh> |
20 | #include <Original/LotSizing.mqh> |
21 | #include <Original/OrderHandle.mqh> |
22 | #include <Original/OrderReliable.mqh> |
23 |
24 | #import "kernel32.dll" |
25 | int GetPrivateProfileStringW(string sectionName, string keyName, string defaultValue, string &returnValue, uint bufferSize, string iniFilePath); |
26 | #import |
27 |
28 | //+------------------------------------------------------------------+ |
29 | //| 定数 | |
30 | //+------------------------------------------------------------------+ |
31 |
32 | //+------------------------------------------------------------------+ |
33 | //| EAパラメータ設定情報 | |
34 | //+------------------------------------------------------------------+ |
35 | extern int MagicNumber = 20171204; |
36 |
37 | //+------------------------------------------------------------------+ |
38 | //| グローバル変数 | |
39 | //+------------------------------------------------------------------+ |
40 | // 共通 |
41 | double gPipsPoint = 0.0; |
42 | int gSlippage = 0; |
43 | color gArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red}; //BUY: Blue, SELL: Red |
44 |
45 | //+------------------------------------------------------------------+ |
46 | //| Expert initialization function | |
47 | //+------------------------------------------------------------------+ |
48 | int OnInit() |
49 | { |
50 | string sectionName = "section" ; |
51 | string keyName = "key" ; |
52 | string defaultValue = "default" ; |
53 | string returnValue = "" ; |
54 | uint bufferSize = 255; |
55 | string iniFilePath = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\test.ini" ; |
56 |
57 | int dmy = GetPrivateProfileStringW(sectionName, keyName, defaultValue, returnValue, bufferSize, iniFilePath); |
58 |
59 | Print( "returnValue = " , returnValue); |
60 |
61 | return (INIT_SUCCEEDED); |
62 | } |
63 |
64 | //+------------------------------------------------------------------+ |
65 | //| Expert deinitialization function | |
66 | //+------------------------------------------------------------------+ |
67 | void OnDeinit( const int reason) |
68 | { |
69 | } |
70 |
71 | //+------------------------------------------------------------------+ |
72 | //| Expert tick function | |
73 | //+------------------------------------------------------------------+ |
74 | void OnTick() |
75 | { |
76 | } |
test.iniの中身は以下です。
1 | [section] |
2 | key=Great |
ポイントは以下の2箇所です。
1 | #import "kernel32.dll" |
2 | int GetPrivateProfileStringW(string sectionName, string keyName, string defaultValue, string &returnValue, uint bufferSize, string iniFilePath); |
3 | #import |
1 | int dmy = GetPrivateProfileStringW(sectionName, keyName, defaultValue, returnValue, bufferSize, iniFilePath); |
GetPrivateProfileStringW関数はWindows APIの1つで、kernel32.dllの中で定義されています。
MT4の標準関数ではありませんのでご注意ください。
importは、外部dllを読み込む際に使います。この例では、外部dllのkernel32.dllをMT4内で使えるように読み込むよ、という宣言になります。
MT4はこんな風に外部のdllを読み込んで利用できるんですね。知っておくとEAやインジケーターの実装幅が広がってとても便利です。

さて、importで定義した後は、int dmy = GetPrivateProfileStringWで関数を呼び出して、iniファイルを読み込みます。
iniファイルはセクションとキーから値を取得する構造となっています。sectionNameとkeyNameを引数として渡すと、値(この例ではGreat)がreturnValueに格納されて戻ってくる仕掛けです。
あとは、returnValueを使ってやりたいことを実現しちゃってください!
なお、dmyはダミーの意味で、この関数の戻り値は使わないよと明示するための独自ネーミングルールです。