<?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>Print関数 アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/print%E9%96%A2%E6%95%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/print関数/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 04:13:14 +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>Print関数 アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/print関数/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】デバッグに必須！Print・Alert・Comment・GetLastError・ResetLastErrorの使い方を徹底解説</title>
		<link>https://mql-programing.com/archives/13055/%e3%80%90mql4%e3%80%91%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%81%ab%e5%bf%85%e9%a0%88%ef%bc%81print%e3%83%bbalert%e3%83%bbcomment%e3%83%bbgetlasterror%e3%83%bbresetlasterror%e3%81%ae%e4%bd%bf%e3%81%84/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Mon, 20 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[GetLastError]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[デバッグ]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[Print関数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13055</guid>

					<description><![CDATA[<p>MQL4でEA（自動売買）やインジケーターを開発するとき、「思った通りに動かない」「どこでエラーが出ているかわからない」という場面は必ず訪れます。そんなときに頼りになるのがデバッグ用の関数たちです。 この記事では、MQL [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13055/%e3%80%90mql4%e3%80%91%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%81%ab%e5%bf%85%e9%a0%88%ef%bc%81print%e3%83%bbalert%e3%83%bbcomment%e3%83%bbgetlasterror%e3%83%bbresetlasterror%e3%81%ae%e4%bd%bf%e3%81%84/">【MQL4】デバッグに必須！Print・Alert・Comment・GetLastError・ResetLastErrorの使い方を徹底解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4でEA（自動売買）やインジケーターを開発するとき、「思った通りに動かない」「どこでエラーが出ているかわからない」という場面は必ず訪れます。そんなときに頼りになるのが<strong>デバッグ用の関数</strong>たちです。</p>
<p>この記事では、MQL4開発で必須となる以下の5つ（＋α）の関数について、基本的な使い方から実践的な注意点まで徹底的に解説します。</p>
<ul>
<li><strong>Print()</strong> — ログへの出力</li>
<li><strong>Comment()</strong> — チャート上への表示</li>
<li><strong>Alert()</strong> — ポップアップ通知</li>
<li><strong>GetLastError()</strong> — エラーコードの取得</li>
<li><strong>ResetLastError()</strong> — エラーコードのリセット</li>
</ul>
<h2><span id="toc1">Print関数 — エキスパートログへの出力</span></h2>
<h3><span id="toc2">基本的な使い方</span></h3>
<p><strong>Print関数</strong>は、MetaTraderの「エキスパート」タブ（ログ）にメッセージを出力する、最も基本的なデバッグ関数です。開発中に変数の値を確認したり、処理の流れを追跡したりするのに欠かせません。</p>
<pre><code class="language-mql4">void OnTick()
{
    double currentPrice = Ask;
    int spread = MarketInfo(Symbol(), MODE_SPREAD);

    Print("現在のAsk価格: ", currentPrice);
    Print("スプレッド: ", spread, " ポイント");
    Print("通貨ペア: ", Symbol(), " 時間足: ", Period());
}
</code></pre>
<p>Print関数はカンマ区切りで複数の値を渡すことができ、<strong>文字列・整数・小数点数</strong>などさまざまなデータ型を自動的に文字列に変換して出力してくれます。</p>
<h3><span id="toc3">データ型ごとの表示仕様</span></h3>
<p>Print関数で各データ型を出力するときの仕様を覚えておきましょう。</p>
<pre><code class="language-mql4">void OnInit()
{
    // 整数型：そのまま数値で表示
    int intValue = 12345;
    Print("int型: ", intValue);           // → int型: 12345

    // double型：小数点以下の桁数は自動調整
    double dblValue = 1.23456789;
    Print("double型: ", dblValue);        // → double型: 1.23456789

    // bool型：trueまたはfalseで表示
    bool boolValue = true;
    Print("bool型: ", boolValue);         // → bool型: true

    // datetime型：日時形式で表示
    datetime dtValue = TimeCurrent();
    Print("datetime型: ", dtValue);       // → datetime型: 2024.01.15 12:30:00
}
</code></pre>
<h3><span id="toc4">出力先について</span></h3>
<p>Print関数の出力先は2か所あります。</p>
<ul>
<li><strong>エキスパートタブ</strong>：MetaTrader画面下部の「エキスパート」タブにリアルタイム表示</li>
<li><strong>ログファイル</strong>：MQL4/Logs フォルダ内にテキストファイルとしても記録される</li>
</ul>
<p>ログファイルに残るため、後から問題を調査するときにも役立ちます。ただし、<strong>OnTick内で大量にPrintを呼ぶとパフォーマンスに影響する</strong>場合があるので、本番稼働時には不要なPrintは削除またはコメントアウトしましょう。</p>
<h2><span id="toc5">Comment関数 — チャート画面への表示</span></h2>
<h3><span id="toc6">基本的な使い方</span></h3>
<p><strong>Comment関数</strong>は、チャートの<strong>左上</strong>にテキストを表示する関数です。リアルタイムで変数の値を視覚的に確認したいときに便利です。</p>
<pre><code class="language-mql4">void OnTick()
{
    double bid = Bid;
    double ask = Ask;
    int spread = (int)((ask - bid) / Point);

    Comment("Bid: ", bid, "\n",
            "Ask: ", ask, "\n",
            "Spread: ", spread, " points\n",
            "Time: ", TimeToStr(TimeCurrent(), TIME_SECONDS));
}
</code></pre>
<p>改行するには<strong>「\n」</strong>を使います。これにより、複数行にわたる情報をきれいに表示できます。</p>
<h3><span id="toc7">Comment関数の重要な注意点</span></h3>
<p>Comment関数には大きな特徴（欠点）があります。<strong>最後に呼び出したComment関数の内容で上書きされる</strong>という点です。</p>
<pre><code class="language-mql4">void OnTick()
{
    Comment("1行目のメッセージ");
    Comment("2行目のメッセージ");  // ← これだけが表示される！
}
</code></pre>
<p>上記の場合、チャートには「2行目のメッセージ」しか表示されません。複数の情報を表示したい場合は、<strong>1回のComment呼び出しにすべての情報をまとめる</strong>必要があります。</p>
<p>また、Comment関数の表示をクリア（消去）したい場合は、空文字を渡します。</p>
<pre><code class="language-mql4">Comment("");  // チャート左上の表示をクリア
</code></pre>
<h2><span id="toc8">Alert関数 — ポップアップ通知</span></h2>
<h3><span id="toc9">基本的な使い方</span></h3>
<p><strong>Alert関数</strong>は、ポップアップダイアログを表示して、音とともにユーザーに通知する関数です。重要なイベント（エントリーシグナル発生、エラー検知など）の通知に使います。</p>
<pre><code class="language-mql4">void OnTick()
{
    static datetime lastAlertTime = 0;
    datetime currentTime = TimeCurrent();

    // RSIが30以下になったらアラート（同じ足で1回だけ）
    double rsi = iRSI(Symbol(), 0, 14, PRICE_CLOSE, 0);

    if(rsi < 30.0 &#038;&#038; lastAlertTime != iTime(Symbol(), 0, 0))
    {
        Alert(Symbol(), " RSIが30以下です！ RSI=", NormalizeDouble(rsi, 2));
        lastAlertTime = iTime(Symbol(), 0, 0);
    }
}
</code></pre>
<h3><span id="toc10">Alert関数の注意点</span></h3>
<p>Alert関数には以下の注意点があります。</p>
<ul>
<li><strong>バックテストでは動作しない</strong>：ストラテジーテスターでのバックテスト時にはAlertは表示されません。バックテスト中のデバッグにはPrint関数を使いましょう。</li>
<li><strong>日本語の一部が文字化けする場合がある</strong>：環境によっては日本語表示が正しくされないことがあります。重要な情報は英数字で出力するのが安全です。</li>
<li><strong>連続呼び出しに注意</strong>：OnTick内で条件なしにAlertを呼ぶと、ティックごとにポップアップが出て操作不能になります。必ず条件制御を入れましょう。</li>
</ul>
<h2><span id="toc11">GetLastError関数 — エラーコードの取得</span></h2>
<h3><span id="toc12">基本的な使い方</span></h3>
<p><strong>GetLastError関数</strong>は、直前の操作で発生したエラーのコード（番号）を取得する関数です。注文送信やファイル操作などの後にエラーチェックを行う際に使います。</p>
<pre><code class="language-mql4">void OnTick()
{
    int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Test", 0, 0, clrBlue);

    if(ticket < 0)
    {
        int errorCode = GetLastError();
        Print("注文エラー！ エラーコード: ", errorCode);
    }
    else
    {
        Print("注文成功！ チケット番号: ", ticket);
    }
}
</code></pre>
<h3><span id="toc13">よく見るエラーコード一覧</span></h3>
<p>以下は、MQL4開発でよく遭遇するエラーコードの一覧です。</p>
<table>
<thead>
<tr>
<th>エラーコード</th>
<th>定数名</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>ERR_NO_ERROR</td>
<td>エラーなし</td>
</tr>
<tr>
<td>1</td>
<td>ERR_NO_RESULT</td>
<td>エラーはないが結果が不明</td>
</tr>
<tr>
<td>2</td>
<td>ERR_COMMON_ERROR</td>
<td>一般的なエラー</td>
</tr>
<tr>
<td>6</td>
<td>ERR_NO_CONNECTION</td>
<td>サーバーとの接続がない</td>
</tr>
<tr>
<td>130</td>
<td>ERR_INVALID_STOPS</td>
<td>ストップが無効（SL/TPが近すぎる等）</td>
</tr>
<tr>
<td>131</td>
<td>ERR_INVALID_TRADE_VOLUME</td>
<td>取引量が無効</td>
</tr>
<tr>
<td>134</td>
<td>ERR_NOT_ENOUGH_MONEY</td>
<td>資金不足</td>
</tr>
<tr>
<td>138</td>
<td>ERR_REQUOTE</td>
<td>リクオート</td>
</tr>
<tr>
<td>146</td>
<td>ERR_TRADE_CONTEXT_BUSY</td>
<td>トレードコンテキストがビジー</td>
</tr>
<tr>
<td>4109</td>
<td>ERR_TRADE_NOT_ALLOWED</td>
<td>自動売買が許可されていない</td>
</tr>
</tbody>
</table>
<h3><span id="toc14">【超重要】GetLastErrorは2度呼ぶとリセットされる！</span></h3>
<p>GetLastError関数には<strong>非常に重要な仕様</strong>があります。<strong>一度呼び出すと、内部のエラーコードが0にリセットされてしまう</strong>のです。</p>
<pre><code class="language-mql4">// ★ ダメな例
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "", 0, 0, clrBlue);
if(ticket < 0)
{
    Print("エラーコード: ", GetLastError());   // ← 1回目：正しいエラーコードが取得できる
    Print("エラーコード: ", GetLastError());   // ← 2回目：0が返る！（リセット済み）
}
</code></pre>
<pre><code class="language-mql4">// ★ 正しい例：変数で受けてから使う
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "", 0, 0, clrBlue);
if(ticket < 0)
{
    int err = GetLastError();  // まず変数に格納！
    Print("エラーコード: ", err);
    Alert("注文失敗 エラー: ", err);  // 何度でも使える
}
</code></pre>
<p>これはMQL4開発でよくあるミスです。<strong>GetLastError()は必ず一度だけ呼び出して変数に保存</strong>してから使いましょう。</p>
<h2><span id="toc15">ResetLastError関数 — エラーコードのリセット</span></h2>
<p><strong>ResetLastError関数</strong>は、定義済み変数<strong>_LastError</strong>に格納されているエラーコードを<strong>0（エラーなし）にリセット</strong>するための関数です。</p>
<pre><code class="language-mql4">void OnTick()
{
    // エラーコードを事前にリセット
    ResetLastError();

    int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Test", 0, 0, clrBlue);

    if(ticket < 0)
    {
        int err = GetLastError();
        Print("注文エラー: ", err);
    }
}
</code></pre>
<h3><span id="toc16">なぜリセットが必要なのか？</span></h3>
<p>GetLastError()は「最後に発生したエラー」を返します。つまり、以前の処理で発生したエラーコードが残っている可能性があるのです。特定の処理のエラーだけを正確に検知したい場合は、<strong>処理の直前にResetLastError()を呼ぶのが定石</strong>です。</p>
<pre><code class="language-mql4">// 定石パターン：リセット → 処理 → エラーチェック
ResetLastError();           // ① リセット
bool result = OrderClose(ticket, lots, price, 3, clrRed);  // ② 処理実行
int err = GetLastError();   // ③ エラー取得（変数に格納）
if(err != 0)
{
    Print("決済エラー: ", err);
}
</code></pre>
<h2><span id="toc17">ErrorDescription関数 — エラーコードを文章に変換</span></h2>
<p>エラーコードの番号だけでは、何が起きたのかすぐにはわかりません。そこで便利なのが<strong>ErrorDescription関数</strong>です。この関数を使うと、エラーコードを人間が読める英語の文章に変換できます。</p>
<p>ただし、この関数はMQL4に標準で組み込まれているわけではなく、<strong>stdlib.mqh</strong>というライブラリファイルをインクルードする必要があります。</p>
<pre><code class="language-mql4">#include &lt;stdlib.mqh&gt;  // ErrorDescription関数を使うために必要

void OnTick()
{
    ResetLastError();

    int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Test", 0, 0, clrBlue);

    if(ticket < 0)
    {
        int err = GetLastError();
        Print("エラーコード: ", err, " 内容: ", ErrorDescription(err));
        // 例：エラーコード: 134 内容: not enough money
    }
}
</code></pre>
<p>エラーの原因がすぐにわかるため、デバッグの効率が格段に上がります。<strong>ぜひstdlib.mqhのインクルードを習慣にしましょう。</strong></p>
<h2><span id="toc18">実践例 — 5つの関数を組み合わせたデバッグ付きEA</span></h2>
<p>ここまで学んだ関数を組み合わせた、実践的なサンプルコードをご紹介します。</p>
<pre><code class="language-mql4">#include &lt;stdlib.mqh&gt;

input double LotSize = 0.1;
input int MagicNumber = 12345;

void OnTick()
{
    // 現在の状態をチャートに表示
    Comment("=== デバッグ情報 ===\n",
            "通貨ペア: ", Symbol(), "\n",
            "Bid: ", Bid, "  Ask: ", Ask, "\n",
            "スプレッド: ", MarketInfo(Symbol(), MODE_SPREAD), "\n",
            "保有ポジション: ", CountOrders(), "\n",
            "口座残高: ", AccountBalance(), "\n",
            "更新時刻: ", TimeToStr(TimeCurrent(), TIME_SECONDS));

    // 簡単な売買ロジック（例：移動平均のクロス）
    double maFast = iMA(Symbol(), 0, 10, 0, MODE_SMA, PRICE_CLOSE, 0);
    double maFastPrev = iMA(Symbol(), 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
    double maSlow = iMA(Symbol(), 0, 25, 0, MODE_SMA, PRICE_CLOSE, 0);
    double maSlowPrev = iMA(Symbol(), 0, 25, 0, MODE_SMA, PRICE_CLOSE, 1);

    // ゴールデンクロスで買い
    if(maFastPrev <= maSlowPrev &#038;&#038; maFast > maSlow && CountOrders() == 0)
    {
        Print("ゴールデンクロス検出！ 買い注文を送信します。");
        Print("MA(10)=", maFast, " MA(25)=", maSlow);

        ResetLastError();  // エラーをリセット
        int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, 0,
                               "MA Cross Buy", MagicNumber, 0, clrBlue);

        int err = GetLastError();  // 変数に格納（1回だけ呼ぶ！）

        if(ticket >= 0)
        {
            Print("注文成功！ チケット: ", ticket);
        }
        else
        {
            Print("注文失敗！ エラーコード: ", err,
                  " 内容: ", ErrorDescription(err));
            Alert("注文失敗！ Error: ", err, " ", ErrorDescription(err));
        }
    }
}

// 保有ポジション数をカウントする関数
int CountOrders()
{
    int count = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                count++;
        }
    }
    return count;
}
</code></pre>
<p>このサンプルでは、以下のようにデバッグ関数を使い分けています。</p>
<ul>
<li><strong>Comment</strong>：リアルタイムの状態監視（チャート上に常時表示）</li>
<li><strong>Print</strong>：処理の流れやシグナル検出の記録（ログに残る）</li>
<li><strong>Alert</strong>：注文失敗などの重要イベントの即時通知</li>
<li><strong>ResetLastError → GetLastError</strong>：正確なエラーコード取得の定石パターン</li>
<li><strong>ErrorDescription</strong>：エラー内容の可読化</li>
</ul>
<h2><span id="toc19">まとめ — デバッグ関数の使い分け</span></h2>
<p>最後に、各関数の特徴と使い分けを表で整理します。</p>
<table>
<thead>
<tr>
<th>関数名</th>
<th>出力先</th>
<th>主な用途</th>
<th>注意点</th>
</tr>
</thead>
<tbody>
<tr>
<td>Print()</td>
<td>エキスパートログ</td>
<td>変数の値確認、処理フロー追跡</td>
<td>大量出力でパフォーマンス低下</td>
</tr>
<tr>
<td>Comment()</td>
<td>チャート左上</td>
<td>リアルタイムの状態監視</td>
<td>最後の呼び出しで上書きされる</td>
</tr>
<tr>
<td>Alert()</td>
<td>ポップアップ</td>
<td>重要イベントの即時通知</td>
<td>バックテスト非対応・日本語文字化けの可能性</td>
</tr>
<tr>
<td>GetLastError()</td>
<td>—</td>
<td>エラーコード取得</td>
<td><strong>2度呼ぶとリセットされる</strong>（変数で受ける）</td>
</tr>
<tr>
<td>ResetLastError()</td>
<td>—</td>
<td>エラーコードの初期化</td>
<td>処理前にリセットするのが定石</td>
</tr>
</tbody>
</table>
<p>デバッグ関数を上手に使いこなすことは、MQL4開発の効率を大きく左右します。特に<strong>「GetLastErrorは変数で一度受けてから使う」</strong>と<strong>「処理前にResetLastErrorでリセットする」</strong>の2つは、ぜひ今日から実践してください。</p>
<p>デバッグの精度が上がれば、EA開発のスピードも自然と上がっていきますよ！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13055/%e3%80%90mql4%e3%80%91%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%81%ab%e5%bf%85%e9%a0%88%ef%bc%81print%e3%83%bbalert%e3%83%bbcomment%e3%83%bbgetlasterror%e3%83%bbresetlasterror%e3%81%ae%e4%bd%bf%e3%81%84/">【MQL4】デバッグに必須！Print・Alert・Comment・GetLastError・ResetLastErrorの使い方を徹底解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
