名前付き定数


定義済みマクロ代入

デバッグプロセスを簡素化し、MQL5 プログラムの動作に関する情報を取得するには、コンパイルの時点で値が設定された特別なマクロ定数があります。これらの定数を使用する最も簡単な方法は、Print() 関数による値出力です。

定数

説明

__DATE__

時刻を含まないファイルコンパイルの日付(時間、分、秒は 0 )。

__DATETIME__

ファイルコンパイルの日付と時刻。

__LINE__

マクロが配置されているソースコードの行番号。

__FILE__

現在コンパイルされているファイルの名称。

__PATH__

現在コンパイルされているファイルへの絶対パス。

__FUNCTION__

本体にマクロが配置されている関数の名称。

__FUNCSIG__

本体にマクロが配置されている関数のシグネチャ。関数の完全な記述のロギングはオーバーロード関数の識別に役立つことがあります。

__MQLBUILD__, __MQL5BUILD__

コンパイラのビルド番号。

例:

#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link     "https://www.metaquotes.net"
//+——————————————————————+
//| エキスパート初期化に使用される関数                                        |
//+——————————————————————+
void OnInit()
 {
//— エキスパートアドバイザーの初期化情報出力の例
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//— タイマーイベントの間隔を設定する
  EventSetTimer(5);
//—
 }
//+——————————————————————+
//| エキスパート初期化解除に使用される関数                                    |
//+——————————————————————+
void OnDeinit(const int reason)
 {
//— エキスパートアドバイザーの初期化解除情報出力の例
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//—
 }
//+——————————————————————+
//| エキスパートティック関数                                                 |
//+——————————————————————+
void OnTick()
 {
//— ティック受け取りの情報出力
  Print(" __MQLBUILD__ = ",__MQLBUILD__,"  __FILE__ = ",__FILE__);
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
  test1(__FUNCTION__);
  test2();
//—
 }
//+——————————————————————+
//| テスト1                                                            |
//+——————————————————————+
void test1(string par)
 {
//— 関数内での情報出力
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__," par = ",par);
 }
//+——————————————————————+
//| テスト2                                                            |
//+——————————————————————+
void test2()
 {
//— 関数内での情報出力
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
 }
//+——————————————————————+
//| OnTimer イベントハンドラ                                               |
//+——————————————————————+
void OnTimer()
 {
//—
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
  test1(__FUNCTION__);
 }

数学定数

特別な定数屠蘇の値は、数学的な表現のために予約されていますこれらの定数は数学関数を使用して値を計算する代わりにプログラムで使用することが出来ます。

定数

説明

M_E

e

2.71828182845904523536

M_LOG2E

log2(e)

1.44269504088896340736

M_LOG10E

log10(e)

0.434294481903251827651

M_LN2

ln(2)

0.693147180559945309417

M_LN10

ln(10)

2.30258509299404568402

M_PI

pi

3.14159265358979323846

M_PI_2

pi/2

1.57079632679489661923

M_PI_4

pi/4

0.785398163397448309616

M_1_PI

1/pi

0.318309886183790671538

M_2_PI

2/pi

0.636619772367581343076

M_2_SQRTPI

2/sqrt(pi)

1.12837916709551257390

M_SQRT2

sqrt(2)

1.41421356237309504880

M_SQRT1_2

1/sqrt(2)

0.707106781186547524401

例:

//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
 {
//— 定数値を出力する
  Print("M_E = ",DoubleToString(M_E,16));
  Print("M_LOG2E = ",DoubleToString(M_LOG2E,16));
  Print("M_LOG10E = ",DoubleToString(M_LOG10E,16));
  Print("M_LN2 = ",DoubleToString(M_LN2,16));
  Print("M_LN10 = ",DoubleToString(M_LN10,16));
  Print("M_PI = ",DoubleToString(M_PI,16));
  Print("M_PI_2 = ",DoubleToString(M_PI_2,16));
  Print("M_PI_4 = ",DoubleToString(M_PI_4,16));
  Print("M_1_PI = ",DoubleToString(M_1_PI,16));
  Print("M_2_PI = ",DoubleToString(M_2_PI,16));
  Print("M_2_SQRTPI = ",DoubleToString(M_2_SQRTPI,16));
  Print("M_SQRT2 = ",DoubleToString(M_SQRT2,16));
  Print("M_SQRT1_2 = ",DoubleToString(M_SQRT1_2,16));
 }

