<?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>SymbolInfoDouble アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/symbolinfodouble/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/symbolinfodouble/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 05:10:52 +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>SymbolInfoDouble アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/symbolinfodouble/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】通貨ペア情報を取得する定数と関数を完全解説！ENUM_SYMBOL_INFO_INTEGER / ENUM_SYMBOL_INFO_DOUBLEの使い方</title>
		<link>https://mql-programing.com/archives/13086/%e3%80%90mql4%e3%80%91%e9%80%9a%e8%b2%a8%e3%83%9a%e3%82%a2%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e5%ae%9a%e6%95%b0%e3%81%a8%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[SymbolInfoDouble]]></category>
		<category><![CDATA[通貨ペア情報]]></category>
		<category><![CDATA[ENUM定数]]></category>
		<category><![CDATA[SymbolInfoInteger]]></category>
		<category><![CDATA[MQL4]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13086</guid>

					<description><![CDATA[<p>はじめに EA（自動売買）やカスタムインジケーターを作成するとき、「現在のスプレッドはいくつ？」「最小ロット数は？」「ストップレベルは？」など、通貨ペア（シンボル）のさまざまな情報をプログラムから取得したい場面がたくさん [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13086/%e3%80%90mql4%e3%80%91%e9%80%9a%e8%b2%a8%e3%83%9a%e3%82%a2%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e5%ae%9a%e6%95%b0%e3%81%a8%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8/">【MQL4】通貨ペア情報を取得する定数と関数を完全解説！ENUM_SYMBOL_INFO_INTEGER / ENUM_SYMBOL_INFO_DOUBLEの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>EA（自動売買）やカスタムインジケーターを作成するとき、「現在のスプレッドはいくつ？」「最小ロット数は？」「ストップレベルは？」など、<strong>通貨ペア（シンボル）のさまざまな情報</strong>をプログラムから取得したい場面がたくさんあります。</p>
<p>MQL4では、こうした通貨ペアの情報を取得するために<strong>SymbolInfoInteger関数</strong>と<strong>SymbolInfoDouble関数</strong>が用意されています。そして、それぞれの関数で「何の情報を取得するか」を指定するために使うのが、<strong>ENUM_SYMBOL_INFO_INTEGER</strong>と<strong>ENUM_SYMBOL_INFO_DOUBLE</strong>という列挙型（enum）の定数です。</p>
<p>この記事では、これらの定数と関数の使い方を、実践的なコードサンプルを交えてわかりやすく解説します。</p>
<h2><span id="toc2">SymbolInfoInteger関数とENUM_SYMBOL_INFO_INTEGERとは</span></h2>
<h3><span id="toc3">関数の基本構文</span></h3>
<p><code>SymbolInfoInteger</code>関数は、指定した通貨ペアの<strong>整数型（long型）のプロパティ情報</strong>を取得する関数です。2つの書き方があります。</p>
<pre><code class="language-mql5">// 書き方① 戻り値で直接値を受け取る
long SymbolInfoInteger(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_INTEGER prop_id       // 取得したいプロパティの識別子
);

// 書き方② 成功/失敗をboolで受け取り、値は第3引数に格納
bool SymbolInfoInteger(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_INTEGER prop_id,      // 取得したいプロパティの識別子
   long &amp; var                             // 値を受け取る変数
);</code></pre>
<p>書き方②では、関数の戻り値が<code>bool</code>（true/false）になり、取得に成功したかどうかを判定できます。エラーハンドリングを丁寧に行いたい場合はこちらがおすすめです。</p>
<h3><span id="toc4">よく使うENUM_SYMBOL_INFO_INTEGERの定数一覧</span></h3>
<p>以下に、EA開発で特によく使う定数をまとめました。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>用途の例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SYMBOL_DIGITS</code></td>
<td>価格の小数点以下の桁数</td>
<td>価格の正規化（NormalizeDouble）に使用</td>
</tr>
<tr>
<td><code>SYMBOL_SPREAD</code></td>
<td>現在のスプレッド（ポイント単位）</td>
<td>スプレッドフィルターの実装</td>
</tr>
<tr>
<td><code>SYMBOL_SPREAD_FLOAT</code></td>
<td>変動スプレッドかどうか（bool）</td>
<td>スプレッドの監視方法の判断</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_STOPS_LEVEL</code></td>
<td>ストップレベル（ポイント単位）</td>
<td>SL/TPの最小距離チェック</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_FREEZE_LEVEL</code></td>
<td>フリーズレベル（ポイント単位）</td>
<td>決済価格付近での注文変更制限</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_MODE</code></td>
<td>取引モード（売買が許可されているか等）</td>
<td>取引可能かどうかの判定</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_EXEMODE</code></td>
<td>注文執行モード</td>
<td>成行 / 即時 / マーケット執行の判定</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_MODE</code></td>
<td>スワップの計算方法</td>
<td>スワップ計算ロジックの分岐</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_ROLLOVER3DAYS</code></td>
<td>3日分のスワップが付く曜日</td>
<td>スワップ戦略の参考</td>
</tr>
<tr>
<td><code>SYMBOL_SELECT</code></td>
<td>気配値表示で選択されているか</td>
<td>マルチ通貨EAでのシンボル確認</td>
</tr>
<tr>
<td><code>SYMBOL_TIME</code></td>
<td>直近のサーバー時間（Tick受信時刻）</td>
<td>データの鮮度チェック</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">SymbolInfoIntegerの使用例</span></h3>
<p>SymbolInfoInteger関数では、SYMBOL_DIGITS で小数点以下の桁数、SYMBOL_SPREAD でスプレッド、SYMBOL_TRADE_STOPS_LEVEL でストップレベル、SYMBOL_TRADE_FREEZE_LEVEL でフリーズレベルなどの情報を取得できます。以下にコードサンプルを示します。</p>
<pre><code class="language-mql5">#property strict

void OnInit()
{
   string symbol = Symbol();

   // 小数点以下の桁数を取得
   int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   Print("小数点以下の桁数: ", digits);

   // 現在のスプレッドを取得
   int spread = (int)SymbolInfoInteger(symbol, SYMBOL_SPREAD);
   Print("スプレッド: ", spread, " ポイント");

   // ストップレベルを取得
   int stopLevel = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
   Print("ストップレベル: ", stopLevel, " ポイント");

   // フリーズレベルを取得
   int freezeLevel = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
   Print("フリーズレベル: ", freezeLevel, " ポイント");

   // 変動スプレッドかどうか
   bool isFloatSpread = (bool)SymbolInfoInteger(symbol, SYMBOL_SPREAD_FLOAT);
   Print("変動スプレッド: ", isFloatSpread ? "はい" : "いいえ");
}</code></pre>
<p><strong>ポイント：</strong><code>SymbolInfoInteger</code>の戻り値は<code>long</code>型なので、<code>int</code>や<code>bool</code>として使いたい場合は、上記のように<strong>キャスト（型変換）</strong>を行いましょう。ENUM_SYMBOL_TRADE_EXECUTIONなどの列挙型の返り値を受け取る場合は、返り値を対応する列挙型にキャスト（型変換）して変数に代入します。</p>
<h2><span id="toc6">SymbolInfoDouble関数とENUM_SYMBOL_INFO_DOUBLEとは</span></h2>
<h3><span id="toc7">関数の基本構文</span></h3>
<p>SymbolInfoDouble関数は、指定した通貨ペアに関するプロパティ情報(double型)を取得します。この関数で取得する通貨ペアのプロパティ情報の識別子は ENUM_SYMBOL_INFO_DOUBLE 列挙値から選択します。こちらも2つの書き方があります。</p>
<pre><code class="language-mql5">// 書き方① 戻り値で直接値を受け取る
double SymbolInfoDouble(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_DOUBLE prop_id        // 取得したいプロパティの識別子
);

// 書き方② 成功/失敗をboolで受け取り、値は第3引数に格納
bool SymbolInfoDouble(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_DOUBLE prop_id,       // 取得したいプロパティの識別子
   double &amp; var                           // 値を受け取る変数
);</code></pre>
<h3><span id="toc8">よく使うENUM_SYMBOL_INFO_DOUBLEの定数一覧</span></h3>
<p>ENUM_SYMBOL_INFO_DOUBLEには、SYMBOL_BID（Bid売値）、SYMBOL_ASK（Ask買値）、SYMBOL_LAST（直近の約定価格）などの価格情報のほか、各種取引条件の定数が含まれています。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>用途の例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SYMBOL_BID</code></td>
<td>現在のBid（売値）</td>
<td>売り注文の基準価格</td>
</tr>
<tr>
<td><code>SYMBOL_ASK</code></td>
<td>現在のAsk（買値）</td>
<td>買い注文の基準価格</td>
</tr>
<tr>
<td><code>SYMBOL_POINT</code></td>
<td>1ポイントの価格単位</td>
<td>SL/TPの距離計算</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_TICK_VALUE</code></td>
<td>1Tickの価値（口座通貨建て）</td>
<td>損益計算</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_TICK_SIZE</code></td>
<td>最小価格変動幅</td>
<td>価格の丸め処理</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_CONTRACT_SIZE</code></td>
<td>1ロットあたりの契約サイズ</td>
<td>ポジションサイズ計算</td>
</tr>
<tr>
<td><code>SYMBOL_VOLUME_MIN</code></td>
<td>最小取引ロット数</td>
<td>ロット数のバリデーション</td>
</tr>
<tr>
<td><code>SYMBOL_VOLUME_MAX</code></td>
<td>最大取引ロット数</td>
<td>ロット数のバリデーション</td>
</tr>
<tr>
<td><code>SYMBOL_VOLUME_STEP</code></td>
<td>ロット数の刻み幅</td>
<td>ロット数の正規化</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_LONG</code></td>
<td>買いスワップ</td>
<td>スワップの確認・計算</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_SHORT</code></td>
<td>売りスワップ</td>
<td>スワップの確認・計算</td>
</tr>
<tr>
<td><code>SYMBOL_MARGIN_INITIAL</code></td>
<td>初期証拠金</td>
<td>資金管理</td>
</tr>
</tbody>
</table>
<h3><span id="toc9">SymbolInfoDoubleの使用例</span></h3>
<pre><code class="language-mql5">#property strict

void OnInit()
{
   string symbol = Symbol();

   // Bid / Ask を取得
   double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
   double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
   Print("Bid: ", bid, " / Ask: ", ask);

   // ポイントサイズを取得
   double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
   Print("1ポイント: ", point);

   // ロット関連情報を取得
   double minLot  = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double maxLot  = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   Print("最小ロット: ", minLot, " / 最大ロット: ", maxLot, " / 刻み: ", lotStep);

   // スワップ情報を取得
   double swapLong  = SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG);
   double swapShort = SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT);
   Print("買いスワップ: ", swapLong, " / 売りスワップ: ", swapShort);
}</code></pre>
<h2><span id="toc10">MarketInfo関数との違い ― なぜSymbolInfoXXXを使うべきか</span></h2>
<p>MQL4には、古くから<code>MarketInfo()</code>関数が存在し、通貨ペアの情報を取得できました。しかし、<code>SymbolInfoInteger</code> / <code>SymbolInfoDouble</code>を使うことをおすすめします。その理由は以下の通りです。</p>
<ul>
<li><strong>型の正確性：</strong>MarketInfo()はすべての値をdouble型で返しますが、SymbolInfoIntegerはlong型を返すため、整数値の精度が保たれ、型チェックが正確になります。</li>
<li><strong>MQL5との互換性：</strong>MT4とMT5の両方で動作するコードを書きたい場合は、SymbolInfoDouble()を使うほうがよいとされています。MQL4ではMarketInfo関数でも同様にポイントサイズを取得できますが、MQL4/5共通でSymbolInfoDouble関数が使えるので、そちらを使っておけばよいでしょう。</li>
<li><strong>エラーハンドリング：</strong>書き方②（bool戻り値版）を使えば、情報が取得できなかった場合を明確に判定できます。</li>
</ul>
<pre><code class="language-mql5">// &#x274c; 古い書き方（MarketInfo）
double spread = MarketInfo(Symbol(), MODE_SPREAD);
double point  = MarketInfo(Symbol(), MODE_POINT);

// &#x2705; 新しい書き方（SymbolInfoXXX）※推奨
int    spread = (int)SymbolInfoInteger(Symbol(), SYMBOL_SPREAD);
double point  = SymbolInfoDouble(Symbol(), SYMBOL_POINT);</code></pre>
<h2><span id="toc11">【実践】通貨ペア情報を一括表示するサンプルEA</span></h2>
<p>最後に、ここまで学んだ内容を活用して、チャートに適用した通貨ペアの主要情報をログに一括出力するサンプルEAを紹介します。</p>
<pre><code class="language-mql5">//+------------------------------------------------------------------+
//| SymbolInfoViewer.mq4                                             |
//| 通貨ペアの主要情報を一括表示するサンプルEA                         |
//+------------------------------------------------------------------+
#property strict

void OnInit()
{
   string sym = Symbol();

   Print("=== ", sym, " の通貨ペア情報 ===");

   // --- Integer型の情報 ---
   Print("小数桁数 (Digits): ",
         (int)SymbolInfoInteger(sym, SYMBOL_DIGITS));

   Print("スプレッド: ",
         (int)SymbolInfoInteger(sym, SYMBOL_SPREAD), " point");

   Print("変動スプレッド: ",
         (bool)SymbolInfoInteger(sym, SYMBOL_SPREAD_FLOAT));

   Print("ストップレベル: ",
         (int)SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL), " point");

   Print("フリーズレベル: ",
         (int)SymbolInfoInteger(sym, SYMBOL_TRADE_FREEZE_LEVEL), " point");

   // 取引実行モードの取得（列挙型へのキャスト）
   ENUM_SYMBOL_TRADE_EXECUTION exeMode
      = (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(sym, SYMBOL_TRADE_EXEMODE);
   Print("取引執行モード: ", EnumToString(exeMode));

   // --- Double型の情報 ---
   Print("Bid: ", SymbolInfoDouble(sym, SYMBOL_BID));
   Print("Ask: ", SymbolInfoDouble(sym, SYMBOL_ASK));
   Print("Point: ", SymbolInfoDouble(sym, SYMBOL_POINT));

   Print("最小ロット: ", SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN));
   Print("最大ロット: ", SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX));
   Print("ロット刻み: ", SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP));
   Print("契約サイズ: ", SymbolInfoDouble(sym, SYMBOL_TRADE_CONTRACT_SIZE));

   Print("TickValue: ", SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE));
   Print("TickSize: ",  SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE));

   Print("買いスワップ: ", SymbolInfoDouble(sym, SYMBOL_SWAP_LONG));
   Print("売りスワップ: ", SymbolInfoDouble(sym, SYMBOL_SWAP_SHORT));

   Print("=== 情報取得完了 ===");
}</code></pre>
<p>このEAをチャートにセットすると、「エキスパート」タブにその通貨ペアの主要な情報が一覧で出力されます。自分のブローカーの設定値を確認したり、EA開発時のデバッグに非常に便利です。</p>
<h2><span id="toc12">注意点とTips</span></h2>
<ul>
<li><strong>気配値表示ウィンドウに注意：</strong>ストラテジーテスターの中ではSymbolInfoやMarketInfoが取得できない時があり、気配値表示ウィンドウに表示されていない通貨ペアでは値が0.0になることがあります。マルチ通貨EAを作る場合は、対象通貨ペアが気配値表示に含まれているか事前に確認しましょう。</li>
<li><strong>ストップレベルが0の場合：</strong>一部のブローカーではストップレベルが0に設定されています。この場合、SL/TPの距離制限がないという意味ではなく、スプレッド分は最低限必要になることが多いため、実際のテストで確認しましょう。</li>
<li><strong>EnumToString関数の活用：</strong>ENUM_SYMBOL_TRADE_EXECUTION型などの列挙型を受け取る場合は、SymbolInfoIntegerの返り値を対応する列挙型にキャストして変数に代入します。<code>EnumToString()</code>を使うと定数名が文字列で返されるのでデバッグに便利です。</li>
</ul>
<h2><span id="toc13">まとめ</span></h2>
<p>今回は、MQL4で通貨ペア情報を取得するための<strong>ENUM_SYMBOL_INFO_INTEGER</strong>と<strong>ENUM_SYMBOL_INFO_DOUBLE</strong>の定数、そして<strong>SymbolInfoInteger関数</strong>と<strong>SymbolInfoDouble関数</strong>の使い方を解説しました。</p>
<p>ポイントを整理すると：</p>
<ul>
<li><strong>整数型の情報</strong>（桁数、スプレッド、ストップレベルなど）→ <code>SymbolInfoInteger()</code></li>
<li><strong>小数型の情報</strong>（価格、ポイント、ロット数、スワップなど）→ <code>SymbolInfoDouble()</code></li>
<li>古い<code>MarketInfo()</code>より型安全でMQL5互換の<code>SymbolInfoXXX</code>を使おう</li>
<li>bool戻り値版を使えば、エラーハンドリングもしっかり行える</li>
</ul>
<p>通貨ペアの情報を正確に取得できるようになると、ロット計算やSL/TP設定、スプレッドフィルターなど、EA開発のあらゆる場面で役立ちます。ぜひ今回のサンプルコードを実際に動かして、自分のブローカーの値を確認してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13086/%e3%80%90mql4%e3%80%91%e9%80%9a%e8%b2%a8%e3%83%9a%e3%82%a2%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e5%ae%9a%e6%95%b0%e3%81%a8%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8/">【MQL4】通貨ペア情報を取得する定数と関数を完全解説！ENUM_SYMBOL_INFO_INTEGER / ENUM_SYMBOL_INFO_DOUBLEの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<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>
