【MQL4リファレンス】MqlTick構造体の使い方!SymbolInfoTick()でBid/Askをリアルタイム取得する方法

構造体

この記事では、MQL4のMqlTick構造体について詳しく解説します。
SymbolInfoTick()関数と組み合わせることで、現在のBid/Ask価格やスプレッドをリアルタイムで取得できます。

MqlTick構造体とは?

MqlTickは、ティック(価格変動)の最新情報を格納するための構造体です。BidとAsk価格を同時に取得できるため、スプレッドの計算やエントリー価格の判定に使います。

通常のBidAsk変数と違い、MqlTickを使うとティック時刻(ミリ秒精度)も取得でき、より精密な処理が可能です。

MqlTick が便利な場面
・スプレッドが広いときは取引しないフィルター
・現在価格をBid/Ask両方同時に取得したいとき
・ティックの正確な時刻(ミリ秒)が必要なとき

構造体の定義・フィールド一覧

フィールド 説明
time datetime ティックの時刻(秒単位)
bid double Bid価格(売値)
ask double Ask価格(買値)
last double 最終取引価格(取引所通貨ペアのみ)
volume ulong ティック数
time_msc long ティックの時刻(ミリ秒単位)
flags uint ティックのフラグ(BidまたはAskの変化を示す)
volume_real double 実際の出来高(取引所通貨ペアのみ)

構造体の図解

struct MqlTick BID(売値) bid ASK(買値) ask spread time ティック時刻(datetime, 秒) last 最終取引価格(double) volume ティック数(ulong) time_msc 時刻(long, ミリ秒) 取得関数 SymbolInfoTick( symbol, tick )
MqlTick構造体のフィールドとBid/Askスプレッドの関係

SymbolInfoTick()の使い方

SymbolInfoTick()は指定した通貨ペアの最新ティック情報をMqlTickに取得する関数です。

bool SymbolInfoTick(
    string    symbol,  // 通貨ペア(例: "USDJPY")
    MqlTick  &tick     // 取得先のMqlTick変数
);

戻り値がfalseの場合は取得失敗です。GetLastError()でエラー内容を確認できます。

Bid/Ask変数との違いに注意
グローバル変数BidAskはOnTick()が呼ばれた時点の値です。
SymbolInfoTick()を使うと最新のティックを任意のタイミングで取得でき、他の通貨ペアの価格も取れます。

プログラム例①:現在のBid/Ask・スプレッドを表示

void OnTick()
{
    MqlTick tick;

    if(!SymbolInfoTick(Symbol(), tick))
    {
        Print("TickInfo取得失敗: ", GetLastError());
        return;
    }

    // Bid/Ask・スプレッドを計算して表示
    double spreadPoints = (tick.ask - tick.bid) / Point;

    Print("=== 現在のTickデータ ===");
    Print("Bid  : ", tick.bid);
    Print("Ask  : ", tick.ask);
    Print("Spread: ", DoubleToString(spreadPoints, 1), " pips");
    Print("時刻  : ", TimeToString(tick.time, TIME_DATE|TIME_SECONDS));
}

プログラム例②:スプレッドフィルター(EA向け)

スプレッドが広いときはエントリーを控えるスプレッドフィルターの実装例です。重要指標の発表前後はスプレッドが急拡大するため、このフィルターは実用的です。

// 入力パラメータ
input double MaxSpreadPips = 3.0;  // 最大許容スプレッド(pips)

// スプレッドが許容範囲内かチェック
bool IsSpreadOK()
{
    MqlTick tick;
    if(!SymbolInfoTick(Symbol(), tick))
        return false;

    double spreadPips = (tick.ask - tick.bid) / Point;
    return spreadPips <= MaxSpreadPips;
}

// EAのOnTick関数での使用例
void OnTick()
{
    MqlTick tick;
    SymbolInfoTick(Symbol(), tick);
    double currentSpread = (tick.ask - tick.bid) / Point;

    // スプレッドが広すぎる場合はスキップ
    if(!IsSpreadOK())
    {
        Comment("スプレッド拡大中 (", DoubleToString(currentSpread, 1), " pips) — 取引スキップ");
        return;
    }

    Comment("スプレッド: ", DoubleToString(currentSpread, 1), " pips — 取引可能");
    // ここに取引ロジックを記述
}

プログラム例③:他の通貨ペアの価格を取得する

SymbolInfoTick()の強みは、チャートに表示していない通貨ペアの価格も取得できる点です。複数通貨を監視するEAに便利です。

// 主要通貨ペアのBid価格を一覧表示する
void ShowMultiCurrencyPrices()
{
    string symbols[] = {"USDJPY", "EURUSD", "GBPUSD", "AUDUSD"};

    string output = "=== 複数通貨ペアの現在価格 ===
";
    for(int i = 0; i < ArraySize(symbols); i++)
    {
        MqlTick tick;
        if(SymbolInfoTick(symbols[i], tick))
        {
            output += symbols[i] + "  Bid: " + DoubleToString(tick.bid, 5)
                    + "  Ask: " + DoubleToString(tick.ask, 5) + "
";
        }
    }
    Comment(output);
}

void OnTick()
{
    ShowMultiCurrencyPrices();
}

まとめ

  • MqlTickは現在のBid/Ask・ティック時刻・出来高などを格納する構造体
  • SymbolInfoTick()で取得し、戻り値(bool)で成功・失敗を確認する
  • スプレッドは(ask - bid) / Pointで計算できる
  • スプレッドフィルターはEAの安定稼働に欠かせないテクニック
  • チャートに表示していない通貨ペアの価格もSymbolInfoTick()で取得可能