セクションとキーから値を取得する
テキストファイルの読み込み方で、テキストファイルを読み込むする方法を説明しましたが、今回はiniファイルの読み込み方法について説明します。
iniファイルは設定ファイルとして使われます。EAやインジケーターのパラメータを外部ファイル化できるイメージですね。
複数のEAやインジケーターでパラメータを共通化したい時(というケースは稀でしょうが)に役立つかもしれません。
まずは、サンプルコードをご覧ください。
//+------------------------------------------------------------------+ //| Sample.mq4 | //| Copyright (c) 2018, りゅーき | //| https://autofx100.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright (c) 2018, りゅーき" #property link "https://autofx100.com/" #property version "1.0" #property strict //+------------------------------------------------------------------+ //| ライブラリ | //+------------------------------------------------------------------+ #include <stderror.mqh> #include <stdlib.mqh> #include <WinUser32.mqh> #include <Original/Application.mqh> #include <Original/Basic.mqh> #include <Original/DateAndTime.mqh> #include <Original/LotSizing.mqh> #include <Original/OrderHandle.mqh> #include <Original/OrderReliable.mqh> #import "kernel32.dll" int GetPrivateProfileStringW(string sectionName, string keyName, string defaultValue, string &returnValue, uint bufferSize, string iniFilePath); #import //+------------------------------------------------------------------+ //| 定数 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| EAパラメータ設定情報 | //+------------------------------------------------------------------+ extern int MagicNumber = 20171204; //+------------------------------------------------------------------+ //| グローバル変数 | //+------------------------------------------------------------------+ // 共通 double gPipsPoint = 0.0; int gSlippage = 0; color gArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red}; //BUY: Blue, SELL: Red //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { string sectionName = "section"; string keyName = "key"; string defaultValue = "default"; string returnValue = ""; uint bufferSize = 255; string iniFilePath = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\test.ini"; int dmy = GetPrivateProfileStringW(sectionName, keyName, defaultValue, returnValue, bufferSize, iniFilePath); Print("returnValue = ", returnValue); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { }
test.iniの中身は以下です。
[section] key=Great
ポイントは以下の2箇所です。
#import "kernel32.dll" int GetPrivateProfileStringW(string sectionName, string keyName, string defaultValue, string &returnValue, uint bufferSize, string iniFilePath); #import
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はダミーの意味で、この関数の戻り値は使わないよと明示するための独自ネーミングルールです。