<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>市場情報関数 アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/%e5%b8%82%e5%a0%b4%e6%83%85%e5%a0%b1%e9%96%a2%e6%95%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/市場情報関数/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 04:24:15 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>市場情報関数 アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/市場情報関数/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】市場情報を取得する関数を完全解説！MarketInfo・SymbolInfoDouble・SymbolInfoInteger・SymbolInfoStringの使い方</title>
		<link>https://mql-programing.com/archives/13062/%e3%80%90mql4%e3%80%91%e5%b8%82%e5%a0%b4%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81marketinfo%e3%83%bbsymbol/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[MarketInfo]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[SymbolInfoDouble]]></category>
		<category><![CDATA[市場情報関数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13062</guid>

					<description><![CDATA[<p>EA（自動売買）を開発するとき、「現在のスプレッドはいくつ？」「このブローカーのストップレベルは？」「1pipあたりの価値は？」といった市場情報の取得は欠かせません。MQL4には、これらの情報を取得するための関数がいくつ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13062/%e3%80%90mql4%e3%80%91%e5%b8%82%e5%a0%b4%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81marketinfo%e3%83%bbsymbol/">【MQL4】市場情報を取得する関数を完全解説！MarketInfo・SymbolInfoDouble・SymbolInfoInteger・SymbolInfoStringの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>EA（自動売買）を開発するとき、「現在のスプレッドはいくつ？」「このブローカーのストップレベルは？」「1pipあたりの価値は？」といった市場情報の取得は欠かせません。MQL4には、これらの情報を取得するための関数がいくつか用意されています。</p>
<p>この記事では、<strong>MarketInfo関数</strong>と、より新しい<strong>SymbolInfoDouble・SymbolInfoInteger・SymbolInfoString関数</strong>の使い方を、実践的なコード例とともに徹底解説します。</p>
<h2><span id="toc1">MarketInfo関数 ― MQL4の基本</span></h2>
<p>MarketInfo関数は、気配値表示ウィンドウに表示されている通貨ペアのマーケット情報を取得するための、MQL4で最も古くから使われている関数です。</p>
<h3><span id="toc2">基本構文</span></h3>
<pre><code class="language-mql4">double MarketInfo(string symbol, int type);
</code></pre>
<p>第1引数に通貨ペア名（例：&#8221;USDJPY&#8221;）、第2引数にMODE定数を指定します。戻り値はすべてdouble型です。</p>
<h3><span id="toc3">主なMODE定数一覧</span></h3>
<table>
<thead>
<tr>
<th>MODE定数</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_BID</td>
<td>9</td>
<td>現在のBid価格</td>
</tr>
<tr>
<td>MODE_ASK</td>
<td>10</td>
<td>現在のAsk価格</td>
</tr>
<tr>
<td>MODE_POINT</td>
<td>11</td>
<td>1ポイントの値（例：0.00001）</td>
</tr>
<tr>
<td>MODE_DIGITS</td>
<td>12</td>
<td>小数点以下の桁数</td>
</tr>
<tr>
<td>MODE_SPREAD</td>
<td>13</td>
<td>スプレッド（ポイント単位）</td>
</tr>
<tr>
<td>MODE_STOPLEVEL</td>
<td>14</td>
<td>ストップレベル（ポイント単位）</td>
</tr>
<tr>
<td>MODE_LOTSIZE</td>
<td>15</td>
<td>1ロットあたりの契約サイズ</td>
</tr>
<tr>
<td>MODE_TICKVALUE</td>
<td>16</td>
<td>1ティックあたりの価値（口座通貨建て）</td>
</tr>
<tr>
<td>MODE_TICKSIZE</td>
<td>17</td>
<td>1ティックのサイズ</td>
</tr>
<tr>
<td>MODE_SWAPLONG</td>
<td>18</td>
<td>ロングポジションのスワップ</td>
</tr>
<tr>
<td>MODE_SWAPSHORT</td>
<td>19</td>
<td>ショートポジションのスワップ</td>
</tr>
<tr>
<td>MODE_MINLOT</td>
<td>24</td>
<td>最小ロット数</td>
</tr>
<tr>
<td>MODE_LOTSTEP</td>
<td>25</td>
<td>ロットのステップ</td>
</tr>
<tr>
<td>MODE_MAXLOT</td>
<td>26</td>
<td>最大ロット数</td>
</tr>
<tr>
<td>MODE_MARGININIT</td>
<td>28</td>
<td>初期証拠金</td>
</tr>
<tr>
<td>MODE_MARGINREQUIRED</td>
<td>31</td>
<td>1ロットあたりの必要証拠金</td>
</tr>
<tr>
<td>MODE_FREEZELEVEL</td>
<td>33</td>
<td>フリーズレベル（ポイント単位）</td>
</tr>
</tbody>
</table>
<h3><span id="toc4">基本的な使用例</span></h3>
<pre><code class="language-mql4">void OnStart()
{
    string sym = Symbol(); // 現在のチャートの通貨ペア

    double bid       = MarketInfo(sym, MODE_BID);
    double ask       = MarketInfo(sym, MODE_ASK);
    double spread    = MarketInfo(sym, MODE_SPREAD);
    double stopLevel = MarketInfo(sym, MODE_STOPLEVEL);
    double tickValue = MarketInfo(sym, MODE_TICKVALUE);
    double minLot    = MarketInfo(sym, MODE_MINLOT);

    PrintFormat("Bid=%.5f  Ask=%.5f  Spread=%.0f  StopLevel=%.0f",
                bid, ask, spread, stopLevel);
    PrintFormat("TickValue=%.5f  MinLot=%.2f", tickValue, minLot);
}
</code></pre>
<p>MarketInfo関数はシンプルで使いやすいですが、戻り値がすべてdouble型のため、本来は整数値であるスプレッドや桁数もdoubleで返ってきます。キャストが必要になる場面がある点は覚えておきましょう。</p>
<h2><span id="toc5">SymbolInfo系関数 ― より型安全な新しい方法</span></h2>
<p>MQL4のビルド600以降では、MarketInfoの代替として<strong>SymbolInfo系関数</strong>が使えるようになりました。これらはMQL5と共通の関数であり、将来的なMQL5移行を見据えるなら、こちらを使うのがおすすめです。</p>
<p>SymbolInfo系関数は、取得するデータの型に応じて3つに分かれています。</p>
<table>
<thead>
<tr>
<th>関数名</th>
<th>戻り値の型</th>
<th>主な用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>SymbolInfoDouble</td>
<td>double</td>
<td>価格、スワップ、ロット情報など</td>
</tr>
<tr>
<td>SymbolInfoInteger</td>
<td>long（整数）</td>
<td>スプレッド、桁数、ストップレベルなど</td>
</tr>
<tr>
<td>SymbolInfoString</td>
<td>string</td>
<td>通貨名、シンボル説明など</td>
</tr>
</tbody>
</table>
<h2><span id="toc6">SymbolInfoDouble ― double型の市場情報を取得</span></h2>
<p>SymbolInfoDoubleには2つの書式があります。</p>
<h3><span id="toc7">書式1：戻り値で直接受け取る</span></h3>
<pre><code class="language-mql4">double SymbolInfoDouble(string symbol, ENUM_SYMBOL_INFO_DOUBLE prop_id);
</code></pre>
<h3><span id="toc8">書式2：参照引数で受け取る（成否判定付き）</span></h3>
<pre><code class="language-mql4">bool SymbolInfoDouble(string symbol, ENUM_SYMBOL_INFO_DOUBLE prop_id, double &amp;value);
</code></pre>
<p>書式2はboolを返すため、取得が成功したかどうかを判定できます。安全なコードを書きたい場合はこちらを推奨します。</p>
<h3><span id="toc9">主なプロパティID</span></h3>
<table>
<thead>
<tr>
<th>プロパティID</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>SYMBOL_BID</td>
<td>現在のBid価格</td>
</tr>
<tr>
<td>SYMBOL_ASK</td>
<td>現在のAsk価格</td>
</tr>
<tr>
<td>SYMBOL_POINT</td>
<td>1ポイントの値</td>
</tr>
<tr>
<td>SYMBOL_TRADE_TICK_VALUE</td>
<td>1ティックの価値</td>
</tr>
<tr>
<td>SYMBOL_TRADE_TICK_SIZE</td>
<td>1ティックのサイズ</td>
</tr>
<tr>
<td>SYMBOL_TRADE_CONTRACT_SIZE</td>
<td>契約サイズ</td>
</tr>
<tr>
<td>SYMBOL_VOLUME_MIN</td>
<td>最小ロット</td>
</tr>
<tr>
<td>SYMBOL_VOLUME_MAX</td>
<td>最大ロット</td>
</tr>
<tr>
<td>SYMBOL_VOLUME_STEP</td>
<td>ロットステップ</td>
</tr>
<tr>
<td>SYMBOL_SWAP_LONG</td>
<td>ロングスワップ</td>
</tr>
<tr>
<td>SYMBOL_SWAP_SHORT</td>
<td>ショートスワップ</td>
</tr>
<tr>
<td>SYMBOL_MARGIN_INITIAL</td>
<td>初期証拠金</td>
</tr>
</tbody>
</table>
<h3><span id="toc10">コード例</span></h3>
<pre><code class="language-mql4">void OnStart()
{
    string sym = Symbol();

    // 書式1：直接取得
    double bid = SymbolInfoDouble(sym, SYMBOL_BID);
    double ask = SymbolInfoDouble(sym, SYMBOL_ASK);
    PrintFormat("Bid=%.5f  Ask=%.5f", bid, ask);

    // 書式2：成否判定付き
    double tickValue;
    if(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE, tickValue))
        PrintFormat("TickValue = %.5f", tickValue);
    else
        Print("TickValue の取得に失敗しました");
}
</code></pre>
<h2><span id="toc11">SymbolInfoInteger ― 整数型の市場情報を取得</span></h2>
<p>スプレッドや桁数など、整数で扱うべき情報を<strong>long型</strong>で返します。MarketInfoではdoubleで返っていたものが正しい型で取得できるようになりました。</p>
<h3><span id="toc12">主なプロパティID</span></h3>
<table>
<thead>
<tr>
<th>プロパティID</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>SYMBOL_SPREAD</td>
<td>スプレッド（ポイント単位）</td>
</tr>
<tr>
<td>SYMBOL_DIGITS</td>
<td>小数点以下の桁数</td>
</tr>
<tr>
<td>SYMBOL_TRADE_STOPS_LEVEL</td>
<td>ストップレベル（ポイント単位）</td>
</tr>
<tr>
<td>SYMBOL_TRADE_FREEZE_LEVEL</td>
<td>フリーズレベル（ポイント単位）</td>
</tr>
<tr>
<td>SYMBOL_TRADE_EXEMODE</td>
<td>約定方式</td>
</tr>
<tr>
<td>SYMBOL_TIME</td>
<td>最終ティックの時刻</td>
</tr>
</tbody>
</table>
<pre><code class="language-mql4">void OnStart()
{
    string sym = Symbol();

    long spread    = SymbolInfoInteger(sym, SYMBOL_SPREAD);
    long digits    = SymbolInfoInteger(sym, SYMBOL_DIGITS);
    long stopLevel = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL);

    PrintFormat("Spread=%d  Digits=%d  StopLevel=%d",
                (int)spread, (int)digits, (int)stopLevel);
}
</code></pre>
<h2><span id="toc13">SymbolInfoString ― 文字列型の市場情報を取得</span></h2>
<p>通貨ペアの基軸通貨や決済通貨、説明文などの文字列情報を取得します。</p>
<table>
<thead>
<tr>
<th>プロパティID</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>SYMBOL_CURRENCY_BASE</td>
<td>基軸通貨（例：&#8221;USD&#8221;）</td>
</tr>
<tr>
<td>SYMBOL_CURRENCY_PROFIT</td>
<td>決済通貨（例：&#8221;JPY&#8221;）</td>
</tr>
<tr>
<td>SYMBOL_CURRENCY_MARGIN</td>
<td>証拠金通貨</td>
</tr>
<tr>
<td>SYMBOL_DESCRIPTION</td>
<td>シンボルの説明文</td>
</tr>
<tr>
<td>SYMBOL_PATH</td>
<td>シンボルツリー内のパス</td>
</tr>
</tbody>
</table>
<pre><code class="language-mql4">void OnStart()
{
    string sym = Symbol();

    string baseCurrency   = SymbolInfoString(sym, SYMBOL_CURRENCY_BASE);
    string profitCurrency = SymbolInfoString(sym, SYMBOL_CURRENCY_PROFIT);
    string description    = SymbolInfoString(sym, SYMBOL_DESCRIPTION);

    PrintFormat("基軸通貨=%s  決済通貨=%s", baseCurrency, profitCurrency);
    PrintFormat("説明: %s", description);
}
</code></pre>
<h2><span id="toc14">MarketInfo と SymbolInfo系の対応関係</span></h2>
<p>既存のコードをSymbolInfo系に書き換えたいときは、以下の対応表を参考にしてください。</p>
<table>
<thead>
<tr>
<th>MarketInfo (MODE定数)</th>
<th>SymbolInfo系 (プロパティID)</th>
<th>関数</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_BID</td>
<td>SYMBOL_BID</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_ASK</td>
<td>SYMBOL_ASK</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_POINT</td>
<td>SYMBOL_POINT</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_DIGITS</td>
<td>SYMBOL_DIGITS</td>
<td>SymbolInfoInteger</td>
</tr>
<tr>
<td>MODE_SPREAD</td>
<td>SYMBOL_SPREAD</td>
<td>SymbolInfoInteger</td>
</tr>
<tr>
<td>MODE_STOPLEVEL</td>
<td>SYMBOL_TRADE_STOPS_LEVEL</td>
<td>SymbolInfoInteger</td>
</tr>
<tr>
<td>MODE_TICKVALUE</td>
<td>SYMBOL_TRADE_TICK_VALUE</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_MINLOT</td>
<td>SYMBOL_VOLUME_MIN</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_LOTSTEP</td>
<td>SYMBOL_VOLUME_STEP</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_MAXLOT</td>
<td>SYMBOL_VOLUME_MAX</td>
<td>SymbolInfoDouble</td>
</tr>
<tr>
<td>MODE_FREEZELEVEL</td>
<td>SYMBOL_TRADE_FREEZE_LEVEL</td>
<td>SymbolInfoInteger</td>
</tr>
</tbody>
</table>
<h2><span id="toc15">実践テクニック</span></h2>
<h3><span id="toc16">①スプレッドフィルター</span></h3>
<p>スプレッドが広がっているときにエントリーを避ける、シンプルなフィルターです。</p>
<pre><code class="language-mql4">// スプレッドが指定pips以上なら取引しない
bool IsSpreadOK(int maxSpreadPoints)
{
    long spread = SymbolInfoInteger(Symbol(), SYMBOL_SPREAD);
    if(spread > maxSpreadPoints)
    {
        PrintFormat("スプレッドが広すぎます: %d > %d", (int)spread, maxSpreadPoints);
        return false;
    }
    return true;
}
</code></pre>
<h3><span id="toc17">②ストップレベルを考慮したSL/TP設定</span></h3>
<p>ブローカーによってはストップレベルが設定されており、現在価格から一定以上離れていないとSL/TPを設定できません。また、<strong>ストップレベルが0を返す場合でも実際にはサーバー側で制限がかかるケース</strong>があるため、最低限のマージンを確保するのがポイントです。</p>
<pre><code class="language-mql4">double GetSafeStopDistance()
{
    long   stopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL);
    double point     = SymbolInfoDouble(Symbol(), SYMBOL_POINT);

    // ストップレベルが0の場合でも最低10ポイントは確保
    if(stopLevel < 10)
        stopLevel = 10;

    return stopLevel * point;
}

// 使用例：Buy注文のSL/TPを安全に設定
double safeDistance = GetSafeStopDistance();
double sl = Ask - MathMax(desiredSL, safeDistance);
double tp = Ask + MathMax(desiredTP, safeDistance);
</code></pre>
<h3><span id="toc18">③リスクベースのロット計算</span></h3>
<p>口座残高の一定割合をリスクとして、適切なロット数を計算する関数です。</p>
<pre><code class="language-mql4">double CalcLotSize(double riskPercent, double slPoints)
{
    string sym = Symbol();

    double balance   = AccountBalance();
    double riskMoney = balance * riskPercent / 100.0;

    double tickValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE);
    double tickSize  = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
    double point     = SymbolInfoDouble(sym, SYMBOL_POINT);
    double minLot    = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN);
    double maxLot    = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX);
    double lotStep   = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);

    if(tickValue == 0 || tickSize == 0) return minLot;

    // 1ポイントあたりの価値
    double pointValue = tickValue * (point / tickSize);

    // ロット計算
    double lots = riskMoney / (slPoints * pointValue);

    // ロットステップに丸める
    lots = MathFloor(lots / lotStep) * lotStep;

    // 最小・最大ロットでクランプ
    lots = MathMax(lots, minLot);
    lots = MathMin(lots, maxLot);

    return NormalizeDouble(lots, 2);
}
</code></pre>
<h2><span id="toc19">ストラテジーテスターでの注意点</span></h2>
<p>ストラテジーテスター（バックテスト）では、市場情報の取得に制限があります。</p>
<ul>
<li><strong>他の通貨ペアの情報</strong>：テスト対象以外の通貨ペアのMarketInfoやSymbolInfoは、正しい値が返らないことがあります</li>
<li><strong>TickValueが0になる</strong>：テスト開始直後やクロス通貨ペアで、SYMBOL_TRADE_TICK_VALUEが0を返す場合があります</li>
<li><strong>対処法</strong>：TickValueが0の場合はデフォルト値を使う、またはOnTick()内で値が有効になるまで待つ処理を入れましょう</li>
</ul>
<pre><code class="language-mql4">// テスター対策：TickValueが0なら処理をスキップ
void OnTick()
{
    double tickValue = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);
    if(tickValue <= 0)
    {
        Print("TickValueが無効です。次のティックを待ちます。");
        return;
    }

    // 通常のEAロジック
    // ...
}
</code></pre>
<h2><span id="toc20">まとめ</span></h2>
<p>最後に、この記事のポイントを整理します。</p>
<ol>
<li><strong>MarketInfo関数</strong>はMQL4の基本関数で、MODE定数を使って様々な市場情報をdouble型で取得できる</li>
<li><strong>SymbolInfo系関数</strong>（Double/Integer/String）はデータ型に応じた3つの関数に分かれており、型安全に情報を取得できる</li>
<li><strong>MQL5への移行</strong>を見据えるなら、SymbolInfo系関数を使う習慣をつけるのがおすすめ</li>
<li><strong>ストップレベル</strong>は0を返す場合でも最低限のマージンを確保すると安全</li>
<li><strong>TickValue</strong>を使ったロット計算は実践的なEAに不可欠</li>
<li><strong>ストラテジーテスター</strong>では他通貨ペア情報やTickValueが正しく取得できない場合があるため、ガード処理を入れておくことが大切</li>
</ol>
<p>これらの関数を使いこなせるようになると、ブローカーの取引条件に応じた柔軟なEAが作れるようになります。ぜひ実際にコードを書いて、各関数の返り値を確認してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13062/%e3%80%90mql4%e3%80%91%e5%b8%82%e5%a0%b4%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81marketinfo%e3%83%bbsymbol/">【MQL4】市場情報を取得する関数を完全解説！MarketInfo・SymbolInfoDouble・SymbolInfoInteger・SymbolInfoStringの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
