この記事では、MQL4のMqlTick構造体について詳しく解説します。SymbolInfoTick()関数と組み合わせることで、現在のBid/Ask価格やスプレッドをリアルタイムで取得できます。
MqlTick構造体とは?
MqlTickは、ティック(価格変動)の最新情報を格納するための構造体です。BidとAsk価格を同時に取得できるため、スプレッドの計算やエントリー価格の判定に使います。
通常のBid・Ask変数と違い、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 | 実際の出来高(取引所通貨ペアのみ) |
構造体の図解
SymbolInfoTick()の使い方
SymbolInfoTick()は指定した通貨ペアの最新ティック情報をMqlTickに取得する関数です。
bool SymbolInfoTick(
string symbol, // 通貨ペア(例: "USDJPY")
MqlTick &tick // 取得先のMqlTick変数
);
戻り値がfalseの場合は取得失敗です。GetLastError()でエラー内容を確認できます。
Bid/Ask変数との違いに注意
グローバル変数Bid・Askは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()で取得可能