数値定数

単純な数値型は、それぞれ特定の種類のタスクのために意図され、正しく使用した場合 MQL5 プログラムの動作の最適化を可能にします。コードをより読みやすくして計算結果を正しく処理するために、いくつかの基本データ型に設定された制限に関する情報を受信出来る定数があります。

定数

説明

CHAR_MIN

char 型で表すことが出来る最小値。。

-128

CHAR_MAX

char 型で表すことが出来る最大値。。

127

UCHAR_MAX

uchar 型で表すことが出来る最大値。。

255

SHORT_MIN

short 型で表すことが出来る最小値。。

-32768

SHORT_MAX

short 型で表すことが出来る最大値。。

32767

USHORT_MAX

ushort 型で表すことが出来る最大値。。

65535

INT_MIN

int 型で表すことが出来る最小値。。

-2147483648

INT_MAX

int 型で表すことが出来る最大値。。

2147483647

UINT_MAX

uint 型で表すことが出来る最大値。。

4294967295

LONG_MIN

long 型で表すことが出来る最小値。。

-9223372036854775808

LONG_MAX

long 型で表すことが出来る最大値。。

9223372036854775807

ULONG_MAX

ulong 型で表すことが出来る最大値。。

18446744073709551615

DBL_MIN

double 型で表すことが出来る最小の正の値。

2.2250738585072014e-308

DBL_MAX

double 型で表すことが出来る最大値。。

1.7976931348623158e+308

DBL_EPSILON

下記の条件を満たす最小値。

1.0+DBL_EPSILON != 1.0 (double 型)

2.2204460492503131e-016

DBL_DIG

double 型の小数点以下の桁数。

15

DBL_MANT_DIG

double 型の仮数部のビット数。

53

DBL_MAX_10_EXP

double 型の指数度の 10 進数での最大値。

308

DBL_MAX_EXP

double 型の指数度の 2 進数での最大値。

1024

DBL_MIN_10_EXP

double 型の指数度の 10 進数での最小値。

(-307)

DBL_MIN_EXP

double 型の指数度の 2 進数での最小値。

(-1021)

FLT_MIN

float 型で表すことが出来る最小の正の値。

1.175494351e-38

FLT_MAX

float 型で表すことが出来る最大値。。

3.402823466e+38

FLT_EPSILON

下記の条件を満たす最小値。

1.0+DBL_EPSILON != 1.0 (float 型)

1.192092896e–07

FLT_DIG

float 型の小数点以下の桁数。

6

FLT_MANT_DIG

float 型の仮数部のビット数。

24

FLT_MAX_10_EXP

float 型の指数度の 10 進数での最大値。

38

FLT_MAX_EXP

float 型の指数度の 2 進数での最大値。

128

FLT_MIN_10_EXP

float 型の指数度の 10 進数での最小値。

-37

FLT_MIN_EXP

float 型の指数度の 2 進数での最小値。

(-125)

例:

