質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

2656閲覧

MT4/MT5においてGlobal変数/大域変数の書き出し・読み込みを行いたい(Class使用・外部txtファイル操作)

mt40806

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/05/26 14:28

編集2018/05/28 05:09

前提・実現したいこと

※先ずは最下部の参照リンクから使用ライブラリ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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問