前提・実現したいこと
※先ずは最下部の参照リンクから使用ライブラリ2ファイルを確認して下さい。
①目的:
MetaQuotes社提供の為替取引用ToolであるMT4/MT5において、大域変数(通称Global変数)の外部txtファイルへの書き出し並びに読み込みを行いたい。
②条件:
下記参照ページに記載されているCGlobalVar.mqh並びにCGlobalVarList.mqhクラスを用いて実現したい。
(具体的にはCGLobalVarListクラスのSave()/Load()の両メソッドを利用してGlobal変数の書き出し・読み込みを実行する)
基本的にはWindowsAPI(HANDLE CeateFileW()等)は使用しない。
③操作ファイル格納場所:
書き出し先のファイル位置は本クラスの仕様に従い、デフォルトである
/Files
もしくは
FileOpen()の引数としてFILE_COMMONを指定した際に保管される
C:\User\User-Name\AppData\Roaming\MetaQuotes\Terminal\Common\Files\File
のいずれかとする。
④作成したファイル:
実験用サンプルとして2つのシンプルなScriptファイル
WriteGlobalParameters.mq4
と
ReadGlobalParameters.mq4
を作成した。
※備考
①別TerminalとGlobal変数を共有するだけが目的であれば共有メモリを使用する等の方法も考えられるが、今回はあくまでも外部のtxtファイルを使用する方法に限定して考える。
②書き出し側のファイル(WriteGlobalParamaeters.mq4)については問題のクラスにおけるSave(HANDLE)を用いずに、MQL組み込み関数であるGlobalVariablesTotal(),GlobalVariableName(),GlobalVariableGet(),GlobalVariableTime()を用いてそれら情報をFileWrite()関数にて書き込む(↓)
MQL4
1 for(int i=GlobalVariablesTotal()-1; i>=0; i--){ 2 string gName=GlobalVariableName(i); 3 if(this.CheckGlobalVar(gName))continue; 4 double gValue=GlobalVariableGet(gName); 5 datetime gTime=GlobalVariableTime(gName); 6 FileWrite(hFile,gName,gValue,gTime); 7} 8```により変数のリストを指定ディレクトリ内のtxtファイルへ書き出すことが可能であった。 9しかしながら上記GlobalVariable関数群を用いた場合には書き出しは可能であっても読み込み&Terminalのグローバル変数リストへの追加できないため頓挫している。 10 11### 発生している問題・エラーメッセージ 12WriteGlobalParameters.mq4側: 132018.05.26 22:34:45.283 WriteGlobalParameters EURUSD,M1: uninit reason 0 142018.05.26 22:34:45.283 WriteGlobalParameters EURUSD,M1: File Save Error 152018.05.26 22:34:45.282 WriteGlobalParameters EURUSD,M1: Pointer Create Error 16 17ReadGlobalParameters.mq4側: 182018.05.26 22:43:08.397 ReadGlobalParameters EURUSD,M1: uninit reason 0 192018.05.26 22:43:08.397 ReadGlobalParameters EURUSD,M1: Pointer Create Error 20 21※以上のエラーメッセージから 22ポインタ指定の不備・ファイル操作の不備により意図した操作が行われていないことが分かるが、 23以下のコードの何処に問題があるのか不明なので、その点についてご教授いただけたらと存じます(uninit reason 0についても同様) 24 25### 該当のソースコード 26 27```MQL4/MQL5 28WriteGlobalParameters.mq4> 29//+------------------------------------------------------------------+ 30//| WriteGlobalParameters.mq4 | 31//| Copyright 2018, MetaQuotes Software Corp. | 32//| https://www.mql5.com | 33//+------------------------------------------------------------------+ 34#property copyright "Copyright 2018, MetaQuotes Software Corp." 35#property link "https://www.mql5.com" 36#property version "1.00" 37#include <Arrays\List.mqh> 38#include <CGlobalVar.mqh> 39#include <CGlobalVarList.mqh> 40//+------------------------------------------------------------------+ 41//| Script program start function | 42//+------------------------------------------------------------------+ 43void OnStart(){ 44//Your File Name 45string FileName="Write"; 46string FileType="txt"; 47string file=FileName+"."+FileType; 48 49//Pointer 50CGlobalVarList *list = new CGlobalVarList; 51if(list!=NULL){ 52 Print("Pointer Create Error"); 53} 54 55//Handle 56int hFile; 57hFile=FileOpen(file,FILE_WRITE|FILE_COMMON); //FILE_CSV|FILE_UNICODE 58 59if(hFile>=0){ 60 if(!list.Save(hFile)){ 61 Print("File Save Error"); 62 delete list; 63 FileClose(hFile); 64 } 65//Close 66 FileClose(hFile); 67} 68//Release the Pointer 69delete list; 70} 71========================================================================== 72ReadGlobalParameters.mq4> 73//+------------------------------------------------------------------+ 74//| ReadGlobalParameters.mq4 | 75//| Copyright 2018, MetaQuotes Software Corp. | 76//| https://www.mql5.com | 77//+------------------------------------------------------------------+ 78#property copyright "Copyright 2018, MetaQuotes Software Corp." 79#property link "https://www.mql5.com" 80#property version "1.00" 81#include <Arrays\List.mqh> 82#include <CGlobalVar.mqh> 83#include <CGlobalVarList.mqh> 84//+------------------------------------------------------------------+ 85//| Script program start function | 86//+------------------------------------------------------------------+ 87void OnStart(){ 88//Your File Name 89string FileName="Read"; 90string FileType="txt"; 91string file=FileName+"."+FileType; 92 93//Pointer 94CGlobalVarList *list = new CGlobalVarList; 95if(list!=NULL){ 96 Print("Pointer Create Error"); 97} 98 99//Handle 100int hFile; 101hFile=FileOpen(file,FILE_READ|FILE_COMMON); //FILE_CSV|FILE_UNICODE 102 103if(hFile>=0){ 104 if(!list.Load(hFile)){ 105 Print("File Load Error"); 106 delete list; 107 FileClose(hFile); 108 } 109//Close 110 FileClose(hFile); 111} 112//Release the Pointer 113delete list; 114} 115========================================================================== 116========================================================================== 117※使用クラス内メソッド 118CGLobalVarList::Save(const int handle) 119//+------------------------------------------------------------------+ 120//| Saving | 121//+------------------------------------------------------------------+ 122bool CGlobalVarList::Save(const int _file_ha){ 123 if(_file_ha==INVALID_HANDLE) 124 return false; 125//--- 126 int gvar_num=this.Total(); 127//--- 128 if(gvar_num>0){ 129 //--- columns 130 FileWrite(_file_ha,"Name","Value","Creation time","Last call time"); 131 //--- 132 for(int idx=gvar_num-1;idx>=0;idx--){ 133 CGlobalVar *ptr_gvar=this.GetNodeAtIndex(idx); 134 if(ptr_gvar!=NULL){ 135 if(!ptr_gvar.IsTemporary()){ 136 //--- gvar properties 137 string curr_gvar_name=ptr_gvar.Name(); 138 double curr_gvar_val=GlobalVariableGet(curr_gvar_name); 139 datetime curr_gvar_create_time=ptr_gvar.CreateTime(); 140 datetime curr_gvar_last_time=ptr_gvar.LastTime(); 141 //--- write 142 FileWrite(_file_ha,curr_gvar_name,DoubleToString(curr_gvar_val), 143 TimeToString(curr_gvar_create_time, 144 TIME_DATE|TIME_MINUTES|TIME_SECONDS), 145 TimeToString(curr_gvar_last_time, 146 TIME_DATE|TIME_MINUTES|TIME_SECONDS)); 147 } 148 }else{ 149 Print("Failed to get the gvar object!"); 150 return false; 151 } 152 } 153 return true; 154 } 155 return false; 156 } 157========================================================================== 158CGLobalVarList::Load(const int handle) 159//+------------------------------------------------------------------+ 160//| Loading | 161//+------------------------------------------------------------------+ 162bool CGlobalVarList::Load(const int _file_ha){ 163 if(_file_ha==INVALID_HANDLE || !FileSeek(_file_ha,0,SEEK_SET)) 164 return false; 165//--- 166 SetGvarType(GVARS_TYPE_FULL); 167//--- skip the first string 168 while(!FileIsLineEnding(_file_ha)) 169 FileReadString(_file_ha); 170 171//--- read the data from the file 172 while(!FileIsEnding(_file_ha)){ 173 //--- name 174 string gvar_name=FileReadString(_file_ha); 175 //--- value 176 double gvar_val=StringToDouble(FileReadString(_file_ha)); 177 //--- creation time 178 datetime gvar_create_time=StringToTime(FileReadString(_file_ha)); 179 FileReadString(_file_ha); 180 //--- 181 CGlobalVar *ptr_gvar=new CGlobalVar(gvar_name,gvar_val,gvar_create_time); 182 //--- control gvar type 183 if(CheckPointer(ptr_gvar)==POINTER_DYNAMIC) 184 //--- try to add 185 if(this.Add(ptr_gvar)>-1) 186 continue; 187 //--- 188 return false; 189 } 190 return true; 191 } 192==========================================================================
試したこと
⓪MT4を起動しTerminal上のGlobal変数リストに任意の名前と数値(ココでは簡単に0.0ないしは1.0)を登録した。
(時刻は登録時に自動で設定されるため未指定)
=================================================================
先ずはWriteGlobalParameters.mq4側から---
①⓪の設定を施したChartに対しWriteGlobalParameters.mq4を適用させた。
→正常動作していれば上記で示したディレクトリ内にファイルが作成されGlobal変数に関する情報が入力されているはずであった。
②当該ディレクトリ(C:\User\User-Name\AppData\Roaming\MetaQuotes\Terminal\Common\Files)を確認してみると、
指定した"Write.txt"は作成されているが、ファイルサイズは0kbyte。
→開いてみると当然の事ながらGlobal変数の名前や数値は入力されていなかった。
==================================================================
次にReadGlobalParameters.mq4側について---
③②と同じディレクトリ内に任意の名前・数値を入力したGlobal変数読み取り用ファイル"Read.txt"を作成した
(名前/数値/時間の各区切りは;区切り(未指定)とタブ区切り(FileOpen()時に"\t"を指定)の2種を作成し実験した)
④結果は①同様、ChartにReadGlobalParameters.mq4を適用するも上記エラーメッセージが表示され、Terminal上のGlobal変数リストを開くも空であった。
==================================================================
※備考
念のためFileOpen()関数についてデフォルトで指定されるFILE_CSVやFILE_UNICODE、FILE_BINやFILE_ANSIでも同様の実験を行ったが結果は変わらなかった。
補足情報(FW/ツールのバージョンなど)
参照ページ
MQL5 PROGRAMMING BASICS: GLOBAL VARIABLES OF THE TERMINAL
https://www.mql5.com/en/articles/1210
あなたの回答
tips
プレビュー