<?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/%e3%83%a6%e3%83%bc%e3%83%86%e3%82%a3%e3%83%aa%e3%83%86%e3%82%a3%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:29:28 +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】知っておきたいユーティリティ関数6選！Sleep・RefreshRates・IsTradeAllowed・IsConnected・IsTesting・IsOptimizationの使い方</title>
		<link>https://mql-programing.com/archives/13065/%e3%80%90mql4%e3%80%91%e7%9f%a5%e3%81%a3%e3%81%a6%e3%81%8a%e3%81%8d%e3%81%9f%e3%81%84%e3%83%a6%e3%83%bc%e3%83%86%e3%82%a3%e3%83%aa%e3%83%86%e3%82%a3%e9%96%a2%e6%95%b06%e9%81%b8%ef%bc%81sleep%e3%83%bbr/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[バックテスト]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[ユーティリティ関数]]></category>
		<category><![CDATA[Sleep]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13065</guid>

					<description><![CDATA[<p>EA（自動売買プログラム）を作っていると、「注文を出す前にサーバーと接続できているか確認したい」「バックテスト中は処理を軽くしたい」といった場面に必ず出くわします。こうした場面で活躍するのが、MQL4に用意されたユーティ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13065/%e3%80%90mql4%e3%80%91%e7%9f%a5%e3%81%a3%e3%81%a6%e3%81%8a%e3%81%8d%e3%81%9f%e3%81%84%e3%83%a6%e3%83%bc%e3%83%86%e3%82%a3%e3%83%aa%e3%83%86%e3%82%a3%e9%96%a2%e6%95%b06%e9%81%b8%ef%bc%81sleep%e3%83%bbr/">【MQL4】知っておきたいユーティリティ関数6選！Sleep・RefreshRates・IsTradeAllowed・IsConnected・IsTesting・IsOptimizationの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>EA（自動売買プログラム）を作っていると、「注文を出す前にサーバーと接続できているか確認したい」「バックテスト中は処理を軽くしたい」といった場面に必ず出くわします。こうした場面で活躍するのが、MQL4に用意された<strong>ユーティリティ関数</strong>たちです。</p>
<p>今回は、EA開発で特に使用頻度が高い以下の<strong>6つのユーティリティ関数</strong>をまとめて解説します。</p>
<ul>
<li><strong>Sleep()</strong> — 処理の一時停止</li>
<li><strong>RefreshRates()</strong> — 価格データの最新化</li>
<li><strong>IsTradeAllowed()</strong> — 自動売買の許可状態を確認</li>
<li><strong>IsConnected()</strong> — サーバー接続の確認</li>
<li><strong>IsTesting()</strong> — バックテスト中かどうかの判定</li>
<li><strong>IsOptimization()</strong> — 最適化モードかどうかの判定</li>
</ul>
<p>それぞれの基本的な使い方から、最後に6つすべてを組み合わせた実践テンプレートまで紹介しますので、ぜひ最後までお読みください。</p>
<h2><span id="toc1">Sleep() — ミリ秒単位で処理を一時停止する</span></h2>
<h3><span id="toc2">基本構文</span></h3>
<pre><code class="language-mql4">void Sleep(int milliseconds);
</code></pre>
<p><strong>Sleep()</strong>は、指定したミリ秒（1000ミリ秒＝1秒）だけEAの処理を一時停止する関数です。注文のリトライ処理やサーバーとの通信待ちなどで頻繁に使われます。</p>
<h3><span id="toc3">使用例：注文失敗時のリトライ</span></h3>
<p>注文送信が失敗した場合、少し間をおいてからリトライするのが一般的なパターンです。</p>
<pre><code class="language-mql4">int ticket = -1;
int retryCount = 3;

for(int i = 0; i < retryCount; i++)
{
    ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Buy Order", 0, 0, clrBlue);

    if(ticket > 0)
    {
        Print("注文成功！ チケット番号: ", ticket);
        break;
    }
    else
    {
        int err = GetLastError();
        Print("注文失敗（", i + 1, "回目） エラー: ", err);
        Sleep(1000);  // 1秒待ってからリトライ
    }
}
</code></pre>
<h3><span id="toc4">Sleep()の注意点</span></h3>
<ul>
<li><strong>ストラテジーテスターでは無視されます。</strong>バックテスト中にSleep()を呼んでも、実際には一時停止しません。テスト速度に影響を与えないための仕様です。</li>
<li>Sleep()の内部では<strong>約0.1秒ごと</strong>にEAの停止フラグがチェックされています。そのため、Sleep(10000)（10秒停止）を実行中でも、ユーザーがEAを停止すれば比較的すぐに処理が終了します。</li>
<li>カスタムインジケーターの中では使用できません。EAおよびスクリプト専用の関数です。</li>
</ul>
<h2><span id="toc5">RefreshRates() — 価格データを最新の状態に更新する</span></h2>
<h3><span id="toc6">基本構文</span></h3>
<pre><code class="language-mql4">bool RefreshRates();
</code></pre>
<p><strong>RefreshRates()</strong>は、Bid、Ask、Volumeなどの定義済み変数を最新のサーバーデータに更新する関数です。更新に成功するとtrueを返します。</p>
<h3><span id="toc7">なぜRefreshRates()が必要なのか</span></h3>
<p>EAの<code>OnTick()</code>が呼び出された瞬間に、BidやAskには最新の値がセットされます。しかし、その後にSleep()で待機したり、重い計算処理を行ったりすると、BidやAskの値が古くなってしまう可能性があります。</p>
<p>つまり、<strong>Sleep()の後にはRefreshRates()を呼ぶのが鉄則</strong>です。</p>
<h3><span id="toc8">使用例：Sleep()とRefreshRates()のセット</span></h3>
<pre><code class="language-mql4">// 注文失敗 → 待機 → 価格を更新してリトライ
Sleep(1000);
RefreshRates();  // Bid/Askを最新に更新

// 更新後のAskで再度注文
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Retry Order", 0, 0, clrBlue);
</code></pre>
<p>RefreshRates()を呼ばずに古いAsk値で注文を出すと、「Off quotes（無効な価格）」エラーが発生する原因になります。注意しましょう。</p>
<h2><span id="toc9">IsTradeAllowed() — 自動売買が許可されているか確認する</span></h2>
<h3><span id="toc10">基本構文</span></h3>
<pre><code class="language-mql4">bool IsTradeAllowed();
</code></pre>
<p><strong>IsTradeAllowed()</strong>は、EAによる自動売買が許可されている場合にtrueを返す関数です。具体的には、以下の2つの条件を確認しています。</p>
<ul>
<li>MetaTraderのツールバーにある<strong>「自動売買」ボタンがON</strong>になっているか</li>
<li>他のEAやスクリプトが取引コンテキストを使用中（ビジー状態）でないか</li>
</ul>
<h3><span id="toc11">使用例：注文前の安全チェック</span></h3>
<pre><code class="language-mql4">void OnTick()
{
    // 自動売買が許可されていなければ何もしない
    if(!IsTradeAllowed())
    {
        Print("自動売買が無効です。ツールバーの自動売買ボタンを確認してください。");
        return;
    }

    // ここから注文ロジック
    // ...
}
</code></pre>
<h3><span id="toc12">取引コンテキストのビジー状態に対処する</span></h3>
<p>同一のMetaTrader上で複数のEAが動作している場合、1つのEAが注文処理を行っている間は他のEAの取引がブロックされます。このような場合は、少し待ってから再確認するのが有効です。</p>
<pre><code class="language-mql4">// 取引コンテキストが空くまで待機（最大5秒）
for(int i = 0; i < 10; i++)
{
    if(IsTradeAllowed())
        break;

    Print("取引コンテキストがビジー状態です。待機中...");
    Sleep(500);
}
</code></pre>
<h2><span id="toc13">IsConnected() — サーバーとの接続状態を確認する</span></h2>
<h3><span id="toc14">基本構文</span></h3>
<pre><code class="language-mql4">bool IsConnected();
</code></pre>
<p><strong>IsConnected()</strong>は、MetaTraderクライアントがブローカーのサーバーと接続されている場合にtrueを返す関数です。</p>
<h3><span id="toc15">使用例：接続チェック</span></h3>
<pre><code class="language-mql4">void OnTick()
{
    if(!IsConnected())
    {
        Print("サーバーに接続されていません！ 注文処理をスキップします。");
        return;
    }

    // 接続確認OK → 通常の処理へ
}
</code></pre>
<h3><span id="toc16">VPS運用時に特に重要</span></h3>
<p>VPS（仮想専用サーバー）でEAを24時間稼働させている場合、ネットワークの一時的な切断は避けられません。IsConnected()で接続状態をチェックし、切断時にはアラートを出すなどの処理を組み込んでおくと安心です。</p>
<pre><code class="language-mql4">static datetime lastAlertTime = 0;

if(!IsConnected())
{
    // 5分に1回だけアラート
    if(TimeCurrent() - lastAlertTime > 300)
    {
        Alert("サーバー接続が切断されています！");
        lastAlertTime = TimeCurrent();
    }
    return;
}
</code></pre>
<h2><span id="toc17">IsTesting() — バックテスト中かどうかを判定する</span></h2>
<h3><span id="toc18">基本構文</span></h3>
<pre><code class="language-mql4">bool IsTesting();
</code></pre>
<p><strong>IsTesting()</strong>は、EAがストラテジーテスター上で動作しているときにtrueを返す関数です。ライブ口座やデモ口座で動かしている場合はfalseになります。</p>
<h3><span id="toc19">使用例：テスト時にGUI処理をスキップして高速化</span></h3>
<p>バックテスト（特にビジュアルモードではない通常テスト）では、画面への描画処理は不要です。Comment()やObjectCreate()といった描画関数をスキップすることで、テスト速度を大幅に向上できます。</p>
<pre><code class="language-mql4">// グローバル変数としてフラグを用意
bool gIsTesting = false;

int OnInit()
{
    // init()内で1度だけ判定すれば十分
    gIsTesting = IsTesting();
    return(INIT_SUCCEEDED);
}

void OnTick()
{
    // テスト中でなければ画面に情報を表示
    if(!gIsTesting)
    {
        Comment("Bid: ", Bid, "  Ask: ", Ask, "  Spread: ", MarketInfo(Symbol(), MODE_SPREAD));
    }

    // 売買ロジック...
}
</code></pre>
<p><strong>ポイント：</strong>IsTesting()の戻り値はEAの実行中に変わることはありません。そのため、<code>OnInit()</code>内で一度だけ判定してグローバル変数に保存すれば十分です。OnTick()のたびに呼び出す必要はなく、わずかですがパフォーマンスの改善につながります。</p>
<h2><span id="toc20">IsOptimization() — 最適化モードかどうかを判定する</span></h2>
<h3><span id="toc21">基本構文</span></h3>
<pre><code class="language-mql4">bool IsOptimization();
</code></pre>
<p><strong>IsOptimization()</strong>は、ストラテジーテスターの最適化モードで実行されているときにtrueを返す関数です。最適化モードでは、パラメータの組み合わせを大量にテストするため、不要な処理を極力省くことが重要になります。</p>
<h3><span id="toc22">使用例：最適化中はPrint()を抑制する</span></h3>
<p>最適化モードでは、<strong>Print()による出力がログに記録されません</strong>。つまり、Print()を呼んでもデバッグの役に立たないだけでなく、処理のオーバーヘッドだけが残ります。</p>
<pre><code class="language-mql4">bool gIsOptimization = false;

int OnInit()
{
    gIsOptimization = IsOptimization();
    return(INIT_SUCCEEDED);
}

void OnTick()
{
    // 最適化中はデバッグ出力をスキップ
    if(!gIsOptimization)
    {
        Print("現在のBid: ", Bid, " Ask: ", Ask);
    }

    // 売買ロジック...
}
</code></pre>
<h3><span id="toc23">IsTesting()との使い分け</span></h3>
<p>IsTesting()とIsOptimization()の関係を整理しておきましょう。</p>
<table>
<thead>
<tr>
<th>状態</th>
<th>IsTesting()</th>
<th>IsOptimization()</th>
</tr>
</thead>
<tbody>
<tr>
<td>ライブ口座 / デモ口座</td>
<td>false</td>
<td>false</td>
</tr>
<tr>
<td>バックテスト（通常）</td>
<td>true</td>
<td>false</td>
</tr>
<tr>
<td>バックテスト（ビジュアルモード）</td>
<td>true</td>
<td>false</td>
</tr>
<tr>
<td>最適化モード</td>
<td>true</td>
<td>true</td>
</tr>
</tbody>
</table>
<p>最適化モードのときはIsTesting()もtrueになります。つまり「IsTesting()がtrueかつIsOptimization()がfalse」であれば通常のバックテスト、「両方ともtrue」であれば最適化中ということになります。</p>
<h2><span id="toc24">実践テンプレート：6つの関数を組み合わせた安全な注文処理</span></h2>
<p>ここまで紹介した6つの関数をすべて組み合わせた、実践的な注文処理テンプレートを紹介します。実際のEA開発でそのまま活用できる構成です。</p>
<pre><code class="language-mql4">//--- グローバル変数
bool gIsTesting      = false;
bool gIsOptimization = false;

//+------------------------------------------------------------------+
//| 初期化関数                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
    // 実行環境フラグを初期化時に1度だけ判定
    gIsTesting      = IsTesting();
    gIsOptimization = IsOptimization();

    if(!gIsOptimization)
        Print("EA初期化完了 テストモード: ", gIsTesting);

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 安全な買い注文関数                                                  |
//+------------------------------------------------------------------+
int SafeBuyOrder(double lots, int slippage, double sl, double tp, string comment)
{
    int maxRetry = 3;
    int ticket   = -1;

    //--- 1. サーバー接続チェック（テスト時はスキップ）
    if(!gIsTesting &amp;&amp; !IsConnected())
    {
        Print("エラー: サーバーに接続されていません");
        return(-1);
    }

    //--- 2. 自動売買許可チェック
    if(!IsTradeAllowed())
    {
        Print("エラー: 自動売買が許可されていません");
        return(-1);
    }

    //--- 3. リトライループ
    for(int i = 0; i < maxRetry; i++)
    {
        // 価格データを最新に更新
        RefreshRates();

        // 注文送信
        ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, sl, tp, comment, 0, 0, clrBlue);

        if(ticket > 0)
        {
            if(!gIsOptimization)
                Print("買い注文成功！ チケット: ", ticket, " 価格: ", Ask);
            break;
        }
        else
        {
            int err = GetLastError();
            if(!gIsOptimization)
                Print("買い注文失敗（", i + 1, "/", maxRetry, "） エラーコード: ", err);

            // 最後のリトライでなければ待機
            if(i < maxRetry - 1)
            {
                Sleep(1000);  // 1秒待機（テスターでは無視される）
            }
        }
    }

    return(ticket);
}

//+------------------------------------------------------------------+
//| ティックごとの処理                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
    //--- 画面表示（通常バックテスト・最適化時はスキップ）
    if(!gIsTesting)
    {
        Comment("EA稼働中 | Bid: ", Bid, " | Ask: ", Ask,
                " | 接続: ", (IsConnected() ? "OK" : "NG"),
                " | 自動売買: ", (IsTradeAllowed() ? "許可" : "不可"));
    }

    //--- ここに売買条件を記述 ---
    // 例: 買い条件を満たしたら注文
    // int ticket = SafeBuyOrder(0.1, 3, 0, 0, "Sample EA");
}

//+------------------------------------------------------------------+
//| 終了処理                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    if(!gIsOptimization)
        Print("EA停止 理由コード: ", reason);

    // テスト時でなければコメントをクリア
    if(!gIsTesting)
        Comment("");
}
</code></pre>
<p>このテンプレートでは、以下のポイントを押さえています。</p>
<ul>
<li><strong>OnInit()で環境フラグを一度だけ判定</strong> — IsTesting()やIsOptimization()を毎ティック呼ぶ無駄を排除</li>
<li><strong>注文前にIsConnected()とIsTradeAllowed()をチェック</strong> — 接続切れや自動売買無効時のエラーを未然に防止</li>
<li><strong>リトライ時にSleep() + RefreshRates()をセットで使用</strong> — 待機後に最新価格を取得してから再注文</li>
<li><strong>最適化中はPrint()をスキップ</strong> — 不要な処理のオーバーヘッドを削減</li>
<li><strong>テスト中はComment()による画面描画をスキップ</strong> — バックテストの高速化</li>
</ul>
<h2><span id="toc25">まとめ</span></h2>
<p>今回紹介した6つのユーティリティ関数を一覧表で振り返りましょう。</p>
<table>
<thead>
<tr>
<th>関数名</th>
<th>用途</th>
<th>主な使いどころ</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sleep()</td>
<td>処理の一時停止</td>
<td>注文リトライ時の待機</td>
</tr>
<tr>
<td>RefreshRates()</td>
<td>価格データの更新</td>
<td>Sleep()の後、重い計算の後</td>
</tr>
<tr>
<td>IsTradeAllowed()</td>
<td>自動売買許可の確認</td>
<td>注文送信前のチェック</td>
</tr>
<tr>
<td>IsConnected()</td>
<td>サーバー接続の確認</td>
<td>注文送信前、VPS運用時</td>
</tr>
<tr>
<td>IsTesting()</td>
<td>バックテスト判定</td>
<td>GUI処理のスキップ</td>
</tr>
<tr>
<td>IsOptimization()</td>
<td>最適化モード判定</td>
<td>Print()の抑制</td>
</tr>
</tbody>
</table>
<p>これらの関数は単体で使うだけでなく、<strong>組み合わせて使うことで真価を発揮</strong>します。特に「Sleep() → RefreshRates()」のセットや、「IsTesting() / IsOptimization()による処理の出し分け」は、EA開発における定番テクニックです。</p>
<p>今回紹介した実践テンプレートをベースに、ご自身のEAに安全で効率的な処理を組み込んでみてください。堅牢なEAを作る第一歩になるはずです。</p>
<p>投稿 <a href="https://mql-programing.com/archives/13065/%e3%80%90mql4%e3%80%91%e7%9f%a5%e3%81%a3%e3%81%a6%e3%81%8a%e3%81%8d%e3%81%9f%e3%81%84%e3%83%a6%e3%83%bc%e3%83%86%e3%82%a3%e3%83%aa%e3%83%86%e3%82%a3%e9%96%a2%e6%95%b06%e9%81%b8%ef%bc%81sleep%e3%83%bbr/">【MQL4】知っておきたいユーティリティ関数6選！Sleep・RefreshRates・IsTradeAllowed・IsConnected・IsTesting・IsOptimizationの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
