環境
OS: Windows7
Metatorader: XMtrading MT5 5.00 build 2085
MetaEditor:5.00 build 2085
文言定義
MT : MetaToraderの略称
概要
指標カレンダー情報を定期的にmariaDBへ格納する為、
一時的にcsvファイルとして格納したい。
はまった所
・ファイルの出力先が固定されている。
MTではセキュリティの観点から操作出来るフォルダが決まっている。
操作可能なフォルダは下記の2種類となる。
・端末データを格納するフォルダ
TerminalInfoString(TERMINAL_DATA_PATH)
で確認出来る。
・クライアント共通のフォルダ
TerminalInfoString(TERMINAL_COMMONDATA_PATH)
で確認出来る。
上記フォルダへシンボリックリンクで別のドライブのフォルダを指定しても、権限を同じにしてもフォルダの参照は出来なかった。
今回は指定フォルダへの書き出しへの優先度は低い為検証はしないが、今後指定フォルダへの書き込みが必要な場合はMT自体の設定を変更する方法なり考えないといけない。
・書き出したファイルがバイナリだった。
指標カレンダーは専用の構造体を用いて値が格納されている為、
普通にファイルへの書き出しではバイナリで書きだされる。
(やったこと①)
指標カレンダーは専用の構造体に値を格納している訳で当たり前だったのですが、構造体の中身を展開し書き出す方法が解んなかったのでとりあえずループで構造体の中身をそれぞれ指定して書き出す様にしました。
今回のスクリプトでは連続でやったり短期で何度も呼びだす事は無いのでそれでいいかなと、、、(やったこと②)
やったこと/結果(OK or NG)
共通 指標カレンダー情報の取得
MqlCalendarValue values[]; ①値格納用変数の定義
datetime date_from=D'01.01.2000'; ②取得開始日時の指定
datetime date_to=D'01.01.2009'; ③取得完了日時の指定
CalendarValueHistory(values,date_from,date_to) ④valuesへカレンダー情報の格納
①単純にファイルに書き出し/NG
なんかバイナリとして出力されているみたいで、普通に見れない。
FileSave("test.csv",values,FILE_COMMON);
②繰り返しでファイルに出力/OK
そもそも今回取得したデータは構造体となっている為 構造体の中身を展開しないといけなかったぽい。
なので第一配列を一行づつ取得して、構造体の中の変数を取得し、それをcsv形式の文字列へ変換
最後に文字列をファイルに書き出す処理へ変更した。
if(CalendarValueHistory(values,date_from,date_to)){ ①指標カレンダー情報が取得出来ているか確認。取得出来ていたら下記を実行
int file_handle=FileOpen("event.csv",FILE_READ|FILE_WRITE|FILE_CSV|FILE_COMMON); ②「event.csv」ってcsvファイルをCSV形式で読み込み・書き込み権限有りでクライアント共通のフォルダから開く(無ければ新規作成)
if(file_handle!=INVALID_HANDLE) ③ファイルが開けたか確認
{
for(int i=0;i<ArraySize(values); i++){ ④第一次配列の個数まで繰り返し処理を実行
// 変数への格納
string recodes = values[i].id +"," + values[i].event_id + ","; ⑤構造体の変数を指定し値をカンマ区切りで格納
if(values[i].actual_value == -9223372036854775808) ⑥MQL5の仕様により、欠落した値はINT64_MIN(-9223372036854775808)になっている為、NULL文字へ変換する必要が有り判定処理を実施。
recodes = recodes +"\\N,";⑦NULLの場合MariaDBのNULL文字として[\N]を入力
FileWrite(file_handle,recodes); ⑧ファイルへ文字列を書き込む
}⑨ループ終了
FileClose(file_handle); ⑨ファイルを閉じる。
}