久しぶりに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