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

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

ただいまの
回答率

90.62%

  • C

    3561questions

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

  • C++

    3328questions

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

  • MQL4

    20questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 192

mt40806

score 2

 前提・実現したいこと

※先ずは最下部の参照リンクから使用ライブラリ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()関数にて書き込む(↓)

  for(int i=GlobalVariablesTotal()-1; i>=0; i--){
    string gName=GlobalVariableName(i);
    if(this.CheckGlobalVar(gName))continue;
    double gValue=GlobalVariableGet(gName);
    datetime gTime=GlobalVariableTime(gName);
    FileWrite(hFile,gName,gValue,gTime);
}

により変数のリストを指定ディレクトリ内のtxtファイルへ書き出すことが可能であった。
しかしながら上記GlobalVariable関数群を用いた場合には書き出しは可能であっても読み込み&Terminalのグローバル変数リストへの追加できないため頓挫している。

 発生している問題・エラーメッセージ

WriteGlobalParameters.mq4側:
2018.05.26 22:34:45.283    WriteGlobalParameters EURUSD,M1: uninit reason 0
2018.05.26 22:34:45.283    WriteGlobalParameters EURUSD,M1: File Save Error
2018.05.26 22:34:45.282    WriteGlobalParameters EURUSD,M1: Pointer Create Error

ReadGlobalParameters.mq4側:
2018.05.26 22:43:08.397    ReadGlobalParameters EURUSD,M1: uninit reason 0
2018.05.26 22:43:08.397    ReadGlobalParameters EURUSD,M1: Pointer Create Error

※以上のエラーメッセージから
ポインタ指定の不備・ファイル操作の不備により意図した操作が行われていないことが分かるが、
以下のコードの何処に問題があるのか不明なので、その点についてご教授いただけたらと存じます(uninit reason 0についても同様)

 該当のソースコード

WriteGlobalParameters.mq4>
//+------------------------------------------------------------------+
//|                                        WriteGlobalParameters.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Arrays\List.mqh>
#include <CGlobalVar.mqh>
#include <CGlobalVarList.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
//Your File Name
string FileName="Write";
string FileType="txt";
string file=FileName+"."+FileType;

//Pointer
CGlobalVarList *list = new CGlobalVarList;
if(list!=NULL){
   Print("Pointer Create Error");
}

//Handle
int hFile;
hFile=FileOpen(file,FILE_WRITE|FILE_COMMON); //FILE_CSV|FILE_UNICODE

if(hFile>=0){
   if(!list.Save(hFile)){
      Print("File Save Error");
      delete list;
      FileClose(hFile);
   }
//Close
    FileClose(hFile);
}
//Release the Pointer
delete list;
}
==========================================================================
ReadGlobalParameters.mq4>
//+------------------------------------------------------------------+
//|                                                  ReadGlobalParameters.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Arrays\List.mqh>
#include <CGlobalVar.mqh>
#include <CGlobalVarList.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
//Your File Name
string FileName="Read";
string FileType="txt";
string file=FileName+"."+FileType;

//Pointer
CGlobalVarList *list = new CGlobalVarList;
if(list!=NULL){
   Print("Pointer Create Error");
}

//Handle
int hFile;
hFile=FileOpen(file,FILE_READ|FILE_COMMON); //FILE_CSV|FILE_UNICODE

if(hFile>=0){
   if(!list.Load(hFile)){
      Print("File Load Error");
      delete list;
      FileClose(hFile);
   }
//Close
    FileClose(hFile);
}
//Release the Pointer
delete list;
}
==========================================================================
==========================================================================
※使用クラス内メソッド
CGLobalVarList::Save(const int handle)
//+------------------------------------------------------------------+
//| Saving                                                           |
//+------------------------------------------------------------------+
bool CGlobalVarList::Save(const int _file_ha){
   if(_file_ha==INVALID_HANDLE)
      return false;
//---
   int gvar_num=this.Total();
//---
   if(gvar_num>0){
      //--- columns
      FileWrite(_file_ha,"Name","Value","Creation time","Last call time");
      //---
      for(int idx=gvar_num-1;idx>=0;idx--){
         CGlobalVar *ptr_gvar=this.GetNodeAtIndex(idx);
         if(ptr_gvar!=NULL){
            if(!ptr_gvar.IsTemporary()){
               //--- gvar properties
               string curr_gvar_name=ptr_gvar.Name();
               double curr_gvar_val=GlobalVariableGet(curr_gvar_name);
               datetime curr_gvar_create_time=ptr_gvar.CreateTime();
               datetime curr_gvar_last_time=ptr_gvar.LastTime();
               //--- write
               FileWrite(_file_ha,curr_gvar_name,DoubleToString(curr_gvar_val),
                         TimeToString(curr_gvar_create_time,
                         TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                         TimeToString(curr_gvar_last_time,
                         TIME_DATE|TIME_MINUTES|TIME_SECONDS));
              }
           }else{
            Print("Failed to get the gvar object!");
            return false;
           }
        }
      return true;
     }
   return false;
  }
==========================================================================
CGLobalVarList::Load(const int handle)
//+------------------------------------------------------------------+
//| Loading                                                          |
//+------------------------------------------------------------------+
bool CGlobalVarList::Load(const int _file_ha){
   if(_file_ha==INVALID_HANDLE || !FileSeek(_file_ha,0,SEEK_SET))
      return false;
//---
   SetGvarType(GVARS_TYPE_FULL);
//--- skip the first string
   while(!FileIsLineEnding(_file_ha))
      FileReadString(_file_ha);

//--- read the data from the file
   while(!FileIsEnding(_file_ha)){
      //--- name
      string gvar_name=FileReadString(_file_ha);
      //--- value
      double gvar_val=StringToDouble(FileReadString(_file_ha));
      //--- creation time
      datetime gvar_create_time=StringToTime(FileReadString(_file_ha));
      FileReadString(_file_ha);
      //---
      CGlobalVar *ptr_gvar=new CGlobalVar(gvar_name,gvar_val,gvar_create_time);
      //--- control gvar type 
      if(CheckPointer(ptr_gvar)==POINTER_DYNAMIC)
         //--- try to add
         if(this.Add(ptr_gvar)>-1)
            continue;
      //---
      return false;
     }
   return true;
  }
==========================================================================

 試したこと

⓪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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3561questions

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

  • C++

    3328questions

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

  • MQL4

    20questions

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

  • トップ
  • C++に関する質問
  • MT4/MT5においてGlobal変数/大域変数の書き出し・読み込みを行いたい(Class使用・外部txtファイル操作)