void OnStart()
 {
//— 定数値を出力する
  printf("CHAR_MIN = %d",CHAR_MIN);
  printf("CHAR_MAX = %d",CHAR_MAX);
  printf("UCHAR_MAX = %d",UCHAR_MAX);
  printf("SHORT_MIN = %d",SHORT_MIN);
  printf("SHORT_MAX = %d",SHORT_MAX);
  printf("USHORT_MAX = %d",USHORT_MAX);
  printf("INT_MIN = %d",INT_MIN);
  printf("INT_MAX = %d",INT_MAX);
  printf("UINT_MAX = %u",UINT_MAX);
  printf("LONG_MIN = %I64d",LONG_MIN);
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("ULONG_MAX = %I64u",ULONG_MAX);
  printf("EMPTY_VALUE = %.16e",EMPTY_VALUE);
  printf("DBL_MIN = %.16e",DBL_MIN);
  printf("DBL_MAX = %.16e",DBL_MAX);
  printf("DBL_EPSILON = %.16e",DBL_EPSILON);
  printf("DBL_DIG = %d",DBL_DIG);
  printf("DBL_MANT_DIG = %d",DBL_MANT_DIG);
  printf("DBL_MAX_10_EXP =  %d",DBL_MAX_10_EXP);
  printf("DBL_MAX_EXP = %d",DBL_MAX_EXP);
  printf("DBL_MIN_10_EXP = %d",DBL_MIN_10_EXP);
  printf("DBL_MIN_EXP = %d",DBL_MIN_EXP);
  printf("FLT_MIN = %.8e",FLT_MIN);
  printf("FLT_MAX = %.8e",FLT_MAX);
  printf("FLT_EPSILON = %.8e",FLT_EPSILON);
 }

初期化解除の理由のコード

初期化解除の理由のコードは UninitializeReason() 関数から返されます。可能な値は下記の通りです。

定数

説明

REASON_PROGRAM

0

エキスパートアドバイザーが ExpertRemove() 関数を呼び出して操作を終了しました。

REASON_REMOVE

1

プログラムがチャートから削除されました。

REASON_RECOMPILE

2

プログラムが再コンパイルされました。

REASON_CHARTCHANGE

3

シンボルかチャート期間が変更されました。

REASON_CHARTCLOSE

4

チャートが閉じられました。

REASON_PARAMETERS

5

入力パラメータがユーザ—によって変更されました。

REASON_ACCOUNT

6

別のアカウントが有効化されるか、アカウントの設定変更によって取引サーバへの再接続が発生しました。

REASON_TEMPLATE

7

新しいテンプレートが適用されました。

REASON_INITFAILED

8

この値は OnInit() ハンドラがゼロ以外の値を返したことを示します。

REASON_CLOSE

9

端末が閉じられました。

初期化解除理由のコードは、また、所定の関数 OnDeinit(const int reason) のパラメータとしても渡されます。

例:

//+——————————————————————+
//| テキスト記述を取得                                                    |
//+——————————————————————+
string getUninitReasonText(int reasonCode)
 {
  string text="";
//—
  switch(reasonCode)
    {
    case REASON_ACCOUNT:
        text="Account was changed";break;
    case REASON_CHARTCHANGE:
        text="Symbol or timeframe was changed";break;
    case REASON_CHARTCLOSE:
        text="Chart was closed";break;
    case REASON_PARAMETERS:
        text="Input-parameter was changed";break;
    case REASON_RECOMPILE:
        text="Program "+__FILE__+" was recompiled";break;
    case REASON_REMOVE:
        text="Program "+__FILE__+" was removed from chart";break;
    case REASON_TEMPLATE:
        text="New template was applied to chart";break;
    default:text="Another reason";
    }
//—
  return text;
 }
//+——————————————————————+
//| エキスパート初期化解除に使用される関数                                    |
//+——————————————————————+
void OnDeinit(const int reason)
 {
//— 初期化解除の理由のコード取得の方法その 1
  Print(__FUNCTION__,"_Uninitalization reason code = ",reason);
//— 初期化解除の理由のコード取得の方法その 2
  Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));
 }

オブジェクトポインタのチェック

CheckPointer() 関数はオブジェクトポインタの型をチェックするのに使用されます。この関数は ENUM_POINTER_TYPE 列挙のいずれかの値を返します。不正なポインタが使用されると、プログラムの実行が直ちに終了されます。

