恥は/dev/nullへ by 初心者

~ PC初心者による右往左往の記録 ~

MqlTradeRequest構造体(1)

久しぶりにMqlTradeRequest構造体を使おうとしたら迷路に入り込んだので、改めて調べ直しました。

この記事は「フィールドの内容」と「初期化」に関するメモです。

なお、個人的には「メンバ」という言葉を使いたくなりますが、MQL5の文書では「フィールド」と書かれているので、それに倣うことにしました。

MqlTradeRequest構造体のフィールド

action        // 取引の種類(たとえば、TRADE_ACTION_DEALは成行注文)
magic         // マジックナンバー(EAの識別子)
order         // order ticket番号(発注済みの未決注文を変更する時に使う)
symbol        // 通貨ペア、銘柄など
volume        // ロット数
price         // 価格(この価格に到達したらorderを出す)
stoplimit     // 逆指値注文を発動する価格
sl            // SL価格(決済逆指値)
tp            // TP価格(決済指値)
deviation     // スリッページ(Point数)
type          // 注文の種別(BUY、SELL、BUY_LIMIT、SELL_STOPなど)
type_filling  // fill policy
type_time     // 注文の有効期限の種類
expiration    // 注文の有効期限
comment       // 注文コメント
position      // ポジションチケット番号
position_by   // ヘッジ口座において両建てしている場合に、2つのポジションを相殺する場合に使う


MqlTradeRequest構造体の初期化

MqlTradeRequest構造体のインスタンスを初期化する時は

MqlTradeRequest request = {};

とするか

MqlTradeRequest request;
ZeroMemory(request);

とします。

失敗談

初期化のやり方については以上ですが、少し失敗談を書いておきます。
上記のようにすればよいと知らなかった頃に、

MqlTradeRequest request = {0};

としたら、

cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'

というエラーが表示されました。

// MqlTradeRequest構造体(ヘルプから引用)
struct MqlTradeRequest 
{ 
   ENUM_TRADE_REQUEST_ACTIONS    action;
   ulong                         magic;
   ulong                         order;
   string                        symbol;
   double                        volume;
   double                        price;
   double                        stoplimit;
   double                        sl;
   double                        tp;
   ulong                         deviation;
   ENUM_ORDER_TYPE               type;
   ENUM_ORDER_TYPE_FILLING       type_filling;
   ENUM_ORDER_TYPE_TIME          type_time;
   datetime                      expiration;
   string                        comment;
   ulong                         position;
   ulong                         position_by;
};

一番上にactionというフィールドがありますね。
このフィールドはENUM_TRADE_REQUEST_ACTIONS型です。

この型には以下6つのenum定数があります。

TRADE_ACTION_DEAL    
TRADE_ACTION_PENDING 
TRADE_ACTION_SLTP    
TRADE_ACTION_MODIFY  
TRADE_ACTION_REMOVE  
TRADE_ACTION_CLOSE_BY


以下のPrint文を実行してみます。

void OnStart()
{
    Print("TRADE_ACTION_DEAL     =  ", TRADE_ACTION_DEAL    );
    Print("TRADE_ACTION_PENDING  =  ", TRADE_ACTION_PENDING );
    Print("TRADE_ACTION_SLTP     =  ", TRADE_ACTION_SLTP    );
    Print("TRADE_ACTION_MODIFY   =  ", TRADE_ACTION_MODIFY  );
    Print("TRADE_ACTION_REMOVE   =  ", TRADE_ACTION_REMOVE  );
    Print("TRADE_ACTION_CLOSE_BY =  ", TRADE_ACTION_CLOSE_BY);
}
// 実行結果

TRADE_ACTION_DEAL     =  1
TRADE_ACTION_PENDING  =  5
TRADE_ACTION_SLTP     =  6
TRADE_ACTION_MODIFY   =  7
TRADE_ACTION_REMOVE   =  8
TRADE_ACTION_CLOSE_BY =  10

このように、各enum定数の中身は1~10の範囲であり、0はありません。
そのため、0で初期化しようとすると、

cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'

というエラーが表示されるのだと思います。

「なんかビミョー・・・」と思ったこと

しかし、以下のスクリプトを実行すると・・・・、

void OnStart()
{
    MqlTradeRequest request = {};

    Print("action       = ", request.action       );
    Print("magic        = ", request.magic        );
    Print("order        = ", request.order        );
    Print("symbol       = ", request.symbol       );
    Print("volume       = ", request.volume       );
    Print("price        = ", request.price        );
    Print("stoplimit    = ", request.stoplimit    );
    Print("sl           = ", request.sl           );
    Print("tp           = ", request.tp           );
    Print("deviation    = ", request.deviation    );
    Print("type         = ", request.type         );
    Print("type_filling = ", request.type_filling );
    Print("type_time    = ", request.type_time    );
    Print("expiration   = ", request.expiration   );
    Print("comment      = ", request.comment      );
    Print("position     = ", request.position     );
    Print("position_by  = ", request.position_by  );
}


下記実行結果のとおり、actionフィールドに 0 がセットされています。
深く考えないことにしましょう・・・。

// 実行結果
action       = 0
magic        = 0
order        = 0
symbol       = 
volume       = 0.0
price        = 0.0
stoplimit    = 0.0
sl           = 0.0
tp           = 0.0
deviation    = 0
type         = 0
type_filling = 0
type_time    = 0
expiration   = 1970.01.01 00:00:00
comment      = 
position     = 0
position_by  = 0