new() 演算子で作成されたオブジェクトは POINTER_DYNAMIC 型です。この様なポインタとはdelete() 演算子 のみが使用されるべきです。

他の全てのポインタは、オブジェクトが MQL5 プログラム環境によって自動的に作成されたことを意味する POINTER_AUTOMATIC 型のものです。このようなオブジェクトは使用後に自動的に削除されます。

ENUM_POINTER_TYPE

定数

説明

POINTER_INVALID

不正ポインタ。

POINTER_DYNAMIC

new() 演算子で作成されたオブジェクトのポインタ。

POINTER_AUTOMATIC

自動的に(new() を使用せずに)作成されたオブジェクトのポインタ。

参照

ランタイムエラー、delete オブジェクト解除演算子、CheckPointer

その他の定数

CLR_NONE 定数は、色が存在しないことを概説するために使用され、指標のグラフィックオブジェクトやグラフィックシリーズはプロットされません。この定数はウェブカラー定数リストには含まれていませんが、カラー引数が必要なところならどこにでも適用することが出来ます。

INVALID_HANDLE 定数はハンドラのチェックに使用されます(FileOpen() 及び FileFindFirst() を参照)。

定数

説明

CHARTS_MAX

端末内に同時に開けるチャートの最大数。

100

clrNONE

無色。

-1

EMPTY_VALUE

指標バファ—の空値。

DBL_MAX

INVALID_HANDLE

不正なハンドル。

-1

IS_DEBUG_MODE

MQ5 プログラムをデバグモードで動作するフラグ。

デバグモードではゼロ以外、それ以外はゼロ

IS_PROFILE_MODE

MQ5 プログラムをプロファイルモードで動作するフラグ。

プロファイルモードではゼロ以外、それ以外はゼロ

NULL

すべの型でゼロ。

0

WHOLE_ARRAY

配列の最後までに残っている要素の数を表します。配列全体が処理されます。

-1

WRONG_VALUE

定数は任意の列挙型に暗黙的にキャストされることが出来ます。

-1

EMPTY_VALUE 定数は、通常、チャートには示されていない指標値に相当します。例えば、内蔵された 20時間軸の指標標準偏差では、履歴内の最初の19のバーは、チャートに示されていません。この指標ハンドルを iStdDev() 関数で作成し、指標値の配列を CopyBuffer(), でコピーした場合、値は EMPTY_VALUE に等しくなります。

指標がチャートに表示されてはいけない場合、カスタム指標に独自の空値を指定することが出来ます。この際、PlotIndexSetDouble() 関数を PLOT_EMPTY_VALUE 修飾子と使用します。

。NULL 定数は、基本データ型の変数やオブジェクトの構造やクラスのポインタに割り当てることが出来ます。文字列変数への NULL の割り当てはこの変数の完全な初期化解除を意味します。

WRONG_VALUE 定数は、不正の列挙の値を返す時に必要です。例えば、戻り値がこの列挙の値であることを知らせる必要がある場合です。例として、名称で指定されたオブジェクトの線のスタイルを返す CheckLineStyle() をみてみましょう。ObjectGetInteger() によるスタイルチェックの結果が true の場合、ENUM_LINE_STYLE からの値が返されます。その他の場合 WRONG_VALUE が返されます。

void OnStart()
 {
  if(CheckLineStyle("MyChartObject")==WRONG_VALUE)
    printf("Error line style getting.");
 }
//+——————————————————————+
//| 名称で指定されたオブジェクトの線のスタイルを返す                                |
//+——————————————————————+
ENUM_LINE_STYLE CheckLineStyle(string name)
 {
  long style;
//—
  if(ObjectGetInteger(0,name,OBJPROP_STYLE,0,style))
    return((ENUM_LINE_STYLE)style);
  else
    return(WRONG_VALUE);
 }

 

WHOLE_ARRAY 定数は、処理された配列の要素数を指定することを必要とする関数を対象としています。

  • ArrayCopy();
  • ArrayMinimum();
  • ArrayMaximum();
  • FileReadArray();
  • FileWriteArray().

指定された位置から配列の最後までの全ての値が処理されなければならないことを指定する場合は、WHOLE_ARRAY 値を指定する必要があります。

IS_PROFILE_MODE 定数は、プロファイルモードでデータが正しく収集されるようにプログラムの動作を変更することが出来ます。プロファイリングは個々のプログラムフラグメント(通常、関数を含む)の実行時間を測定し、ならびに呼び出しの数を計算することが出来ます。この例のように、プロファイリングモードで実行時間を決定するためにはSleep() 関数の呼び出しは無効にすることが出来ます。

//— Sleep はプロファイリング結果に大影響(変化)を与えることがある
if(!IS_PROFILE_MODE) Sleep(100); // プロファイリングモードで Sleep() を無効にする

IS_PROFILE_MODE は従来のモードではゼロに設定される定数値で、コンパイル時にコンパイラによって設定されます。プロファイリングモードでプログラムを起動すると、特別なコンパイルが行われ、IS_PROFILE_MODE はゼロ以外の値に置き換えられます。

IS_DEBUG_MODE 定数はデバッグモードでの MQL5 プログラムの動作をわずかに変更する必要がある場合に役立ちます。例えば、デバッグモードでは、端末ログに追加のデバッグ情報を表示したり、チャートに追加のグラフィックオブジェクトを作成する必要があります。

次の例は、ラベルオブジェクトを作成し、スクリプトの実行モードに応じてその記述や色を設定します。MetaEditor でスクリプトをデバッグモードで実行するには、F5 を押します。端末でブラウザウィンドウからスクリプトを実行すると、オブジェクトラベルの色とテキストが異なります。

例:

//+——————————————————————+
//|                                             Check_DEBUG_MODE.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net |
//+——————————————————————+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link     "https://www.metaquotes.net"
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
 {
//—
  string label_name="invisible_label";
  if(ObjectFind(0,label_name)<0)
    {
    Print("Object",label_name,"not found. Error code = ",GetLastError());
    //— ラベルを作成する
    ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
    //— X 座標を設定する
    ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
    //— Y 座標を設定する
    ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
    ResetLastError();
    if(IS_DEBUG_MODE) // デバグモード
       {
        //— スクリプト実行モードについてのメッセージを表示する
        ObjectSetString(0,label_name,OBJPROP_TEXT,"DEBUG MODE");
        //— テキストの色を赤にする
        if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrRed))
          Print("Unable to set the color. Error",GetLastError());
       }
    else             // 操作モード
       {
        ObjectSetString(0,label_name,OBJPROP_TEXT,"RELEASE MODE");
        //— テキストの色を不可視にする
        if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,CLR_NONE))
          Print("Unable to set the color. Error ",GetLastError());
       }
    ChartRedraw();
    DebugBreak();   // デバッグモードにでは、ここで終了する
    }
 }

クリプトメソッド

ENUM_CRYPT_METHOD 列挙は、データ変換方法を指定するために使用され CryptEncode() 及び CryptDecode() 関数で使用されます。

ENUM_CRYPT_METHOD

定数

説明

CRYPT_BASE64

BASE64

CRYPT_AES128

128ビット(16バイト)キーでの AES 暗号化。

CRYPT_AES256

256 ビット(32 バイト)キーでの AES 暗号化。

CRYPT_DES

56ビット(7バイト)キーでの DES 暗号化。

CRYPT_HASH_SHA1

SHA1 HASH の計算。

CRYPT_HASH_SHA256

SHA256 HASH の計算。

CRYPT_HASH_MD5

MD5 HASH の計算。

CRYPT_ARCH_ZIP

ZIP アーカイブ。

参照

参照

DebugBreak、MQL5 プログラム実行プロパティ、CryptEncode()、CryptDecode()

Originally posted 2019-07-29 22:47:01.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">