<?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/category/mql-function/order-relation/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/category/mql-function/order-relation/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 03:43:44 +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/category/mql-function/order-relation/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】iCustom関数の使い方を徹底解説！カスタムインジケーターをEAから呼び出す方法とサンプルコード</title>
		<link>https://mql-programing.com/archives/13043/%e3%80%90mql4%e3%80%91icustom%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%a4%e3%83%b3%e3%82%b8/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 16 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[EA自動売買]]></category>
		<category><![CDATA[iCustom]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[カスタムインジケーター]]></category>
		<category><![CDATA[サンプルコード]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13043</guid>

					<description><![CDATA[<p>「お気に入りのインジケーターを使って自動売買したい！」——そんな夢を叶えてくれるのが、MQL4のiCustom関数です。 iCustom関数を使えば、MT4のIndicatorsフォルダにあるカスタムインジケーターの値を [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13043/%e3%80%90mql4%e3%80%91icustom%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%a4%e3%83%b3%e3%82%b8/">【MQL4】iCustom関数の使い方を徹底解説！カスタムインジケーターをEAから呼び出す方法とサンプルコード</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「お気に入りのインジケーターを使って自動売買したい！」——そんな夢を叶えてくれるのが、MQL4の<strong>iCustom関数</strong>です。</p>
<p>iCustom関数を使えば、MT4の<strong>Indicatorsフォルダにあるカスタムインジケーターの値をEA（エキスパートアドバイザー）から自由に取得</strong>できます。つまり、チャート上で矢印やラインを表示するインジケーターのシグナルを、そのまま自動売買のロジックに組み込めるのです。</p>
<p>この記事では、iCustom関数の基本的な構文から、実践的なサンプルコードまで、初心者にもわかりやすく解説していきます。</p>
<h2><span id="toc1">iCustom関数とは？</span></h2>
<p>iCustom関数は、<strong>指定したカスタムインジケーターの計算結果（バッファの値）を取得する</strong>MQL4の組み込み関数です。</p>
<p>MT4にはiMA（移動平均線）やiRSI（RSI）など、標準インジケーター用の関数が用意されていますが、自作のインジケーターやネットで配布されているインジケーターにはこうした専用関数がありません。そこで活躍するのがiCustom関数です。</p>
<p>iCustom関数を利用すると、Indicatorsフォルダに保存されているあらゆるカスタムインジケーターの値を取得できます。これにより、インジケーターのシグナルをEAのエントリー条件・決済条件として使うことが可能になります。</p>
<h2><span id="toc2">iCustom関数の構文（シンタックス）</span></h2>
<p>iCustom関数の基本構文は以下の通りです。</p>
<pre><code class="language-mql4">double iCustom(
    string symbol,      // 通貨ペア（NULLで現在のチャート）
    int    timeframe,    // 時間足（0で現在の時間足）
    string name,         // カスタムインジケーター名
    ...                  // インジケーターの入力パラメーター（可変）
    int    mode,         // バッファ番号（0〜7）
    int    shift         // 取得するバーの位置（0が最新）
);
</code></pre>
<p>各パラメーターの意味を詳しく見ていきましょう。</p>
<h3><span id="toc3">① symbol（通貨ペア）</span></h3>
<p>値を取得したい通貨ペアを文字列で指定します。現在のチャートの通貨ペアを指定する場合は <code>NULL</code> または <code>_Symbol</code> を使います。別の通貨ペアを指定したい場合は <code>"USDJPY"</code> のように気配値表示ウィンドウの表記通りに記述します。</p>
<h3><span id="toc4">② timeframe（時間足）</span></h3>
<p>時間軸の種類を指定します。現在のチャートの時間足を使う場合は <code>0</code> または <code>PERIOD_CURRENT</code> を指定します。別の時間足を指定する場合は、以下の定数を使います。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; margin: 16px 0;">
<tr style="background-color: #f0f0f0;">
<th>定数</th>
<th>値</th>
<th>意味</th>
</tr>
<tr>
<td>PERIOD_M1</td>
<td>1</td>
<td>1分足</td>
</tr>
<tr>
<td>PERIOD_M5</td>
<td>5</td>
<td>5分足</td>
</tr>
<tr>
<td>PERIOD_M15</td>
<td>15</td>
<td>15分足</td>
</tr>
<tr>
<td>PERIOD_M30</td>
<td>30</td>
<td>30分足</td>
</tr>
<tr>
<td>PERIOD_H1</td>
<td>60</td>
<td>1時間足</td>
</tr>
<tr>
<td>PERIOD_H4</td>
<td>240</td>
<td>4時間足</td>
</tr>
<tr>
<td>PERIOD_D1</td>
<td>1440</td>
<td>日足</td>
</tr>
<tr>
<td>PERIOD_W1</td>
<td>10080</td>
<td>週足</td>
</tr>
<tr>
<td>PERIOD_MN1</td>
<td>43200</td>
<td>月足</td>
</tr>
</table>
<h3><span id="toc5">③ name（インジケーター名）</span></h3>
<p>カスタムインジケーター名を文字列で指定します。指定するカスタムインジケーターの.ex4ファイルが、MQL4\Indicatorsフォルダまたはそのサブフォルダに保存されている必要があります。</p>
<p>サブディレクトリに配置されている場合は、&#8221;サブディレクトリ名\\カスタムインジケータ名&#8221;で指定します。</p>
<pre><code class="language-mql4">// Indicatorsフォルダ直下の場合
iCustom(NULL, 0, "MyIndicator", ...);

// サブフォルダ「Examples」内の場合
iCustom(NULL, 0, "Examples\\MyIndicator", ...);
</code></pre>
<h3><span id="toc6">④ &#8230;（インジケーターの入力パラメーター）</span></h3>
<p>カスタムインジケータの入力パラメータです。渡された入力パラメータの順序は、カスタムインジケータの宣言順に対応する必要があります。ここが一番混乱しやすいポイントです。</p>
<p>パラメーターを省略した場合は、インジケーター側のデフォルト値が使用されます。ただし、<strong>途中のパラメーターだけを省略することはできません</strong>。変更したいパラメーターより前のパラメーターは、すべてデフォルト値であっても記述する必要があります。</p>
<h3><span id="toc7">⑤ mode（バッファ番号）</span></h3>
<p>取得したいインジケーターバッファのインデックス番号（0〜7）を指定します。最初のバッファはmode=0です。</p>
<p>例えば、ボリンジャーバンドのようなインジケーターなら：</p>
<ul>
<li>バッファ0：ミドルバンド</li>
<li>バッファ1：アッパーバンド</li>
<li>バッファ2：ロワーバンド</li>
</ul>
<p>のように対応します。バッファ番号の確認方法は後述します。</p>
<h3><span id="toc8">⑥ shift（バーの位置）</span></h3>
<p>カスタムインジケーターの値を取得したいバーの位置を指定します。現在のバーであれば「0」、1本前のバーであれば「1」、2本前のバーであれば「2」と記述します。</p>
<p>EA内では、確定した値を使うため <code>shift=1</code>（1本前の確定バー）を指定するのが一般的です。</p>
<h2><span id="toc9">バッファ番号の調べ方</span></h2>
<p>iCustom関数を使ううえで最も重要なのが、<strong>正しいバッファ番号を知ること</strong>です。バッファ番号を間違えると、まったく違う値を取得してしまいます。</p>
<h3><span id="toc10">方法1：チャート上でマウスカーソルを合わせる</span></h3>
<p>チャート上にセットしたインジケーターのラインや矢印にマウスカーソルをのせて、Value1やValue2などという表示がでれば、iCustomでEA化できます。</p>
<h3><span id="toc11">方法2：データウィンドウで確認する</span></h3>
<p>MT4の<strong>「表示」→「データウィンドウ」</strong>を開くと、各インジケーターのバッファ値が一覧で表示されます。上から順に0, 1, 2&#8230;のバッファ番号に対応しています。</p>
<h3><span id="toc12">方法3：ソースコードを確認する</span></h3>
<p>インジケーターの.mq4ファイルがある場合は、<code>SetIndexBuffer()</code> や <code>SetIndexLabel()</code> の記述からバッファ番号を確認できます。</p>
<pre><code class="language-mql4">// ソースコードの例
SetIndexBuffer(0, UpperBuffer);  // バッファ0 → アッパーライン
SetIndexBuffer(1, LowerBuffer);  // バッファ1 → ロワーライン
SetIndexBuffer(2, BuySignal);    // バッファ2 → 買いシグナル
SetIndexBuffer(3, SellSignal);   // バッファ3 → 売りシグナル
</code></pre>
<h2><span id="toc13">基本的な使い方：サンプルコード</span></h2>
<p>ここからは、実際のサンプルコードを使って使い方を解説します。</p>
<h3><span id="toc14">サンプル1：移動平均線カスタムインジケーターの値を取得</span></h3>
<p>まずは、最もシンプルな例です。カスタムインジケーター「MyMA」の値を取得してチャートにコメント表示します。</p>
<pre><code class="language-mql4">void OnTick()
{
    // MyMAインジケーターの値を取得（期間20、バッファ0、1本前のバー）
    double ma_value = iCustom(NULL, 0, "MyMA", 20, 0, 1);
    
    // チャートにコメント表示
    Comment("MyMA(20)の値: ", DoubleToString(ma_value, Digits));
}
</code></pre>
<h3><span id="toc15">サンプル2：ボリンジャーバンドカスタムインジケーターの複数バッファを取得</span></h3>
<p>iCustom関数でボリンジャーバンドの値を取得する例です。</p>
<pre><code class="language-mql4">void OnTick()
{
    // Bandsインジケーターの各バンドを取得
    int period = 20;
    double deviation = 2.0;
    
    double upper = iCustom(NULL, 0, "Bands", period, 0, deviation, 1, 0);  // アッパーバンド（バッファ1）
    double lower = iCustom(NULL, 0, "Bands", period, 0, deviation, 2, 0);  // ロワーバンド（バッファ2）
    
    Comment("Upper: ", upper, "\nLower: ", lower);
}
</code></pre>
<h3><span id="toc16">サンプル3：矢印シグナルインジケーターでEA化する</span></h3>
<p>これが最も実践的な使い方です。買い矢印・売り矢印を表示するインジケーターのシグナルを使って自動売買するEAのサンプルです。</p>
<pre><code class="language-mql4">#property strict

// --- 入力パラメーター ---
input double Lots       = 0.01;    // ロット数
input int    MagicNumber = 12345;  // マジックナンバー
input int    StopLoss    = 50;     // ストップロス（pips）
input int    TakeProfit  = 100;    // テイクプロフィット（pips）

void OnTick()
{
    // --- カスタムインジケーターのシグナル取得 ---
    // 買いシグナル（バッファ0）と売りシグナル（バッファ1）を1本前のバーから取得
    double buySignal  = iCustom(NULL, 0, "MySignalIndicator", 0, 1);
    double sellSignal = iCustom(NULL, 0, "MySignalIndicator", 1, 1);
    
    // --- 現在のポジション数をカウント ---
    int buyCount = 0, sellCount = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
        if(OrderType() == OP_BUY)  buyCount++;
        if(OrderType() == OP_SELL) sellCount++;
    }
    
    // --- 買いエントリー ---
    // シグナルが EMPTY_VALUE でなければ矢印が出現している
    if(buySignal != EMPTY_VALUE && buySignal != 0 && buyCount == 0)
    {
        double sl = Ask - StopLoss * Point * 10;
        double tp = Ask + TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, sl, tp,
                               "iCustom Buy", MagicNumber, 0, clrBlue);
        if(ticket < 0)
            Print("買い注文エラー: ", GetLastError());
    }
    
    // --- 売りエントリー ---
    if(sellSignal != EMPTY_VALUE &#038;&#038; sellSignal != 0 &#038;&#038; sellCount == 0)
    {
        double sl = Bid + StopLoss * Point * 10;
        double tp = Bid - TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, sl, tp,
                               "iCustom Sell", MagicNumber, 0, clrRed);
        if(ticket < 0)
            Print("売り注文エラー: ", GetLastError());
    }
}
</code></pre>
<p>ポイントは、<strong>矢印が表示されていないバーでは <code>EMPTY_VALUE</code>（空の値）が返される</strong>という点です。矢印系のシグナルインジケーターをEA化する場合、この <code>EMPTY_VALUE</code> との比較がエントリー判定の基本パターンになります。</p>
<h2><span id="toc17">iCustom関数を使う際の注意点</span></h2>
<h3><span id="toc18">1. .ex4ファイルが必要</span></h3>
<p>iCustom関数が参照するのは、コンパイル済みの<strong>.ex4ファイル</strong>です。ソースコード（.mq4）だけではなく、必ずコンパイルして.ex4ファイルを生成しておきましょう。</p>
<h3><span id="toc19">2. バッファレスインジケーターには使えない</span></h3>
<p>オシレーター系のインジケーターの場合はバッファが不可欠なので問題ないのですが、メインチャートに表示される矢印系のインジケーターの場合にはバッファで処理していないことがあります。「バッファでシグナルを処理するようにプログラミングしていないこと」、これがiCustomでインジケーターをEA化できない原因です。バッファレスインジケーターはiCustomではEA化できません。</p>
<h3><span id="toc20">3. パラメーターの順序と型に注意</span></h3>
<p>入力パラメーターは<strong>インジケーターのソースコードで宣言された順番通り</strong>に指定する必要があります。順番を間違えたり、型が合わないと正しい値が返りません。</p>
<h3><span id="toc21">4. パフォーマンスを意識する</span></h3>
<p>iCustom関数は呼び出すたびに計算が実行されるため、ティックごとに何度も呼び出すとパフォーマンスが低下します。新しいバーが確定したタイミングでのみ呼び出し、データをキャッシュすると処理速度を改善できます。</p>
<pre><code class="language-mql4">// 新しいバーの判定例
static datetime lastBarTime = 0;
if(Time[0] != lastBarTime)
{
    lastBarTime = Time[0];
    // ここでiCustomを呼び出す
    double signal = iCustom(NULL, 0, "MyIndicator", 0, 1);
}
</code></pre>
<h3><span id="toc22">5. バッファ番号は0〜7の範囲</span></h3>
<p>MT4ではインジケーターバッファのインデックスは<strong>0〜7</strong>の8個までです。バッファが8個を超えるインジケーターの場合、すべての値をiCustomで取得できるとは限りません。</p>
<h2><span id="toc23">まとめ</span></h2>
<p>iCustom関数は、カスタムインジケーターのシグナルをEAに組み込むための必須関数です。この記事のポイントをまとめます。</p>
<ul>
<li><strong>iCustom関数</strong>を使えば、Indicatorsフォルダにあるカスタムインジケーターの値をEAから取得できる</li>
<li>パラメーターは「通貨ペア → 時間足 → インジケーター名 → <strong>入力パラメーター</strong> → バッファ番号 → バー位置」の順に指定する</li>
<li><strong>バッファ番号</strong>の確認は、データウィンドウやソースコードから行う</li>
<li>矢印シグナル系のインジケーターは <code>EMPTY_VALUE</code> との比較でシグナル判定する</li>
<li><strong>バッファレスインジケーター</strong>（バッファを使わずオブジェクトで描画するもの）には使えない</li>
<li>パフォーマンスのため、新しいバー確定時にのみ呼び出す工夫をすると良い</li>
</ul>
<p>まずは簡単なインジケーターから試して、iCustom関数の使い方に慣れていきましょう。シグナルインジケーターをEA化できるようになれば、自動売買の幅が大きく広がりますよ！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13043/%e3%80%90mql4%e3%80%91icustom%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%a4%e3%83%b3%e3%82%b8/">【MQL4】iCustom関数の使い方を徹底解説！カスタムインジケーターをEAから呼び出す方法とサンプルコード</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iWPR関数の使い方を徹底解説！ウィリアムズ%Rでエントリーシグナルを作ろう</title>
		<link>https://mql-programing.com/archives/13040/%e3%80%90mql4%e3%80%91iwpr%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%a6%e3%82%a3%e3%83%aa%e3%82%a2%e3%83%a0%e3%82%bar%e3%81%a7/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[iWPR]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[ウィリアムズ%R]]></category>
		<category><![CDATA[テクニカルインジケーター]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13040</guid>

					<description><![CDATA[<p>「ウィリアムズ%R（Williams&#8217; Percent Range）」というインジケーターをご存知ですか？これはラリー・ウィリアムズ氏が考案したオシレーター系テクニカル指標で、相場の「買われすぎ」「売られすぎ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13040/%e3%80%90mql4%e3%80%91iwpr%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%a6%e3%82%a3%e3%83%aa%e3%82%a2%e3%83%a0%e3%82%bar%e3%81%a7/">【MQL4】iWPR関数の使い方を徹底解説！ウィリアムズ%Rでエントリーシグナルを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「ウィリアムズ%R（Williams&#8217; Percent Range）」というインジケーターをご存知ですか？これはラリー・ウィリアムズ氏が考案した<strong>オシレーター系テクニカル指標</strong>で、相場の「買われすぎ」「売られすぎ」を判断するのにとても便利なツールです。</p>
<p>MQL4では<strong>iWPR関数</strong>を使うことで、このウィリアムズ%Rの値を簡単に取得できます。この記事では、iWPR関数の基本的な使い方から、実践的なEA（自動売買）への応用まで、段階的にわかりやすく解説していきます。</p>
<h2><span id="toc1">ウィリアムズ%Rとは？</span></h2>
<p>ウィリアムズ%Rは、一定期間における最高値と最安値の範囲のなかで、現在の終値がどの位置にあるかをパーセンテージで示す指標です。</p>
<h3><span id="toc2">計算式</span></h3>
<p>ウィリアムズ%Rの計算式は以下のとおりです。</p>
<pre><code class="language-mql4">// ウィリアムズ%Rの計算式（概念）
// %R = (期間内の最高値 - 現在の終値) / (期間内の最高値 - 期間内の最安値) × (-100)
</code></pre>
<p>この計算により、値は常に<strong>0 ～ -100</strong>の範囲で推移します。ここが他のオシレーターと少し違うポイントで、値がマイナスの範囲で動くことを覚えておきましょう。</p>
<h3><span id="toc3">値の見方</span></h3>
<ul>
<li><strong>0 に近い（-20より上）</strong>：買われすぎゾーン → 売りシグナルの候補</li>
<li><strong>-100 に近い（-80より下）</strong>：売られすぎゾーン → 買いシグナルの候補</li>
<li><strong>-50 付近</strong>：中立的な状態</li>
</ul>
<p>ストキャスティクスと非常に似た性質を持っていますが、ウィリアムズ%Rはスケールが反転している点が特徴です。ストキャスティクスでは値が高いほど買われすぎですが、ウィリアムズ%Rでは値が0に近いほど買われすぎとなります。</p>
<h2><span id="toc4">iWPR関数の構文</span></h2>
<p>MQL4でウィリアムズ%Rの値を取得するには、<strong>iWPR関数</strong>を使います。構文は以下のとおりです。</p>
<pre><code class="language-mql4">double iWPR(
    string symbol,      // 通貨ペア名
    int    timeframe,   // 時間足
    int    period,      // 計算期間
    int    shift        // シフト（何本前のバーか）
);
</code></pre>
<h3><span id="toc5">引数の詳細</span></h3>
<table>
<thead>
<tr>
<th>引数</th>
<th>型</th>
<th>説明</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>string</td>
<td>通貨ペア名。NULLで現在のチャート</td>
<td>NULL, &#8220;USDJPY&#8221;</td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足の定数。0で現在の時間足</td>
<td>0, PERIOD_H1</td>
</tr>
<tr>
<td>period</td>
<td>int</td>
<td>計算に使うバーの本数</td>
<td>14</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>取得するバーの位置（0が最新）</td>
<td>0, 1</td>
</tr>
</tbody>
</table>
<p><strong>戻り値</strong>はdouble型で、0 ～ -100 の範囲の値が返されます。</p>
<h2><span id="toc6">基本的な使い方</span></h2>
<p>まずは、iWPR関数で値を取得してログに出力するシンプルな例を見てみましょう。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 現在のチャート、現在の時間足、期間14、1本前の確定バーのウィリアムズ%Rを取得
    double wpr = iWPR(NULL, 0, 14, 1);

    // エキスパートログに出力
    Print("Williams %%R (1本前) = ", DoubleToString(wpr, 2));

    // 買われすぎ・売られすぎの判定
    if(wpr > -20)
    {
        Print("→ 買われすぎゾーン");
    }
    else if(wpr < -80)
    {
        Print("→ 売られすぎゾーン");
    }
    else
    {
        Print("→ 中立ゾーン");
    }
}
</code></pre>
<p>ここで<strong>shift に 1 を指定</strong>している点がポイントです。shift=0 だと現在まだ形成中のバーの値を取得してしまい、リアルタイムで値が変動します。EA開発では、確定したバー（shift=1）の値を使うのが基本です。</p>
<h2><span id="toc7">サンプル①：買われすぎ・売られすぎの状態をチャートに表示する</span></h2>
<p>次に、ウィリアムズ%Rの状態をチャートのコメントとしてリアルタイム表示するコードを作ってみましょう。</p>
<pre><code class="language-mql4">// ウィリアムズ%Rの状態表示スクリプト
extern int WPR_Period = 14;          // 計算期間
extern double OverBought = -20.0;    // 買われすぎライン
extern double OverSold   = -80.0;    // 売られすぎライン

void OnTick()
{
    double wprCurrent = iWPR(NULL, 0, WPR_Period, 0);
    double wprPrev    = iWPR(NULL, 0, WPR_Period, 1);

    string status = "";

    if(wprPrev > OverBought)
        status = "★ 買われすぎゾーン（売りに注目）";
    else if(wprPrev < OverSold)
        status = "★ 売られすぎゾーン（買いに注目）";
    else
        status = "― 中立ゾーン";

    Comment(
        "===== Williams %R Monitor =====\n",
        "期間: ", WPR_Period, "\n",
        "現在値 (形成中): ", DoubleToString(wprCurrent, 2), "\n",
        "確定値 (1本前) : ", DoubleToString(wprPrev, 2), "\n",
        "状態: ", status, "\n",
        "================================"
    );
}
</code></pre>
<p>このコードをEAとしてチャートにセットすると、左上にウィリアムズ%Rの値と状態がリアルタイムで表示されます。動きを観察しながら指標の特性を学ぶのに最適です。</p>
<h2><span id="toc8">サンプル②：ゾーン脱出型シグナルのシンプルEA</span></h2>
<p>ウィリアムズ%Rを使ったEAを作る際、単純に「-80以下で買い」とするとダマシが多くなります。そこで、<strong>ゾーン脱出型</strong>の考え方を取り入れます。</p>
<p>ゾーン脱出型とは、以下のようなロジックです。</p>
<ul>
<li><strong>買いシグナル</strong>：売られすぎゾーン（-80以下）に入った後、-80を上回って脱出したとき</li>
<li><strong>売りシグナル</strong>：買われすぎゾーン（-20以上）に入った後、-20を下回って脱出したとき</li>
</ul>
<p>これにより、ゾーン内に張り付いたまま反転しないケースのダマシを軽減できます。</p>
<pre><code class="language-mql4">// ゾーン脱出型 ウィリアムズ%R EA
extern int    WPR_Period  = 14;
extern double LotSize     = 0.01;
extern double OverBought  = -20.0;
extern double OverSold    = -80.0;
extern int    StopLoss    = 100;     // ストップロス（pips）
extern int    TakeProfit  = 200;     // テイクプロフィット（pips）
extern int    MagicNumber = 12345;

void OnTick()
{
    // 新しいバーが確定したときだけ処理する
    static datetime lastBarTime = 0;
    if(Time[0] == lastBarTime) return;
    lastBarTime = Time[0];

    // 確定バーと、その1つ前のバーのウィリアムズ%Rを取得
    double wpr1 = iWPR(NULL, 0, WPR_Period, 1);  // 直近の確定バー
    double wpr2 = iWPR(NULL, 0, WPR_Period, 2);  // その1つ前

    // 既存ポジションの確認
    int posCount = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                posCount++;
        }
    }

    // ポジションがない場合のみエントリー判定
    if(posCount > 0) return;

    double sl, tp;

    // 買いシグナル：売られすぎゾーンから脱出
    if(wpr2 < OverSold &#038;&#038; wpr1 >= OverSold)
    {
        sl = Ask - StopLoss * Point * 10;
        tp = Ask + TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                               "WPR Buy Signal", MagicNumber, 0, clrBlue);
        if(ticket > 0)
            Print("買いエントリー: WPR=", DoubleToString(wpr1, 2));
        else
            Print("買い注文エラー: ", GetLastError());
    }

    // 売りシグナル：買われすぎゾーンから脱出
    if(wpr2 > OverBought && wpr1 <= OverBought)
    {
        sl = Bid + StopLoss * Point * 10;
        tp = Bid - TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                               "WPR Sell Signal", MagicNumber, 0, clrRed);
        if(ticket > 0)
            Print("売りエントリー: WPR=", DoubleToString(wpr1, 2));
        else
            Print("売り注文エラー: ", GetLastError());
    }
}
</code></pre>
<p>このEAのポイントは以下のとおりです。</p>
<ul>
<li><strong>新しいバー確定時のみ判定</strong>：static変数でバーの時刻を管理し、同じバーで何度も判定しない</li>
<li><strong>ゾーン脱出の判定</strong>：2本前がゾーン内、1本前がゾーン外になったことで「脱出」を検知</li>
<li><strong>ポジション制限</strong>：同時に1ポジションのみ持つようにしている</li>
</ul>
<h2><span id="toc9">サンプル③：移動平均線との組み合わせ（トレンドフィルター付きEA）</span></h2>
<p>オシレーター系指標の弱点は、<strong>強いトレンドが発生している局面</strong>では買われすぎ・売られすぎの状態が長く続き、シグナルが機能しにくいことです。</p>
<p>これを改善するために、<strong>移動平均線によるトレンドフィルター</strong>を追加したEAを作ってみましょう。</p>
<pre><code class="language-mql4">// トレンドフィルター付き ウィリアムズ%R EA
extern int    WPR_Period  = 14;
extern int    MA_Period   = 50;      // 移動平均線の期間
extern int    MA_Method   = MODE_SMA; // 移動平均の種類
extern double LotSize     = 0.01;
extern double OverBought  = -20.0;
extern double OverSold    = -80.0;
extern int    StopLoss    = 100;
extern int    TakeProfit  = 200;
extern int    MagicNumber = 12346;

void OnTick()
{
    // 新しいバー確定時のみ処理
    static datetime lastBarTime = 0;
    if(Time[0] == lastBarTime) return;
    lastBarTime = Time[0];

    // ウィリアムズ%Rの値を取得
    double wpr1 = iWPR(NULL, 0, WPR_Period, 1);
    double wpr2 = iWPR(NULL, 0, WPR_Period, 2);

    // 移動平均線の値を取得
    double ma1 = iMA(NULL, 0, MA_Period, 0, MA_Method, PRICE_CLOSE, 1);

    // 現在の価格と移動平均線の位置関係でトレンドを判定
    double closePrice = Close[1];
    bool isUpTrend   = (closePrice > ma1);  // 上昇トレンド
    bool isDownTrend = (closePrice < ma1);  // 下降トレンド

    // 既存ポジションの確認
    int posCount = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                posCount++;
        }
    }

    if(posCount > 0) return;

    double sl, tp;

    // 買いシグナル：上昇トレンド中 + 売られすぎゾーンから脱出
    if(isUpTrend && wpr2 < OverSold &#038;&#038; wpr1 >= OverSold)
    {
        sl = Ask - StopLoss * Point * 10;
        tp = Ask + TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                               "WPR+MA Buy", MagicNumber, 0, clrBlue);
        if(ticket > 0)
            Print("買いエントリー（トレンドフィルター付き）: WPR=",
                  DoubleToString(wpr1, 2), " MA=", DoubleToString(ma1, 5));
    }

    // 売りシグナル：下降トレンド中 + 買われすぎゾーンから脱出
    if(isDownTrend && wpr2 > OverBought && wpr1 <= OverBought)
    {
        sl = Bid + StopLoss * Point * 10;
        tp = Bid - TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                               "WPR+MA Sell", MagicNumber, 0, clrRed);
        if(ticket > 0)
            Print("売りエントリー（トレンドフィルター付き）: WPR=",
                  DoubleToString(wpr1, 2), " MA=", DoubleToString(ma1, 5));
    }
}
</code></pre>
<p>このEAでは、以下のフィルタリングを行っています。</p>
<ul>
<li><strong>買いエントリー</strong>：価格が移動平均線より上（上昇トレンド）のときだけ、売られすぎからの脱出シグナルを採用</li>
<li><strong>売りエントリー</strong>：価格が移動平均線より下（下降トレンド）のときだけ、買われすぎからの脱出シグナルを採用</li>
</ul>
<p>こうすることで、<strong>トレンド方向と逆行するエントリーを防ぎ</strong>、勝率の向上が期待できます。</p>
<h2><span id="toc10">iWPR関数を使う際の注意点</span></h2>
<h3><span id="toc11">1. 値の範囲はマイナスである</span></h3>
<p>ウィリアムズ%Rの値は<strong>0 ～ -100</strong>です。RSIのように0～100ではないので、条件式を書くときに符号を間違えないよう注意してください。例えば「-80以下」は <code>wpr &lt; -80</code> と書きます。</p>
<h3><span id="toc12">2. トレーディングスタイルに合わせた期間設定</span></h3>
<p>ウィリアムズ%Rの計算期間は、トレーディングスタイルに合わせて調整するのがおすすめです。</p>
<table>
<thead>
<tr>
<th>スタイル</th>
<th>推奨期間</th>
<th>特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td>スキャルピング</td>
<td>7</td>
<td>シグナルが敏感、ダマシも多い</td>
</tr>
<tr>
<td>デイトレード</td>
<td>14</td>
<td>バランスが良い（デフォルト）</td>
</tr>
<tr>
<td>スイングトレード</td>
<td>21〜28</td>
<td>シグナルは少ないが信頼性が高い</td>
</tr>
</tbody>
</table>
<h3><span id="toc13">3. 強いトレンド相場には注意</span></h3>
<p>オシレーター系指標全般に言えることですが、強い上昇トレンドや下降トレンドでは、ウィリアムズ%Rが買われすぎ・売られすぎゾーンに張り付いたまま動かないことがあります。このような場合、逆張りシグナルが機能しません。サンプル③のように<strong>トレンドフィルターと組み合わせる</strong>ことを強くおすすめします。</p>
<h3><span id="toc14">4. 確定バーの値を使う</span></h3>
<p>EA開発では、形成中のバー（shift=0）ではなく、<strong>確定したバー（shift=1以上）の値を使う</strong>のが鉄則です。形成中のバーの値はティックごとに変動するため、シグナルがチラつく原因になります。</p>
<h2><span id="toc15">まとめ</span></h2>
<p>この記事では、MQL4のiWPR関数を使ってウィリアムズ%Rの値を取得し、EA開発に活用する方法を解説しました。最後にポイントをおさらいしましょう。</p>
<ul>
<li><strong>iWPR関数</strong>は4つの引数（symbol, timeframe, period, shift）を指定してウィリアムズ%Rの値を取得する</li>
<li>値の範囲は<strong>0 ～ -100</strong>で、-20以上が買われすぎ、-80以下が売られすぎ</li>
<li><strong>ゾーン脱出型</strong>のシグナルにすることで、単純なゾーン判定よりダマシを軽減できる</li>
<li><strong>移動平均線などのトレンドフィルター</strong>と組み合わせることで、さらに精度を高められる</li>
<li>EA開発では必ず<strong>確定バー（shift=1）</strong>の値を使うこと</li>
</ul>
<p>ウィリアムズ%Rはシンプルな指標ですが、正しく使えばエントリーポイントの精度を上げる強力な武器になります。まずはサンプルコードをストラテジーテスターで動かして、動作を確認するところから始めてみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13040/%e3%80%90mql4%e3%80%91iwpr%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%a6%e3%82%a3%e3%83%aa%e3%82%a2%e3%83%a0%e3%82%bar%e3%81%a7/">【MQL4】iWPR関数の使い方を徹底解説！ウィリアムズ%Rでエントリーシグナルを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iCCI関数の使い方を徹底解説！CCI（商品チャネル指数）でトレンド転換を捉えるEAを作ろう</title>
		<link>https://mql-programing.com/archives/13025/%e3%80%90mql4%e3%80%91icci%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81cci%ef%bc%88%e5%95%86%e5%93%81%e3%83%81%e3%83%a3%e3%83%8d%e3%83%ab/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[CCI]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[iCCI]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[インジケーター関数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13025</guid>

					<description><![CDATA[<p>CCI（商品チャネル指数）は、相場の「買われすぎ・売られすぎ」を数値で判断できる人気のオシレーター系インジケーターです。MQL4ではiCCI関数を使うことで、EA（自動売買）の中から簡単にCCIの値を取得できます。 この [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13025/%e3%80%90mql4%e3%80%91icci%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81cci%ef%bc%88%e5%95%86%e5%93%81%e3%83%81%e3%83%a3%e3%83%8d%e3%83%ab/">【MQL4】iCCI関数の使い方を徹底解説！CCI（商品チャネル指数）でトレンド転換を捉えるEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>CCI（商品チャネル指数）は、相場の「買われすぎ・売られすぎ」を数値で判断できる人気のオシレーター系インジケーターです。MQL4では<strong>iCCI関数</strong>を使うことで、EA（自動売買）の中から簡単にCCIの値を取得できます。</p>
<p>この記事では、iCCI関数の基本的な使い方からパラメータの意味、そしてCCIのクロスを利用した実践的なEAの作成方法まで、ステップバイステップで解説していきます。</p>
<h2><span id="toc1">CCI（商品チャネル指数）とは？</span></h2>
<p>CCIは1980年にドナルド・ランバート氏が開発した<strong>モメンタム系オシレーター</strong>です。もともとは商品先物市場向けに作られましたが、現在ではFXや株式など幅広い市場で使われています。</p>
<p>CCIの特徴は、RSIやストキャスティクスのように0〜100の範囲に収まるのではなく、<strong>上下に制限なく動く</strong>点です。一般的には以下の基準で判断します。</p>
<ul>
<li><strong>+100を上回る</strong>：買われすぎ（上昇トレンドが強い）</li>
<li><strong>-100を下回る</strong>：売られすぎ（下降トレンドが強い）</li>
<li><strong>0ライン</strong>：トレンドの方向転換の目安</li>
</ul>
<h3><span id="toc2">CCIの計算式</span></h3>
<p>CCIの計算式は以下の通りです。</p>
<pre><code class="language-mql4">CCI = (TP - MA) / (0.015 × MD)

// TP（ティピカルプライス）= (高値 + 安値 + 終値) / 3
// MA = TPの単純移動平均（期間N）
// MD = TPと移動平均の平均偏差
// 0.015 = CCI値の約70〜80%が±100以内に収まるように設定された定数
</code></pre>
<p>計算式を覚える必要はありませんが、TPをベースにしていることは頭に入れておきましょう。iCCI関数の<code>applied_price</code>パラメータに関わってきます。</p>
<h2><span id="toc3">iCCI関数の構文</span></h2>
<p>MQL4でCCIの値を取得するには、<strong>iCCI関数</strong>を使います。構文は以下の通りです。</p>
<pre><code class="language-mql4">double iCCI(
   string       symbol,          // 通貨ペア名
   int          timeframe,       // 時間足
   int          period,          // 平均期間
   int          applied_price,   // 適用価格
   int          shift            // シフト（何本前の足か）
);
</code></pre>
<h3><span id="toc4">パラメータ一覧</span></h3>
<table>
<thead>
<tr>
<th>パラメータ</th>
<th>型</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>string</td>
<td>通貨ペア名。現在のチャートなら<code>NULL</code>または<code>Symbol()</code></td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足。<code>0</code>で現在のチャートの時間足。<code>PERIOD_H1</code>など定数も使用可能</td>
</tr>
<tr>
<td>period</td>
<td>int</td>
<td>CCIの計算期間。一般的には<strong>14</strong>や<strong>20</strong>がよく使われる</td>
</tr>
<tr>
<td>applied_price</td>
<td>int</td>
<td>計算に使う価格の種類</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>何本前のローソク足のCCI値を取得するか。0が現在の足、1が1本前の確定足</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">applied_price（適用価格）の定数一覧</span></h3>
<p>CCIの計算に使用する価格タイプを指定します。デフォルトのCCIではティピカルプライスが使われます。</p>
<table>
<thead>
<tr>
<th>定数名</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>PRICE_CLOSE</td>
<td>0</td>
<td>終値</td>
</tr>
<tr>
<td>PRICE_OPEN</td>
<td>1</td>
<td>始値</td>
</tr>
<tr>
<td>PRICE_HIGH</td>
<td>2</td>
<td>高値</td>
</tr>
<tr>
<td>PRICE_LOW</td>
<td>3</td>
<td>安値</td>
</tr>
<tr>
<td>PRICE_MEDIAN</td>
<td>4</td>
<td>中央値（高値+安値）/ 2</td>
</tr>
<tr>
<td>PRICE_TYPICAL</td>
<td>5</td>
<td>ティピカルプライス（高値+安値+終値）/ 3</td>
</tr>
<tr>
<td>PRICE_WEIGHTED</td>
<td>6</td>
<td>加重終値（高値+安値+終値×2）/ 4</td>
</tr>
</tbody>
</table>
<p>チャート上にCCIインジケーターを表示して比較する場合は、<strong>applied_priceを同じ設定にしないと値がずれる</strong>ので注意してください。標準のCCIは<code>PRICE_TYPICAL</code>を使用しています。</p>
<h2><span id="toc6">基本的な使い方</span></h2>
<p>まずは最もシンプルな使い方を見てみましょう。1本前の確定足のCCI値を取得してコメントに表示する例です。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 1本前の確定足のCCI（期間14、ティピカルプライス）を取得
   double cciValue = iCCI(NULL, 0, 14, PRICE_TYPICAL, 1);
   
   // チャート上にCCI値を表示
   Comment("CCI(14) = ", DoubleToString(cciValue, 2));
}
</code></pre>
<p><strong>ポイント：</strong>shiftに<code>1</code>を指定して確定足の値を使うのが基本です。<code>0</code>（現在の足）はティックごとに値が変動するため、売買シグナルの判定には向きません。</p>
<h2><span id="toc7">CCIクロスで売買するEAを作ろう</span></h2>
<p>ここからが本番です。CCIが<strong>-100を下から上にクロスしたら買い</strong>、<strong>+100を上から下にクロスしたら売り</strong>、<strong>0ラインクロスで決済</strong>するEAを作成します。</p>
<h3><span id="toc8">トレードロジックの整理</span></h3>
<ul>
<li><strong>買いエントリー</strong>：CCI（1本前）が-100以上 かつ CCI（2本前）が-100未満 → -100を上抜け</li>
<li><strong>売りエントリー</strong>：CCI（1本前）が+100以下 かつ CCI（2本前）が+100超 → +100を下抜け</li>
<li><strong>買いポジション決済</strong>：CCIが0を下回った時</li>
<li><strong>売りポジション決済</strong>：CCIが0を上回った時</li>
</ul>
<h3><span id="toc9">完全なEAコード</span></h3>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| CCI Cross EA                                                       |
//+------------------------------------------------------------------+
#property strict

// 入力パラメータ
input int    CCI_Period      = 14;            // CCI期間
input double LotSize         = 0.1;           // ロットサイズ
input int    StopLoss        = 100;           // ストップロス（pips）
input int    TakeProfit      = 200;           // テイクプロフィット（pips）
input int    MagicNumber     = 20240101;      // マジックナンバー

//+------------------------------------------------------------------+
//| Expert tick function                                               |
//+------------------------------------------------------------------+
void OnTick()
{
   // CCI値を取得（確定足を使用）
   double cci1 = iCCI(NULL, 0, CCI_Period, PRICE_TYPICAL, 1); // 1本前
   double cci2 = iCCI(NULL, 0, CCI_Period, PRICE_TYPICAL, 2); // 2本前
   
   // 現在のポジション状態を確認
   int buyCount  = CountPositions(OP_BUY);
   int sellCount = CountPositions(OP_SELL);
   
   // --- 決済ロジック ---
   // 買いポジション保有中：CCIが0を下回ったら決済
   if(buyCount > 0 && cci1 < 0)
   {
      ClosePositions(OP_BUY);
   }
   
   // 売りポジション保有中：CCIが0を上回ったら決済
   if(sellCount > 0 && cci1 > 0)
   {
      ClosePositions(OP_SELL);
   }
   
   // --- エントリーロジック ---
   // ポジションがない場合のみエントリー
   if(buyCount == 0 && sellCount == 0)
   {
      // 買いシグナル：CCIが-100を下から上にクロス
      if(cci2 < -100 &#038;&#038; cci1 >= -100)
      {
         double sl = (StopLoss > 0)   ? Ask - StopLoss * Point * 10 : 0;
         double tp = (TakeProfit > 0)  ? Ask + TakeProfit * Point * 10 : 0;
         
         int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 30, sl, tp,
                                "CCI Buy", MagicNumber, 0, clrBlue);
         if(ticket < 0)
            Print("Buy OrderSend error: ", GetLastError());
      }
      
      // 売りシグナル：CCIが+100を上から下にクロス
      if(cci2 > 100 && cci1 <= 100)
      {
         double sl = (StopLoss > 0)   ? Bid + StopLoss * Point * 10 : 0;
         double tp = (TakeProfit > 0)  ? Bid - TakeProfit * Point * 10 : 0;
         
         int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 30, sl, tp,
                                "CCI Sell", MagicNumber, 0, clrRed);
         if(ticket < 0)
            Print("Sell OrderSend error: ", GetLastError());
      }
   }
}

//+------------------------------------------------------------------+
//| 指定タイプのポジション数をカウント                                    |
//+------------------------------------------------------------------+
int CountPositions(int type)
{
   int count = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == type)
            count++;
      }
   }
   return count;
}

//+------------------------------------------------------------------+
//| 指定タイプのポジションを全て決済                                      |
//+------------------------------------------------------------------+
void ClosePositions(int type)
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == type)
         {
            double closePrice = (type == OP_BUY) ? Bid : Ask;
            if(!OrderClose(OrderTicket(), OrderLots(), closePrice, 30, clrYellow))
               Print("OrderClose error: ", GetLastError());
         }
      }
   }
}
</code></pre>
<h3><span id="toc10">コードのポイント解説</span></h3>
<p><strong>① MagicNumberの活用</strong></p>
<p>MagicNumberを使うことで、このEAが出した注文だけを識別できます。手動注文や他のEAの注文を誤って決済してしまう事故を防げます。</p>
<p><strong>② 確定足（shift=1, 2）でクロスを検出</strong></p>
<p>2本前と1本前の確定足を比較してクロスを検出しています。現在の足（shift=0）を使うと、ティックごとに値が変わるためシグナルが不安定になります。</p>
<p><strong>③ 決済を逆方向ではなく0ラインで行う</strong></p>
<p>CCIが0ラインをクロスした時点で決済することで、利益の取りこぼしを減らす設計になっています。もちろん、SL/TPによる自動決済も併用しています。</p>
<h2><span id="toc11">応用テクニック：マルチタイムフレーム分析</span></h2>
<p>iCCI関数の第2引数（timeframe）を変えるだけで、<strong>上位足のCCIをフィルターとして使う</strong>ことができます。例えば、日足のCCIの方向に合わせてエントリーを絞り込む手法です。</p>
<pre><code class="language-mql4">// 上位足（日足）のCCIでトレンド方向を判定
double cciDaily = iCCI(NULL, PERIOD_D1, 14, PRICE_TYPICAL, 1);

// 現在の時間足のCCIでエントリータイミングを判定
double cciCurrent1 = iCCI(NULL, 0, 14, PRICE_TYPICAL, 1);
double cciCurrent2 = iCCI(NULL, 0, 14, PRICE_TYPICAL, 2);

// 日足CCIが0以上（上昇傾向）の時だけ買いエントリー
if(cciDaily > 0 && cciCurrent2 < -100 &#038;&#038; cciCurrent1 >= -100)
{
   // 買いエントリー処理
}

// 日足CCIが0以下（下降傾向）の時だけ売りエントリー
if(cciDaily < 0 &#038;&#038; cciCurrent2 > 100 && cciCurrent1 <= 100)
{
   // 売りエントリー処理
}
</code></pre>
<p>上位足のトレンド方向に逆らわないことで、ダマシのシグナルを大幅に減らすことが期待できます。</p>
<h2><span id="toc12">iCCI関数を使う際の注意点</span></h2>
<h3><span id="toc13">1. applied_priceの不一致に注意</span></h3>
<p>チャート上に表示しているCCIインジケーターと、iCCI関数で指定した<code>applied_price</code>が異なると、値がずれます。検証時は必ず同じ設定にしましょう。標準のCCIは<code>PRICE_TYPICAL</code>です。</p>
<h3><span id="toc14">2. レンジ相場での連続シグナルに注意</span></h3>
<p>CCIはモメンタム指標なので、レンジ相場では±100ラインを頻繁に行き来し、ダマシが多発します。移動平均線やADXなどのトレンドフィルターを組み合わせることをおすすめします。</p>
<h3><span id="toc15">3. 計算に必要なバー数</span></h3>
<p>CCIの計算には、指定した期間分のローソク足データが必要です。チャートのバー数が少ないと正確な値が得られません。バックテスト時は十分なヒストリカルデータを用意してください。</p>
<h2><span id="toc16">まとめ</span></h2>
<p>今回はMQL4の<strong>iCCI関数</strong>の使い方を、基本から実践的なEA作成まで解説しました。</p>
<ul>
<li><strong>iCCI関数</strong>は5つのパラメータでCCIの値を簡単に取得できる</li>
<li><strong>±100ラインのクロス</strong>をエントリーシグナルに、<strong>0ラインクロス</strong>を決済シグナルに使うのが王道的な手法</li>
<li><strong>確定足（shift=1以上）</strong>を使ってシグナル判定するのが安定した運用のコツ</li>
<li><strong>マルチタイムフレーム分析</strong>で上位足のトレンド方向にフィルターをかけると精度が向上する</li>
<li><strong>applied_price</strong>はチャート上のインジケーターと合わせることを忘れずに</li>
</ul>
<p>CCIはシンプルながら奥が深いインジケーターです。まずはサンプルEAをストラテジーテスターで動かしてみて、パラメータを変えながらCCIの振る舞いを体感してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13025/%e3%80%90mql4%e3%80%91icci%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81cci%ef%bc%88%e5%95%86%e5%93%81%e3%83%81%e3%83%a3%e3%83%8d%e3%83%ab/">【MQL4】iCCI関数の使い方を徹底解説！CCI（商品チャネル指数）でトレンド転換を捉えるEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iStochastic関数の使い方を完全解説！ストキャスティクスを使ったEAサンプル付き</title>
		<link>https://mql-programing.com/archives/13022/%e3%80%90mql4%e3%80%91istochastic%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%b9%e3%83%88%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%86/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[EA自動売買]]></category>
		<category><![CDATA[iStochastic]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[ストキャスティクス]]></category>
		<category><![CDATA[テクニカルインジケーター]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13022</guid>

					<description><![CDATA[<p>ストキャスティクスは、相場の「買われすぎ」「売られすぎ」を判断するための代表的なオシレーター系インジケーターです。MQL4ではiStochastic関数を使うことで、EA（自動売買プログラム）やカスタムインジケーターの中 [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13022/%e3%80%90mql4%e3%80%91istochastic%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%b9%e3%83%88%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%86/">【MQL4】iStochastic関数の使い方を完全解説！ストキャスティクスを使ったEAサンプル付き</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>ストキャスティクスは、相場の「買われすぎ」「売られすぎ」を判断するための代表的なオシレーター系インジケーターです。MQL4では<strong>iStochastic関数</strong>を使うことで、EA（自動売買プログラム）やカスタムインジケーターの中からストキャスティクスの値を簡単に取得できます。</p>
<p>この記事では、iStochastic関数の書式・引数をひとつずつ丁寧に解説し、最後にストキャスティクスのクロスで売買する実践的なEAサンプルを紹介します。</p>
<h2><span id="toc1">ストキャスティクスとは？</span></h2>
<p>ストキャスティクス（Stochastic Oscillator）は、一定期間の価格レンジの中で現在の価格がどの位置にあるかを0〜100の数値で示すテクニカル指標です。</p>
<h3><span id="toc2">3本のラインを理解しよう</span></h3>
<p>ストキャスティクスには以下の3種類のラインがあります。</p>
<ul>
<li><strong>%K（Fast %K）</strong>：直近の価格が一定期間の高値・安値レンジのどこに位置するかを示す、最も感度の高いライン</li>
<li><strong>%D（Fast %D / Slow %K）</strong>：%Kを移動平均で平滑化したライン。MetaTrader4のストキャスティクスではこれがメインラインになります</li>
<li><strong>Slow %D（シグナルライン）</strong>：%Dをさらに移動平均で平滑化したライン</li>
</ul>
<h3><span id="toc3">80と20のレベルライン</span></h3>
<p>一般的に、ストキャスティクスの値が<strong>80以上</strong>になると「買われすぎ」、<strong>20以下</strong>になると「売られすぎ」と判断します。この水準でのラインのクロスが売買シグナルとしてよく使われます。</p>
<h2><span id="toc4">iStochastic関数の書式と引数を完全解説</span></h2>
<p>iStochastic関数の書式は以下のとおりです。</p>
<pre><code class="language-mql4">double iStochastic(
   string       symbol,        // ① 通貨ペア
   int          timeframe,     // ② 時間足
   int          Kperiod,       // ③ %K期間
   int          Dperiod,       // ④ %D期間
   int          slowing,       // ⑤ スローイング
   int          method,        // ⑥ 移動平均の種類
   int          price_field,   // ⑦ 価格フィールド
   int          mode,          // ⑧ 取得するライン
   int          shift          // ⑨ シフト（何本前のバーか）
);</code></pre>
<p>引数が9つもあるので少し多く感じますが、一つずつ見ていきましょう。</p>
<h3><span id="toc5">① symbol（通貨ペア）</span></h3>
<p>値を取得したい通貨ペアを文字列で指定します。現在のチャートの通貨ペアを使う場合は<code>NULL</code>または<code>Symbol()</code>と書きます。</p>
<h3><span id="toc6">② timeframe（時間足）</span></h3>
<p>時間足を定数で指定します。現在のチャートの時間足を使う場合は<code>0</code>または<code>PERIOD_CURRENT</code>と書きます。主な定数は以下のとおりです。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>時間足</th>
</tr>
</thead>
<tbody>
<tr>
<td>PERIOD_M1</td>
<td>1分足</td>
</tr>
<tr>
<td>PERIOD_M5</td>
<td>5分足</td>
</tr>
<tr>
<td>PERIOD_M15</td>
<td>15分足</td>
</tr>
<tr>
<td>PERIOD_M30</td>
<td>30分足</td>
</tr>
<tr>
<td>PERIOD_H1</td>
<td>1時間足</td>
</tr>
<tr>
<td>PERIOD_H4</td>
<td>4時間足</td>
</tr>
<tr>
<td>PERIOD_D1</td>
<td>日足</td>
</tr>
<tr>
<td>PERIOD_W1</td>
<td>週足</td>
</tr>
</tbody>
</table>
<h3><span id="toc7">③ Kperiod（%K期間）</span></h3>
<p>%Kラインの計算に使う期間です。一般的には<strong>5</strong>や<strong>14</strong>がよく使われます。</p>
<h3><span id="toc8">④ Dperiod（%D期間）</span></h3>
<p>%Kを平滑化して%Dを求める際の移動平均の期間です。一般的には<strong>3</strong>がよく使われます。</p>
<h3><span id="toc9">⑤ slowing（スローイング）</span></h3>
<p>スローストキャスティクスのスローイング値です。<strong>1</strong>にするとファスト、<strong>3</strong>にするとスローストキャスティクスになります。通常は<strong>3</strong>を指定します。</p>
<h3><span id="toc10">⑥ method（移動平均の種類）</span></h3>
<p>%Dラインの平滑化に使用する移動平均の種類を指定します。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>種類</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_SMA</td>
<td>単純移動平均（最も一般的）</td>
</tr>
<tr>
<td>MODE_EMA</td>
<td>指数移動平均</td>
</tr>
<tr>
<td>MODE_SMMA</td>
<td>平滑移動平均</td>
</tr>
<tr>
<td>MODE_LWMA</td>
<td>線形加重移動平均</td>
</tr>
</tbody>
</table>
<h3><span id="toc11">⑦ price_field（価格フィールド）</span></h3>
<p>ストキャスティクスの計算に使う価格の種類です。</p>
<table>
<thead>
<tr>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>高値/安値（Low/High）を使用 ※一般的</td>
</tr>
<tr>
<td>1</td>
<td>終値（Close/Close）を使用</td>
</tr>
</tbody>
</table>
<p>通常は<strong>0（高値/安値）</strong>を使います。</p>
<h3><span id="toc12">⑧ mode（取得するライン）</span></h3>
<p>どのラインの値を取得するかを指定します。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_MAIN（= 0）</td>
<td>メインライン（%D）</td>
</tr>
<tr>
<td>MODE_SIGNAL（= 1）</td>
<td>シグナルライン（Slow %D）</td>
</tr>
</tbody>
</table>
<h3><span id="toc13">⑨ shift（シフト）</span></h3>
<p>何本前のバーの値を取得するかを指定します。<strong>0</strong>で現在のバー、<strong>1</strong>で1本前のバー（確定済み）です。</p>
<h2><span id="toc14">基本的な使い方</span></h2>
<p>まずはストキャスティクスの値を取得してチャートに表示するシンプルなコードを見てみましょう。</p>
<pre><code class="language-mql4">#property strict

void OnTick()
{
   // メインライン（%D）を取得 - 1本前の確定バー
   double stochMain = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);

   // シグナルライン（Slow %D）を取得 - 1本前の確定バー
   double stochSignal = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1);

   // チャートに表示
   Comment("Stochastic Main: ", DoubleToString(stochMain, 2),
           "\nStochastic Signal: ", DoubleToString(stochSignal, 2));
}</code></pre>
<p>このコードでは、期間5・3・3のスローストキャスティクス（SMA）のメインラインとシグナルラインの値を取得し、Comment関数でチャート左上に表示しています。shift=1を指定しているので、確定済みの1本前のバーの値を取得しています。</p>
<h2><span id="toc15">実践サンプルEA ― ストキャスティクスのクロスで売買</span></h2>
<p>ここからは、ストキャスティクスのゴールデンクロス（買いシグナル）とデッドクロス（売りシグナル）で売買する実践的なEAを作ってみましょう。</p>
<h3><span id="toc16">売買ルール</span></h3>
<ul>
<li><strong>買いエントリー</strong>：ストキャスティクスが20以下のゾーンで、メインラインがシグナルラインを下から上にクロス（ゴールデンクロス）</li>
<li><strong>売りエントリー</strong>：ストキャスティクスが80以上のゾーンで、メインラインがシグナルラインを上から下にクロス（デッドクロス）</li>
<li>既にポジションがある場合は新規エントリーしない</li>
</ul>
<h3><span id="toc17">EAの完全なコード</span></h3>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//|                                          StochasticCrossEA.mq4   |
//|                         ストキャスティクス クロスEA サンプル        |
//+------------------------------------------------------------------+
#property strict

// --- 入力パラメータ ---
input int    KPeriod      = 5;       // %K期間
input int    DPeriod      = 3;       // %D期間
input int    Slowing      = 3;       // スローイング
input double UpperLevel   = 80.0;    // 上限レベル（売られすぎ判定）
input double LowerLevel   = 20.0;    // 下限レベル（買われすぎ判定）
input double LotSize      = 0.1;     // ロットサイズ
input int    StopLoss     = 100;     // ストップロス（pips）
input int    TakeProfit   = 200;     // テイクプロフィット（pips）
input int    MagicNumber  = 12345;   // マジックナンバー

// --- 新バー判定用変数 ---
datetime lastBarTime = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                     |
//+------------------------------------------------------------------+
int OnInit()
{
   Print("StochasticCrossEA が初期化されました");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 新しいバーが生成されたか判定する関数                                  |
//+------------------------------------------------------------------+
bool IsNewBar()
{
   datetime currentBarTime = iTime(NULL, 0, 0);
   if(lastBarTime != currentBarTime)
   {
      lastBarTime = currentBarTime;
      return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| 現在のポジション数を取得する関数                                     |
//+------------------------------------------------------------------+
int CountPositions(int type)
{
   int count = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if(OrderType() == type)
               count++;
         }
      }
   }
   return count;
}

//+------------------------------------------------------------------+
//| Expert tick function                                               |
//+------------------------------------------------------------------+
void OnTick()
{
   // 新しいバーが確定したときだけ処理
   if(!IsNewBar())
      return;

   // --- ストキャスティクスの値を取得 ---
   // 1本前（確定済み）のメインライン
   double mainCurr   = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_MAIN, 1);
   // 1本前（確定済み）のシグナルライン
   double signalCurr = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_SIGNAL, 1);
   // 2本前のメインライン
   double mainPrev   = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_MAIN, 2);
   // 2本前のシグナルライン
   double signalPrev = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_SIGNAL, 2);

   // --- ゴールデンクロス判定（買いシグナル） ---
   bool goldenCross = (mainPrev < signalPrev) &#038;&#038; (mainCurr > signalCurr);

   // --- デッドクロス判定（売りシグナル） ---
   bool deadCross = (mainPrev > signalPrev) && (mainCurr < signalCurr);

   // --- 買いエントリー ---
   if(goldenCross &#038;&#038; mainCurr < LowerLevel &#038;&#038; CountPositions(OP_BUY) == 0)
   {
      double sl = NormalizeDouble(Ask - StopLoss * Point, Digits);
      double tp = NormalizeDouble(Ask + TakeProfit * Point, Digits);

      int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                              "Stoch GoldenCross", MagicNumber, 0, clrBlue);
      if(ticket > 0)
         Print("買い注文成功: チケット=", ticket);
      else
         Print("買い注文失敗: エラー=", GetLastError());
   }

   // --- 売りエントリー ---
   if(deadCross && mainCurr > UpperLevel && CountPositions(OP_SELL) == 0)
   {
      double sl = NormalizeDouble(Bid + StopLoss * Point, Digits);
      double tp = NormalizeDouble(Bid - TakeProfit * Point, Digits);

      int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                              "Stoch DeadCross", MagicNumber, 0, clrRed);
      if(ticket > 0)
         Print("売り注文成功: チケット=", ticket);
      else
         Print("売り注文失敗: エラー=", GetLastError());
   }

   // --- チャート表示 ---
   Comment("Main[1]: ", DoubleToString(mainCurr, 2),
           "  Signal[1]: ", DoubleToString(signalCurr, 2),
           "\nMain[2]: ", DoubleToString(mainPrev, 2),
           "  Signal[2]: ", DoubleToString(signalPrev, 2));
}</code></pre>
<h2><span id="toc18">サンプルコードのポイント解説</span></h2>
<h3><span id="toc19">ポイント1：新バー判定で無駄な処理を防ぐ</span></h3>
<p><code>IsNewBar()</code>関数を使い、新しいバーが確定したタイミングでのみ売買判定を行っています。OnTick()はティックごとに呼ばれるため、そのまま処理すると同じバーで何度もシグナルを検出してしまいます。新バー判定を入れることで、確定した値に基づく安定したシグナル検出ができます。</p>
<h3><span id="toc20">ポイント2：2本のバーでクロスを検出する</span></h3>
<p>クロスの判定には、<strong>1本前（shift=1）</strong>と<strong>2本前（shift=2）</strong>の値を比較しています。</p>
<pre><code class="language-mql4">// ゴールデンクロス：2本前は「メイン ＜ シグナル」→ 1本前は「メイン ＞ シグナル」
bool goldenCross = (mainPrev < signalPrev) &#038;&#038; (mainCurr > signalCurr);

// デッドクロス：2本前は「メイン ＞ シグナル」→ 1本前は「メイン ＜ シグナル」
bool deadCross = (mainPrev > signalPrev) && (mainCurr < signalCurr);</code></pre>
<p>shift=0（現在のバー）を使うと、バーが確定するまで値が変動し続けるため、誤ったシグナルが出る可能性があります。確定済みのshift=1とshift=2を使うのが安全です。</p>
<h3><span id="toc21">ポイント3：ゾーンフィルタでダマシを減らす</span></h3>
<p>単純なクロスだけではダマシ（偽シグナル）が多くなります。そこで、<strong>買いはLowerLevel（20）以下のゾーン</strong>、<strong>売りはUpperLevel（80）以上のゾーン</strong>でのみエントリーするフィルタを入れています。売られすぎ・買われすぎの極端な領域でのクロスに絞ることで、シグナルの精度を高めています。</p>
<h2><span id="toc22">カスタマイズのヒント</span></h2>
<h3><span id="toc23">マルチタイムフレーム分析</span></h3>
<p>iStochastic関数の第2引数（timeframe）を変えることで、異なる時間足のストキャスティクスを取得できます。例えば、日足のトレンド方向を確認してからエントリーするといった使い方が可能です。</p>
<pre><code class="language-mql4">// 日足のストキャスティクスを取得
double dailyMain = iStochastic(NULL, PERIOD_D1, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);

// 日足が50以上なら上昇傾向 → 買いのみエントリーする、など
if(dailyMain > 50.0 && goldenCross && mainCurr < LowerLevel)
{
   // 買いエントリー処理
}</code></pre>
<h3><span id="toc24">他のインジケーターとの併用</span></h3>
<p>ストキャスティクス単体よりも、移動平均線（iMA関数）やRSI（iRSI関数）など他のインジケーターと組み合わせることで、より信頼性の高い売買ルールを構築できます。例えば、移動平均線の上にいるときだけ買いシグナルを採用する、といったフィルタが考えられます。</p>
<h3><span id="toc25">ストラテジーテスターで最適化</span></h3>
<p>KPeriod、DPeriod、Slowing、UpperLevel、LowerLevelなどのパラメータは、MetaTraderのストラテジーテスターで最適化できます。input変数として宣言しているので、テスターの最適化機能でベストな組み合わせを探してみましょう。ただし、過剰最適化（カーブフィッティング）には注意が必要です。</p>
<h2><span id="toc26">まとめ</span></h2>
<p>この記事で学んだポイントを整理します。</p>
<ol>
<li><strong>iStochastic関数</strong>は9つの引数を持ち、MQL4からストキャスティクスの値を取得できる関数です</li>
<li><strong>MODE_MAIN</strong>でメインライン（%D）、<strong>MODE_SIGNAL</strong>でシグナルライン（Slow %D）を取得します</li>
<li><strong>price_field</strong>は通常0（高値/安値ベース）を使い、1（終値ベース）との違いを理解しておきましょう</li>
<li>クロス判定にはshift=1とshift=2の<strong>確定済みバー</strong>を使うのが安全です</li>
<li>80/20のゾーンフィルタやマルチタイムフレーム分析を組み合わせることで、<strong>ダマシを減らして精度を向上</strong>させることができます</li>
</ol>
<p>ストキャスティクスはシンプルながら強力なオシレーター指標です。まずは今回のサンプルEAをストラテジーテスターで動かして、パラメータを変えながら挙動を確認してみてください。実際に手を動かすことで、iStochastic関数の使い方がしっかり身につくはずです！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13022/%e3%80%90mql4%e3%80%91istochastic%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%b9%e3%83%88%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%86/">【MQL4】iStochastic関数の使い方を完全解説！ストキャスティクスを使ったEAサンプル付き</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】OrderType関数の使い方！買いと売りを判別しよう</title>
		<link>https://mql-programing.com/archives/2111/ordertype/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 13 Oct 2021 03:12:29 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[OrderType]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[注文]]></category>
		<category><![CDATA[自動売買]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=2111</guid>

					<description><![CDATA[<p>OrderType関数とは 「自動売買が買いポジションを決済するタイミングで、売りポジションを決済してしまった！」 そういう方は、買いポジションと売りポジションを、正しく判別できていない可能性があります。 　 買いと売り [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/2111/ordertype/">【MQL4関数】OrderType関数の使い方！買いと売りを判別しよう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/2021/10/アイコン.png" alt="朝日奈りさ" class="speech-icon-image"/></figure><div class="speech-name">朝日奈りさ</div></div><div class="speech-balloon">
<p>買いポジションを決済するロジックなのに、売りポジションを決済しちゃった！どうすれば防げるんだろう？</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc1">OrderType関数とは</span></h2>



<p><strong>「自動売買が買いポジションを決済するタイミングで、売りポジションを決済してしまった！」</strong></p>



<p>そういう方は、買いポジションと売りポジションを、正しく判別できていない可能性があります。</p>



<p>　</p>



<p><strong><span class="marker-under-red">買いと売りを正しく判別できていない場合、買いポジションを決済するつもりが、売りポジションを決済</span><span class="marker-under-red">してしまった</span><span class="marker-under-red">ということが起こってしまいます。</span></strong></p>



<p>そこで、OrderType関数を使って、ポジションの種類を判別し、ポジションを正しく決済させましょう！</p>



<p>　</p>



<p><strong>OrderType関数は、ポジションの種類を返す関数です。</strong></p>



<p>ポジションの種類を取得することで、買いと売りの判別ができるようになります。</p>



<p>判別ができることで、自動売買が決済するときに、<strong><span class="marker-under-red">ポジションを間違えずに決済することができます。</span></strong></p>



<p>実行することで、ポジションが「買い」なのか「売り」なのかを判別することができるので、自動売買には必須の関数と言えるでしょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc2">OrderType関数の書き方</span></h2>



<p>OrderType関数の使い方は、基本的な関数と同じです。</p>



<p>関数をマスターしていない方はこちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/function/" title="【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/cocoon-resources/blog-card-cache/624de21c236a113367001dd95952af29.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり</div><div class="blogcard-snippet external-blogcard-snippet">関数とは？ 「プログラムは、何度も同じことを書かないといけない」 と思っている方、ぜひ関数を使ってみてください。 関数とは、何度も繰り返すプログラムを、まとめた状態のものです。 事前に、まとまりを作っておくことで、同じプ</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/183/function/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc3">基本的な書き方</span></h3>



<p>OrderType関数はとてもシンプルな関数です。</p>



<p>引数なしで実行できます。</p>



<p><strong>ただし、OrderType関数を実行する前に、ポジションを選択しておく必要があります。</strong></p>



<p>そのため、<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】OrderSelect関数の使い方！保有ポジションの選択のやり方">OrderSelect関数</a>を実行してポジションを選択しておきましょう。</p>



<p>　</p>



<p>OrderType関数の基本的な書き方は以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>int orderType = OrderType();</code></pre></div>



<p>　</p>



<p>返り値は int型です。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc4">OrderType関数を実行する前に、ポジションを選択しておく</span></h3>



<p>OrderType関数は、事前にポジションを選択しないと実行することができません。</p>



<p><strong><span class="marker-under-red">そのため、OrderTypeを実行する前に、ポジションを選択しておきましょう。</span></strong></p>



<p>ポジションを選択するには、<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】OrderSelect関数の使い方！保有ポジションの選択のやり方">OrderSelect関数</a>を使います。</p>



<p>　</p>



<p><strong>必ず OrderSelect関数 → OrderType関数 の順にプログラムする</strong>ので、以下のようなプログラムになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//保有ポジションを一つ選択
if(OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
   {

   //選択したポジションが、買いポジションなのかチェック
   if(OrderType() == OP_BUY)
   {

      //ここにポジションを決済するプログラムを書く

   }
   }</code></pre></div>



<p>　</p>



<p>このように、OrderType関数を実行する前に、ポジションを選択しておくようにしましょう。</p>



<p>ちなみに if文の条件式に「OP_BUY」と書いていますが、<strong>OP_BUYは買いポジションの定数です。</strong></p>



<p>OrderType関数の返り値は、<a href="https://mql-programing.com/ordertype_op/">OP_BUY</a>のような定数が入っているので、判別ができるというわけですね。</p>



<p>　</p>



<p>OrderSelect関数でポジションを選択し、OrderType関数で選択したポジションの種類を取得します。</p>



<p>ポジションの種類を取得することで、別のポジションを決済してしまうことを防ぐことが可能です。</p>



<p>　</p>



<p>OrderSelect関数は、こちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】OrderSelect関数の使い方！保有ポジションの選択のやり方" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://i0.wp.com/mql-programing.com/main29/wp-content/uploads/2021/04/OrderSelect.jpg?fit=1200%2C675&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQL4関数】OrderSelect関数の使い方！保有ポジションの選択のやり方</div><div class="blogcard-snippet external-blogcard-snippet">目次 OrderSelect関数とはOrderSelect関数の書き方基本的な書き方返り値（戻り値）引数①index②select③poolOrderSelect関数の具体的な使い方（サンプルあり）まとめ OrderSe</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/712/orderselect/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc5">返り値（戻り値）</span></h3>



<p>OrderType関数の返り値は int型です。</p>



<p>返り値には、「買い」なのか「売り」なのかの定数が入っています。</p>



<p>定数は6種類あり、「買い指値」や「売り指値」なども判別することができます。</p>



<p>定数の種類はこちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/ordertype_op/" title="【MQL4定数】注文種別の定数（OP_BUY ,OP_SELL）" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://i0.wp.com/mql-programing.com/main29/wp-content/uploads/2021/09/ordertype_op.jpg?fit=1200%2C675&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQL4定数】注文種別の定数（OP_BUY ,OP_SELL）</div><div class="blogcard-snippet external-blogcard-snippet">目次 注文種別の定数注文種別の定数（OP_BUY ,OP_SELL）注文種別の定数の使い方 注文種別の定数 主にOrderSend関数の引数で使われる定数です。 定数を使わずに数値を入力しても、同様の結果が得られます。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/1340/ordertype_op/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<p>基本的には、OP_BUY もしくは OP_SELL を使用することが多いです。</p>



<p>OP_BUY と OP_SELL だけ覚えてしまいましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc6">引数</span></h3>



<p>なし</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc7">OrderType関数の具体的な使い方（サンプルあり）</span></h2>



<p>先ほど、OrderSelect関数と組み合わせましたが、さらに他の関数とも組み合わせます。</p>



<p>上記の例では、ポジションを１つだけ選択して、ポジションの種類を取得していましたが、全てのポジションの種類を取得してみます。</p>



<p><strong>全てのポジションの種類を取得するためには、for文を使って全てのポジションをチェックします。</strong></p>



<p>そのとき、for文の条件式に保有ポジション数が必要となりますので、<a href="https://mql-programing.com/orderstotal/" title="【MQL4関数】OrdersTotal関数の使い方！保有ポジション数の取得のやり方">OrdersTotal関数</a>と組み合わせて使ってみましょう。</p>



<p>例えば、以下のようなプログラムです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//保有ポジションを一つずつチェックしていく
for( int i = OrdersTotal() - 1; i &gt;= 0; i--)
   {

    //保有ポジションを一つ選択
    if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES))
        {

            //選択したポジションが、買いポジションなのかチェック
            if( OrderType() == OP_BUY)
            {

            //ここにポジションを決済するプログラムを書く

            }
        }
   }</code></pre></div>



<p>　</p>



<p>以下は、上記のロジックを組み込んだサンプルプログラムの全体像です。買いポジションだけを検出してログに出力する例になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//+------------------------------------------------------------------+
//| OrderType関数サンプル                                              |
//+------------------------------------------------------------------+
void OnTick()
{
   //保有ポジションを一つずつチェックしていく
   for( int i = OrdersTotal() - 1; i &gt;= 0; i--)
   {
      //保有ポジションを一つ選択
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES))
      {
         //選択したポジションが、買いポジションなのかチェック
         if( OrderType() == OP_BUY)
         {
            Print("買いポジションを検出しました。チケット番号: ", OrderTicket());

            //ここにポジションを決済するプログラムを書く
         }

         //選択したポジションが、売りポジションなのかチェック
         if( OrderType() == OP_SELL)
         {
            Print("売りポジションを検出しました。チケット番号: ", OrderTicket());

            //ここにポジションを決済するプログラムを書く
         }
      }
   }
}</code></pre></div>



<p>　</p>



<div class="wp-block-cocoon-blocks-button-1 button-block"><a href="https://mql-programing.com/download/2118/" class="btn btn-l btn-circle" target="_self">サンプルプログラムはこちら</a></div>



<p>　</p>



<p>このように書くことで、全てのポジションをチェックし、その中から買いポジションだけを選択することができます。</p>



<p>この書き方は、自動売買を作るときによく使う書き方なので、どこかにコピーしておくと良いでしょう。</p>



<p>　</p>



<p>OrdersTotal関数の使い方は、以下の記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/orderstotal/" title="【MQL4関数】OrdersTotal関数の使い方！保有ポジション数の取得のやり方" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://i0.wp.com/mql-programing.com/main29/wp-content/uploads/2021/04/OrdersTotal.jpg?fit=1200%2C675&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQL4関数】OrdersTotal関数の使い方！保有ポジション数の取得のやり方</div><div class="blogcard-snippet external-blogcard-snippet">目次 OrdersTotal関数とはOrdersTotal関数の使用方法と注意点まとめ OrdersTotal関数とは 自動売買でトレードするとき、保有ポジション数をチェックしたいですよね！ そのときに OrdersTo</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/705/orderstotal/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc8">まとめ</span></h2>



<p><strong>OrderType関数は、保有ポジションが買いなのか売りなのかを取得する関数です。</strong></p>



<p>自動売買が決済するタイミングで、OrderType関数で買いと売りを判別しないと、間違ったポジションを決済する可能性があります。</p>



<p>使い方としては、OrderSelect関数で事前にポジションを選択する必要がありますので、注意しましょう。</p>



<p>また、上記で紹介したサンプルプログラムは、どの自動売買でも基本となる書き方なので、コピーしておくと良いでしょう。</p>



<p><strong><span class="marker-under-red">「決済するポジションがおかしい」</span></strong>ということが無くなるように、自動売買を作っていきましょう！</p>



<p>　</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/make_autotrade_by_myself/" title="【MQL4プログラミング】自動売買の作り方！FXで使えるテンプレートあり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://i0.wp.com/mql-programing.com/main29/wp-content/uploads/2021/09/make_autotrade_by_myself.jpg?fit=1200%2C675&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQL4プログラミング】自動売買の作り方！FXで使えるテンプレートあり</div><div class="blogcard-snippet external-blogcard-snippet">目次 はじめにFX自動売買とはFX自動売買を作るための準備FX自動売買の作り方口座凍結の対策をするプログラムテンプレートを作る決済ロジックをプログラミングするプログラムテンプレートを作るエントリーロジックをプログラミング</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/1605/make_autotrade_by_myself/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/mql-reference/?elementor-preview=1202&#038;ver=1634090664#toc78" title="MQL4リファレンス【全データ一覧】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-160x90.jpg 160w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-300x169.jpg 300w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-1024x576.jpg 1024w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-768x432.jpg 768w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-120x68.jpg 120w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-320x180.jpg 320w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス.jpg 1120w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">MQL4リファレンス【全データ一覧】</div><div class="blogcard-snippet internal-blogcard-snippet">/*! elementor - v3.6.5 - 27-04-2022 */.e-container.e-container--row .elementor-spacer-inner{width:var(--spacer-size)}.e-</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>
<p>投稿 <a href="https://mql-programing.com/archives/2111/ordertype/">【MQL4関数】OrderType関数の使い方！買いと売りを判別しよう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】OrderOpenPrice関数の使い方！エントリーした価格の取得方法</title>
		<link>https://mql-programing.com/archives/950/orderopenprice/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 22 Sep 2021 06:43:28 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[OrderOpenPrice]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[注文]]></category>
		<category><![CDATA[自動売買]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=950</guid>

					<description><![CDATA[<p>OrderOpenPrice関数とは OrderOpenPrice関数は、ポジションの価格を取得する関数です。 基本的に、この関数単体で使うことはなく、OrderClose関数などと組み合わせて使います。 いろんな場面で [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/950/orderopenprice/">【MQL4関数】OrderOpenPrice関数の使い方！エントリーした価格の取得方法</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/2021/10/アイコン.png" alt="朝日奈りさ" class="speech-icon-image"/></figure><div class="speech-name">朝日奈りさ</div></div><div class="speech-balloon">
<p>エントリーした価格を取得するにはどうしたらいいの？</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc1">OrderOpenPrice関数とは</span></h2>



<p><strong>OrderOpenPrice関数は、ポジションの価格を取得する関数です。</strong></p>



<p>基本的に、この関数単体で使うことはなく、<a href="https://mql-programing.com/orderclose/" title="【MQL4関数】決済注文の出し方（OrderClose関数）とサンプルプログラム">OrderClose関数</a>などと組み合わせて使います。</p>



<p>いろんな場面で使う関数なので、覚えておくと良いでしょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc2">OrderOpenPrice関数の書き方</span></h2>



<p>OrderOpenPrice関数の使い方は、基本的な関数と同じです。</p>



<p>関数をマスターしていない方はこちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/function/" title="【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/cocoon-resources/blog-card-cache/624de21c236a113367001dd95952af29.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり</div><div class="blogcard-snippet external-blogcard-snippet">関数とは？ 「プログラムは、何度も同じことを書かないといけない」 と思っている方、ぜひ関数を使ってみてください。 関数とは、何度も繰り返すプログラムを、まとめた状態のものです。 事前に、まとまりを作っておくことで、同じプ</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/183/function/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc3">基本的な書き方</span></h3>



<p>OrderOpenPrice関数の基本的な書き方は以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>double orderOpenPrice = OrderOpenPrice();</code></pre></div>



<p>　</p>



<p>返り値はdouble型で引数はありません。</p>



<p>返り値を見ていきましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc4">返り値（戻り値）</span></h3>



<p><strong>OrderOpenPrice関数の返り値はdouble型です。</strong></p>



<p>具体的には、エントリーしているポジションの価格が返ってきます。</p>



<p>例えば、「105.000円」でエントリーしているポジションの場合、「105.000」が返ってきます。</p>



<p><strong><span class="marker-under-red">そのため、ポジションの価格情報が必要な場合、OrderOpenPrice関数を使うことで、簡単に取得することができます。</span></strong></p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc5">OrderOpenPrice関数の具体的な使い方</span></h2>



<p>それでは、OrderOpenPrice関数の具体的な使い方を見ていきましょう。</p>



<p>OrderOpenPrice関数は、主に <a href="https://mql-programing.com/orderclose/" title="【MQL4関数】決済注文の出し方（OrderClose関数）とサンプルプログラム">OrderClose関数</a>や <a href="https://mql-programing.com/ordermofidy/" title="【MQL4関数】ポジションの変更注文の出し方（OrderModify 関数）">OrderModify関数</a>を実行するときに使います。</p>



<p>具体的には以下のようなプログラムです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//保有ポジションを一つ選択
    if(OrderSelect(10, SELECT_BY_POS, MODE_TRADES))
       {

        //ポジションのエントリー価格を取得
        double orderOpenPrice = OrderOpenPrice();

        //変更注文を出す
        bool orderModify = OrderModify(OrderTicket(), orderOpenPrice, OrderStopLoss(), 110.000, OrderExpiration(), clrRed);
       }
   }
</code></pre></div>



<p>　</p>



<div class="wp-block-cocoon-blocks-button-1 button-block"><a href="https://mql-programing.com/download/1181/" class="btn btn-l btn-circle" target="_blank">OrderClose関数のサンプルプログラムはこちら</a></div>



<div class="wp-block-cocoon-blocks-button-1 button-block"><a href="https://mql-programing.com/download/1181/" class="btn btn-l btn-circle" target="_blank">OrderModify関数のサンプルプログラムはこちら</a></div>



<p>　</p>



<p>まずは、OrderSelect関数でポジションを選択します。</p>



<p>その後、OrderOpenPrice関数で、ポジションのエントリー価格を取得します。</p>



<p>最後にOrderModify関数で、変更注文を出すというプログラムです。</p>



<p>このように変更注文（<a href="https://mql-programing.com/ordermofidy/" title="【MQL4関数】ポジションの変更注文の出し方（OrderModify 関数）">OrderModify関数</a>）や決済注文（<a href="https://mql-programing.com/orderclose/" title="【MQL4関数】決済注文の出し方（OrderClose関数）とサンプルプログラム">OrderClose関数</a>）を実行するときに、とても便利な関数なので、覚えておくとスムーズにプログラミングできます。</p>



<p>OrderClose関数でも同じような使い方をしますので、サンプルプログラムを見てみてください。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc6">まとめ</span></h2>



<p><strong>OrderOpenPriceはポジションのエントリー価格を取得する関数です。</strong></p>



<p>実行する前に、ポジションを選択する必要があります。（<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】保有ポジションの選択（OrderSelect関数）のやり方">OrderSelect関数</a>）</p>



<p>また、OrderOpenPrice関数は単体で使うことはありません。</p>



<p>変更注文（<a href="https://mql-programing.com/ordermofidy/" title="【MQL4関数】ポジションの変更注文の出し方（OrderModify 関数）">OrderModify関数</a>）や決済注文（<a href="https://mql-programing.com/orderclose/" title="【MQL4関数】決済注文の出し方（OrderClose関数）とサンプルプログラム">OrderClose関数</a>）を実行するときに、組み合わせて使われます。</p>



<p>サンプルプログラムを見ながら、少しづつ関数をマスターしていきましょう！</p>



<p>　</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/make_autotrade_by_myself/" title="【MQL4プログラミング】自動売買の作り方！FXで使えるテンプレートあり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://i0.wp.com/mql-programing.com/main29/wp-content/uploads/2021/09/make_autotrade_by_myself.jpg?fit=1200%2C675&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQL4プログラミング】自動売買の作り方！FXで使えるテンプレートあり</div><div class="blogcard-snippet external-blogcard-snippet">目次 はじめにFX自動売買とはFX自動売買を作るための準備FX自動売買の作り方口座凍結の対策をするプログラムテンプレートを作る決済ロジックをプログラミングするプログラムテンプレートを作るエントリーロジックをプログラミング</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/1605/make_autotrade_by_myself/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/order-relation/" title="注文関係の記事一覧" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-160x90.png 160w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-300x169.png 300w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-1024x576.png 1024w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-768x432.png 768w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-1536x864.png 1536w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-2048x1152.png 2048w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-120x68.png 120w, https://mql-programing.com/main29/wp-content/uploads/2021/04/order-relation-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">注文関係の記事一覧</div><div class="blogcard-snippet internal-blogcard-snippet">朝日奈りさこちらは注文関係の記事一覧です。本サイトはサンプルプログラムを公開しております。「実際にプログラムをみたい！」という方にも参考になると思います。サンプルプログラムはこちらからあくまでサンプルプログラムです。ご利用は自己責任でお願い</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>
<p>投稿 <a href="https://mql-programing.com/archives/950/orderopenprice/">【MQL4関数】OrderOpenPrice関数の使い方！エントリーした価格の取得方法</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】OrderClosePrice関数の使い方！決済価格の取得方法</title>
		<link>https://mql-programing.com/archives/870/ordercloseprice/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 06 May 2021 05:04:09 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[OrderClosePrice]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[注文]]></category>
		<category><![CDATA[自動売買]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=870</guid>

					<description><![CDATA[<p>OrderClosePrice関数とは ポジションを決済するときには、OrderClose関数を使います。 OrderClose関数を実行するためには、引数に「希望する決済価格」を設定する必要があります。 そこで Ord [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/870/ordercloseprice/">【MQL4関数】OrderClosePrice関数の使い方！決済価格の取得方法</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/2021/10/アイコン.png" alt="朝日奈りさ" class="speech-icon-image"/></figure><div class="speech-name">朝日奈りさ</div></div><div class="speech-balloon">
<p>ポジションを決済するには、希望する決済価格を設定する必要があるよ！</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc1">OrderClosePrice関数とは</span></h2>



<p>ポジションを決済するときには、<a href="https://mql-programing.com/orderclose/">OrderClose関数</a>を使います。</p>



<p>OrderClose関数を実行するためには、引数に<strong>「希望する決済価格」</strong>を設定する必要があります。</p>



<p>そこで OrderClosePrice関数を使いましょう。</p>



<p>　</p>



<p><strong><span class="marker-under-red">OrderClosePrice関数とは、選択したポジションの決済価格を返す関数です。</span></strong></p>



<p>決済価格を返すといっても難しいことはなく、<strong>現在の買値や売値の価格を返してくれます。</strong></p>



<p>このように、ポジションを決済する関数（OrderClose関数）を実行するときに使う関数なので、覚えておくと良いでしょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc2">OrderClosePrice関数の書き方</span></h2>



<p>OrderClosePrice関数の使い方は、基本的な関数と同じです。</p>



<p>関数をマスターしていない方はこちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/function/" title="【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/cocoon-resources/blog-card-cache/624de21c236a113367001dd95952af29.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり</div><div class="blogcard-snippet external-blogcard-snippet">関数とは？ 「プログラムは、何度も同じことを書かないといけない」 と思っている方、ぜひ関数を使ってみてください。 関数とは、何度も繰り返すプログラムを、まとめた状態のものです。 事前に、まとまりを作っておくことで、同じプ</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/183/function/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc3">基本的な書き方</span></h3>



<p>OrderClosePrice関数の基本的な書き方は、以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>double orderClosePrice = OrderClosePrice();</code></pre></div>



<p>　</p>



<p>返り値は double型で、引数は必要ありません。</p>



<p>まずは返り値を見ていきましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc4">返り値（戻り値）</span></h3>



<p><strong>OrderClosePrice関数の返り値は double型です。</strong></p>



<p>具体的には、自動売買を動かしている通貨ペアの価格が返ってきます。</p>



<p>例えばドル円の場合、現在の買値が「105.000円」の時、OrderClosePrice関数は「105.000」を返します。</p>



<p><strong><span class="marker-under-red">ちなみに、売りポジションの場合は買値が返ってきて、買いポジションの場合は売値が返ってきます。</span></strong></p>



<p>そのため、いちいちスプレッドを意識しなくても、決済価格を決めることができます。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc5">OrderClosePrice関数の具体的な使い方</span></h2>



<p>それでは、OrderClosePrice関数の具体的な使い方を見ていきましょう。</p>



<p>OrderClosePrice関数は、主に決済注文（<a href="https://mql-programing.com/orderclose/" title="【MQL4関数】決済注文の出し方（OrderClose関数）とサンプルプログラム">OrderClose関数</a>）を実行するときに使います。</p>



<p>具体的には以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//保有ポジションを一つ選択
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   {

      //決済価格を取得
      double orderClosePrice = OrderClosePrice();

      //ポジションを決済
      bool orderClose = OrderClose( OrderTicket(), OrderLots(), orderClosePrice, 10, clrNONE);

   }</code></pre></div>



<p>　</p>



<div class="wp-block-cocoon-blocks-button-1 aligncenter button-block"><a href="https://mql-programing.com/product/file_orderclose/" class="btn btn-m btn-circle" target="_self"><span class="fz-20px">サンプルプログラムはこちらから</span></a></div>



<p>　</p>



<p>初めに、<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】保有ポジションの選択（OrderSelect関数）のやり方">OrderSelect関数</a>でポジションを選択します。</p>



<p>その後 OrderClosePrice関数で、決済価格を取得します。</p>



<p>取得した決済価格を、OrderClose関数の引数として使います。</p>



<p>このように、決済注文（OrderClose関数）を出すときに便利な関数なので、覚えておくと良いでしょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc6">OrderClosePrice関数の実用的なプログラム例</span></h2>



<p>ここからは、OrderClosePrice関数を使った実用的なプログラム例を紹介します。実際のEA開発でよく使われるパターンなので、ぜひ参考にしてください。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc7">例1：保有中の全ポジションを一括決済するEA</span></h3>



<p>複数のポジションを保有しているときに、すべてのポジションを一括で決済する処理です。ループの中でOrderClosePriceを使って、各ポジションに合った決済価格を自動で取得しています。</p>


<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 全ポジション一括決済関数                                           |
//+------------------------------------------------------------------+
void CloseAllPositions()
{
   // ポジション数を取得（後ろからループすることで番号のズレを防ぐ）
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      // ポジションを選択
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         // 現在のチャートと同じ通貨ペアのポジションのみ対象
         if(OrderSymbol() == Symbol())
         {
            // OrderClosePriceで決済価格を自動取得（買い/売り問わず正しい価格が返る）
            double closePrice = OrderClosePrice();
            
            // ポジションを決済
            bool result = OrderClose(OrderTicket(), OrderLots(), closePrice, 10, clrRed);
            
            // 決済結果をログに出力
            if(result)
               Print("チケット番号 ", OrderTicket(), " を ", closePrice, " で決済しました");
            else
               Print("チケット番号 ", OrderTicket(), " の決済に失敗しました。エラー: ", GetLastError());
         }
      }
   }
}</code></pre>


<p>ポイントは、<strong>ループを後ろから回す（デクリメント）</strong>ことです。前から回すと、決済時にポジション番号がズレてしまうので注意しましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc8">例2：指定pips以上の利益が出たら利確するEA</span></h3>



<p>保有ポジションの含み益が一定のpips以上になったら、自動で利確する処理です。OrderClosePriceとOrderOpenPriceを組み合わせて、現在の損益pipsを計算しています。</p>


<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 利確pipsの設定                                                     |
//+------------------------------------------------------------------+
input double TakeProfitPips = 30.0;  // 利確するpips数

//+------------------------------------------------------------------+
//| OnTick関数：ティックごとに利確判定を行う                             |
//+------------------------------------------------------------------+
void OnTick()
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         // 現在のチャートの通貨ペアのみ対象
         if(OrderSymbol() != Symbol()) continue;
         
         // 決済価格を取得（売りならAsk、買いならBidが自動で返る）
         double closePrice = OrderClosePrice();
         
         // エントリー価格を取得
         double openPrice = OrderOpenPrice();
         
         // 含み損益をpipsで計算
         double profitPips = 0;
         
         if(OrderType() == OP_BUY)
         {
            // 買いポジション：決済価格（Bid）- エントリー価格
            profitPips = (closePrice - openPrice) / Point / 10;
         }
         else if(OrderType() == OP_SELL)
         {
            // 売りポジション：エントリー価格 - 決済価格（Ask）
            profitPips = (openPrice - closePrice) / Point / 10;
         }
         
         // 設定したpips以上の利益が出たら決済
         if(profitPips >= TakeProfitPips)
         {
            bool result = OrderClose(OrderTicket(), OrderLots(), closePrice, 10, clrBlue);
            if(result)
               Print("利確決済！ 利益: ", profitPips, " pips");
         }
      }
   }
}</code></pre>


<p>OrderClosePriceが買い・売りに応じて正しい決済価格を返してくれるので、損益計算と決済の両方で活用できます。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc9">例3：合計損益がマイナスになったら全決済する損切りEA</span></h3>



<p>複数ポジションの合計損失額が設定値を超えた場合に、全ポジションを一括で損切りする処理です。OrderClosePriceを使って各ポジションのリアルタイムな損益を確認しています。</p>


<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 最大許容損失額の設定（口座通貨ベース）                               |
//+------------------------------------------------------------------+
input double MaxLossAmount = -10000;  // これ以上の損失で全決済（例：-10,000円）

//+------------------------------------------------------------------+
//| OnTick関数：ティックごとに合計損益をチェック                         |
//+------------------------------------------------------------------+
void OnTick()
{
   double totalProfit = 0;
   
   // 全ポジションの合計損益を計算
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol())
         {
            // OrderProfitで現在の含み損益（口座通貨ベース）を取得
            totalProfit += OrderProfit() + OrderSwap() + OrderCommission();
         }
      }
   }
   
   // 合計損失が許容額を超えたら全決済
   if(totalProfit <= MaxLossAmount)
   {
      Print("合計損失が ", totalProfit, " に達したため、全ポジションを決済します");
      
      for(int i = OrdersTotal() - 1; i >= 0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol())
            {
               // OrderClosePriceで正しい決済価格を取得
               double closePrice = OrderClosePrice();
               
               bool result = OrderClose(OrderTicket(), OrderLots(), closePrice, 10, clrRed);
               if(result)
                  Print("損切り決済完了：チケット ", OrderTicket());
               else
                  Print("決済失敗：チケット ", OrderTicket(), " エラー: ", GetLastError());
            }
         }
      }
   }
}</code></pre>


<p>合計損益の計算にはOrderProfit関数を使い、決済の実行時にOrderClosePriceで正確な価格を取得しています。<strong>スワップや手数料も含めた判定</strong>にすることで、より実践的な損切りロジックになっています。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc10">例4：トレーリングストップ（利益を追従する決済）EA</span></h3>



<p>一定の利益が出たらストップロスを引き上げ、利益を追従しながら決済を狙うトレーリングストップの処理です。OrderClosePriceで現在の決済価格を取得し、ストップロスの更新判定に活用しています。</p>


<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| トレーリングストップの設定                                          |
//+------------------------------------------------------------------+
input double TrailingStartPips = 20.0;  // トレーリング開始の利益pips
input double TrailingStopPips  = 10.0;  // ストップロスを何pips離すか

//+------------------------------------------------------------------+
//| OnTick関数：ティックごとにトレーリングストップを判定                  |
//+------------------------------------------------------------------+
void OnTick()
{
   // pipsをポイントに変換する倍率（5桁/3桁ブローカー対応）
   double pipPoint = Point * 10;
   
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         // 現在のチャートの通貨ペアのみ対象
         if(OrderSymbol() != Symbol()) continue;
         
         // OrderClosePriceで現在の決済価格を取得
         double closePrice = OrderClosePrice();
         double openPrice  = OrderOpenPrice();
         double currentSL  = OrderStopLoss();
         
         // --- 買いポジションのトレーリングストップ ---
         if(OrderType() == OP_BUY)
         {
            // 現在の含み益をpipsで計算
            double profitPips = (closePrice - openPrice) / pipPoint;
            
            // トレーリング開始条件を満たしているか
            if(profitPips >= TrailingStartPips)
            {
               // 新しいストップロス価格を計算
               double newSL = closePrice - TrailingStopPips * pipPoint;
               
               // 現在のSLより高い場合のみ更新（SLを引き上げる）
               if(newSL > currentSL || currentSL == 0)
               {
                  bool result = OrderModify(OrderTicket(), openPrice, 
                                            NormalizeDouble(newSL, Digits), 
                                            OrderTakeProfit(), 0, clrGreen);
                  if(result)
                     Print("トレーリングSL更新：チケット ", OrderTicket(), 
                           " 新SL=", NormalizeDouble(newSL, Digits));
               }
            }
         }
         // --- 売りポジションのトレーリングストップ ---
         else if(OrderType() == OP_SELL)
         {
            // 現在の含み益をpipsで計算
            double profitPips = (openPrice - closePrice) / pipPoint;
            
            // トレーリング開始条件を満たしているか
            if(profitPips >= TrailingStartPips)
            {
               // 新しいストップロス価格を計算
               double newSL = closePrice + TrailingStopPips * pipPoint;
               
               // 現在のSLより低い場合のみ更新（SLを引き下げる）
               if(newSL < currentSL || currentSL == 0)
               {
                  bool result = OrderModify(OrderTicket(), openPrice, 
                                            NormalizeDouble(newSL, Digits), 
                                            OrderTakeProfit(), 0, clrGreen);
                  if(result)
                     Print("トレーリングSL更新：チケット ", OrderTicket(), 
                           " 新SL=", NormalizeDouble(newSL, Digits));
               }
            }
         }
      }
   }
}</code></pre>


<p>OrderClosePriceで取得した決済価格を基準にして、<strong>「今決済したらいくらになるか」</strong>を把握しながらストップロスの位置を計算しています。買い・売りのどちらでも正しい価格が返るため、ロジックがシンプルに書けるのがメリットです。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc11">例5：指定時刻に全ポジションを自動決済するEA</span></h3>



<p>週末や経済指標発表前など、特定の時刻になったら保有中のポジションをすべて自動で決済する処理です。時間管理とOrderClosePriceを組み合わせた、実用的なリスク管理ロジックです。</p>


<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 自動決済時刻の設定                                                  |
//+------------------------------------------------------------------+
input int CloseHour   = 23;  // 決済する時（サーバー時間）
input int CloseMinute = 30;  // 決済する分

//+------------------------------------------------------------------+
//| OnTick関数：ティックごとに時刻を判定                                |
//+------------------------------------------------------------------+
void OnTick()
{
   // 現在のサーバー時間を取得
   int currentHour   = Hour();
   int currentMinute = Minute();
   
   // 指定時刻に達したかチェック
   if(currentHour == CloseHour && currentMinute == CloseMinute)
   {
      // 全ポジションを後ろからループして決済
      for(int i = OrdersTotal() - 1; i >= 0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            // 現在のチャートの通貨ペアのみ対象
            if(OrderSymbol() != Symbol()) continue;
            
            // マジックナンバーで自分のEAのポジションだけ決済する場合
            // if(OrderMagicNumber() != MagicNumber) continue;
            
            // OrderClosePriceで決済価格を取得
            double closePrice = OrderClosePrice();
            
            // 現在の損益情報をログに記録
            double profit = OrderProfit() + OrderSwap() + OrderCommission();
            Print("時刻決済：チケット ", OrderTicket(), 
                  " 損益=", profit, " 決済価格=", closePrice);
            
            // ポジションを決済
            bool result = OrderClose(OrderTicket(), OrderLots(), closePrice, 15, clrYellow);
            
            if(!result)
            {
               // 決済失敗時はエラーコードを記録して再試行の目安にする
               int err = GetLastError();
               Print("時刻決済失敗：チケット ", OrderTicket(), 
                     " エラーコード=", err);
            }
         }
      }
   }
}</code></pre>


<p>週末持ち越しを避けたい場合は「金曜の23:30」などに設定すると便利です。<strong>マジックナンバーによるフィルタリング</strong>のコメント部分を有効にすれば、自分のEAが出したポジションだけを対象にすることもできます。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc12">例6：ポジション情報をチャート上に表示するインジケーター</span></h3>



<p>保有中のポジションの決済価格・含み損益をチャート上にリアルタイム表示するインジケーターです。OrderClosePriceを使って各ポジションの現在の決済価格を取得し、一覧として視覚的に確認できます。</p>


<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| ポジション情報表示インジケーター                                     |
//+------------------------------------------------------------------+
#property indicator_chart_window

//+------------------------------------------------------------------+
//| 初期化処理                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 終了処理：オブジェクトを削除                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 表示したオブジェクトをすべて削除
   ObjectsDeleteAll(0, "PosInfo_");
}

//+------------------------------------------------------------------+
//| メイン処理：ティックごとにポジション情報を更新                       |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   // 前回の表示をクリア
   ObjectsDeleteAll(0, "PosInfo_");
   
   int displayLine = 0;  // 表示行カウンター
   
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         // 現在のチャートの通貨ペアのみ対象
         if(OrderSymbol() != Symbol()) continue;
         
         // OrderClosePriceで現在の決済価格を取得
         double closePrice = OrderClosePrice();
         double openPrice  = OrderOpenPrice();
         double profit     = OrderProfit() + OrderSwap() + OrderCommission();
         
         // ポジション種別の文字列を作成
         string typeStr = (OrderType() == OP_BUY) ? "BUY" : "SELL";
         
         // 含み損益のpipsを計算
         double pipPoint = Point * 10;
         double pips = 0;
         if(OrderType() == OP_BUY)
            pips = (closePrice - openPrice) / pipPoint;
         else
            pips = (openPrice - closePrice) / pipPoint;
         
         // 表示する文字列を組み立て
         string info = StringConcatenate(
            "#", OrderTicket(), " ", typeStr, 
            " | Lots:", DoubleToStr(OrderLots(), 2),
            " | Open:", DoubleToStr(openPrice, Digits),
            " | Close:", DoubleToStr(closePrice, Digits),
            " | ", DoubleToStr(pips, 1), "pips",
            " | ", DoubleToStr(profit, 0), "円");
         
         // オブジェクト名を作成
         string objName = "PosInfo_" + IntegerToString(displayLine);
         
         // チャート左上にテキストラベルとして表示
         ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0);
         ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
         ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 10);
         ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 20 + displayLine * 20);
         ObjectSetString(0, objName, OBJPROP_TEXT, info);
         ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 10);
         
         // 損益に応じて文字色を変更（プラスなら青、マイナスなら赤）
         color textColor = (profit >= 0) ? clrDodgerBlue : clrRed;
         ObjectSetInteger(0, objName, OBJPROP_COLOR, textColor);
         
         displayLine++;
      }
   }
   
   return(rates_total);
}</code></pre>


<p>OrderClosePriceで取得した決済価格をそのままチャート上に表示しているので、<strong>「今決済したらいくらで約定するか」</strong>をリアルタイムで確認できます。損益がプラスなら青、マイナスなら赤で表示されるため、視覚的にもわかりやすいインジケーターです。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc13">まとめ</span></h2>



<p>OrderClosePrice関数は、選択したポジションの決済価格を返す関数です。買いポジションの場合は売値（Bid）、売りポジションの場合は買値（Ask）が自動的に返されるため、スプレッドを意識せずに正しい決済価格を取得できます。</p>



<p>主にOrderClose関数と組み合わせてポジションの決済処理に使いますが、含み損益の計算やトレーリングストップの判定など、幅広い場面で活用できる便利な関数です。</p>
<p>投稿 <a href="https://mql-programing.com/archives/870/ordercloseprice/">【MQL4関数】OrderClosePrice関数の使い方！決済価格の取得方法</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】OrderModify 関数の使い方！ポジションの変更注文の出し方</title>
		<link>https://mql-programing.com/archives/839/ordermofidy/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 06 May 2021 05:03:56 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[OrderModify]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[注文]]></category>
		<category><![CDATA[自動売買]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=839</guid>

					<description><![CDATA[<p>OrderModify関数とは ポジションの損切や利確の価格を変更したいときはありませんか？ 損切りや利確はエントリーするとき（OrderSend関数）に設定するのが一般的ですが、エントリー後でも変更することができます。 [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/839/ordermofidy/">【MQL4関数】OrderModify 関数の使い方！ポジションの変更注文の出し方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/2021/10/アイコン.png" alt="朝日奈りさ" class="speech-icon-image"/></figure><div class="speech-name">朝日奈りさ</div></div><div class="speech-balloon">
<p>自動でポジションの損切りや利確ラインを変更するにはどうしたらいいんだろう？</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc1">OrderModify関数とは</span></h2>



<p>ポジションの損切や利確の価格を変更したいときはありませんか？</p>



<p>損切りや利確はエントリーするとき（<a href="https://mql-programing.com/ordersend/" title="【MQL4関数】OrderSend関数の使い方とトレード注文サンプル">OrderSend関数</a>）に設定するのが一般的ですが、エントリー後でも変更することができます。</p>



<p>自動売買でポジションの変更注文を出すには、<strong>OrderModify関数</strong>を使います。</p>



<p>　</p>



<p><strong><span class="marker-under-red">OrderModify関数は、ポジションの変更注文を出す関数です。</span></strong></p>



<p>変更できるポジションの種類は以下の通りです。</p>



<ul class="wp-block-list"><li><strong>エントリー後のポジション</strong></li><li><strong>予約ポジション</strong>（指値・逆指値）</li></ul>



<p>　</p>



<p>つまりどちらかのポジションであれば、変更注文を出すことができます。</p>



<p>しかし変更できる内容には制限があります。</p>



<p>もちろんロット数や取得価格を変更することはできません。</p>



<p>　</p>



<p>変更できる内容は以下の４つです。</p>



<ul class="wp-block-list"><li><strong>予約ポジションの注文価格</strong></li><li><strong>損切り価格</strong></li><li><strong>利確価格</strong></li><li><strong>予約ポジションの有効期限</strong></li></ul>



<p>　</p>



<p>特に、<strong><span class="marker-under-red">損切り価格や利確価格を変更するとき</span></strong>に、OrderModify関数がよく使われます。</p>



<p>少し上級者向けの関数ですが、OrderModify関数の使い所は多いので、覚えてしまいましょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc2">OrderModify関数の書き方</span></h2>



<p>OrderModify関数の使い方は、基本的な関数と同じです。</p>



<p>関数をマスターしていない方はこちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/function/" title="【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/cocoon-resources/blog-card-cache/624de21c236a113367001dd95952af29.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり</div><div class="blogcard-snippet external-blogcard-snippet">関数とは？ 「プログラムは、何度も同じことを書かないといけない」 と思っている方、ぜひ関数を使ってみてください。 関数とは、何度も繰り返すプログラムを、まとめた状態のものです。 事前に、まとまりを作っておくことで、同じプ</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/183/function/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc3">基本的な書き方</span></h3>



<p>OrderModify関数の基本的な書き方は以下の通りです。</p>



<p>簡単のために引数を省略しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify( ①, ②, ③, ④, ⑤, ⑥);</code></pre></div>



<p>　</p>



<p>OrderModify関数の<strong><span class="marker-under-red">返り値は bool型で、引数は６つあります。</span></strong></p>



<p>まずは返り値から見ていきましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc4">返り値（戻り値）</span></h3>



<p>OrderModify関数の返り値は bool型です。</p>



<p>「<span class="bold-red">true</span>」や「<span class="bold-blue">false</span>」という値が返ってきます。</p>



<p>数値にすると「１」や「０」です。</p>



<p>true や false が返ってくる条件は以下の通りです。</p>



<ul class="wp-block-list"><li><strong><span class="bold-red">true</span>：変更注文が正常に完了したとき</strong></li><li><strong><span class="bold-blue">false</span>：変更注文が失敗したとき</strong></li></ul>



<p>　</p>



<p>もし、false が返ってきた場合、変更注文が失敗しているため、再度 OrderModify関数を実行する必要があります。</p>



<p>ですが、<strong><span class="marker-under-red">注文の９９％は正常に完了する</span></strong>ため、そこまで気にしなくても大丈夫です。</p>



<p>もし変更注文が失敗していた場合は、手動で変更しましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc5">引数</span></h3>



<p>OrderModify関数の引数は６つあります。</p>



<p>引数が多いので、一つ一つゆっくり見ていきましょう。</p>



<p>　</p>



<p>まずは一覧で確認します。</p>



<figure class="wp-block-table alignwide"><table><tbody><tr><td><strong>番号</strong></td><td><strong>データ型</strong></td><td><strong>引数名</strong></td><td><strong>内容</strong></td></tr><tr><td>①</td><td>int</td><td>ticket</td><td>変更したいポジションのチケット番号</td></tr><tr><td>②</td><td>double</td><td>price</td><td>変更後の価格</td></tr><tr><td>③</td><td>double</td><td>stoploss</td><td>変更後の損切り価格</td></tr><tr><td>④</td><td>double</td><td>takeprofit</td><td>変更後の利確価格</td></tr><tr><td>⑤</td><td>datetime</td><td>expiration</td><td>変更後の有効期限</td></tr><tr><td>⑥</td><td>color</td><td>arrow_color</td><td>チャート上の矢印の色</td></tr></tbody></table></figure>



<p>　</p>



<p>それぞれ詳しく解説しますので、一緒に OrderModify関数を作っていきましょう。</p>



<p>　</p>



<h4 class="wp-block-heading"><span id="toc6">① ticket</span></h4>



<p><strong>ticket には変更したいポジションのチケット番号を入力します。</strong></p>



<p>ポジションのチケット番号を直接入力しても良いですが、<a href="https://mql-programing.com/orderticket/" title="【MQL4関数】チケット番号の取得方法（OrderTicket関数）">OrderTicket関数</a>という便利な関数があるので、それを使うと良いでしょう。</p>



<p>OrderTicket関数を実行する前に、<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】保有ポジションの選択（OrderSelect関数）のやり方">OrderSelect関数</a>でポジションを選択しておく必要がありますので、注意してください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), ②, ③, ④, ⑤, ⑥)</code></pre></div>



<p>　</p>



<h4 class="wp-block-heading"><span id="toc7">② price</span></h4>



<p><strong>price には変更後の取得価格を入力します。</strong></p>



<p>こちらは予約ポジション（指値注文、逆指値注文）の場合のみ変更可能です。</p>



<p><strong><span class="marker-under-red">エントリー後のポジションの場合は、取得価格を変更できないので注意しましょう。</span></strong></p>



<p>エントリー後のポジションを指定する場合は、エントリーしている価格を入力します。</p>



<p>ここでも便利な関数として、OrderOpenPrice関数というものがありますので、利用してみてください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), ③, ④, ⑤, ⑥)</code></pre></div>



<p>　</p>



<h4 class="wp-block-heading"><span id="toc8">③ stoploss</span></h4>



<p><strong>stoploss には、変更後の損切り価格を入力します。</strong></p>



<p>ここで注意していただきたいのは、stoplossの価格は、現在の価格より下に設定する事です。</p>



<p>もし現在の価格より、有利な価格を入力すると、注文が通りません。</p>



<p>エラーにはなりませんが、「変更注文を出したのに、処理されてない！」ということになる可能性もあるので、stoplossの価格設定には注意しましょう。</p>



<p>　</p>



<p>stoplossで設定できるのは以下の３通りです。</p>



<ul class="wp-block-list"><li>0</li><li>損切り価格</li><li>OrderStopLoss関数</li></ul>



<p>　</p>



<p>0の場合は、損切りなしに設定します。</p>



<p>損切り価格を入力した場合は、その価格に損切りが入ります。</p>



<p>OrderStopLoss関数を利用した場合は、変更前の損切り価格が設定されます。</p>



<p>もし損切り価格を変更せずに、他の項目を変更したい場合は、OrderStopLoss関数を使うと良いでしょう。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), ④, ⑤, ⑥)</code></pre></div>



<p>　</p>



<h4 class="wp-block-heading"><span id="toc9">④ takeprofit</span></h4>



<p><strong>takeprofitには変更後の利確価格を入力します。</strong></p>



<p>stoplossの入力と同じように、現在の価格より上でなければ注文が通りません。</p>



<p>　</p>



<p>takeprofitで設定できるのは以下の３通りです。</p>



<ul class="wp-block-list"><li>0</li><li>利確価格</li><li>OrderTakeProfit関数</li></ul>



<p>　</p>



<p>0の場合は、利確なしに設定します。</p>



<p>利確価格を入力した場合は、その価格に利確が入ります。</p>



<p>OrderTakeProfit関数を利用した場合は、変更前の利確価格が設定されます。</p>



<p>他の項目を変更する場合は、OrderTakeProfit関数を利用すると良いでしょう。</p>



<p>ここでは、利確価格を変更するため、以下のように入力します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, ⑤, ⑥)</code></pre></div>



<p>　</p>



<h4 class="wp-block-heading"><span id="toc10">⑤ expiration</span></h4>



<p><strong>expirationには、ポジションの有効期限を入力します。</strong></p>



<p>この引数はほとんど使わないので、読み飛ばしていただいても大丈夫です。</p>



<p>expirationは予約ポジションのみ設定が可能です。</p>



<p>エントリー後のポジションには使えませんので、ご注意ください。</p>



<p>　</p>



<p>expirationはdatetime型の変数なので、datetime型の形式に合わせないとエラーが出ます。</p>



<p>例えば、以下のような形式です。2021年9月22日00時00分00秒まで有効という設定です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>datetime expiration = D'2021.09.22 00:00:00';</code></pre></div>



<p>　</p>



<p>このように少し厄介な引数なので、基本的に OrderExpiration関数を使用すればOKです。</p>



<p>OrderExpiration関数は、変更前の有効期限を返す関数です。</p>



<p>そのため、有効期限を変更しない場合は、この関数を使用すれば問題ありません。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), ⑥)</code></pre></div>



<p>　</p>



<h4 class="wp-block-heading"><span id="toc11">⑥ arrow_color</span></h4>



<p>最後にarrow_colorの設定です。</p>



<p>こちらは、変更注文を出した位置に印がつくのですが、その色を設定します。</p>



<p>色をつけなくても良い場合は、「０」または、clrNONEと入力してください。</p>



<p>透明になりますので、チャート分析の邪魔にならないかと思います。</p>



<p>もし色をつけたい場合は、「clr○○」という特殊な変数がありますので、そちらを利用すると良いでしょう。</p>



<p>私は、clrRedが好きなので、clrRedを設定しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), clrRed)</code></pre></div>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc12">OrderModify関数の引数のまとめ</span></h3>



<p>ここまでOrderModify関数の引数を、ざっと見てきました。</p>



<p>stoplossやtakeprofitの価格設定には気をつけるようにしてください。</p>



<p>また、両方同時に変更することもできるので、両方変更したい場合は、価格を入力すると変更できます。</p>



<p>　</p>



<p>変更する前の情報を取得するには、以下の関数が便利です。</p>



<ul class="wp-block-list"><li>OrderStopLoss関数</li><li>OrderTakeProfit関数</li><li>OrderExpiration関数</li></ul>



<p>　</p>



<p>以下のプログラムはOrderModify関数の完成例です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), clrRed)</code></pre></div>



<p>これで基本的な書き方はマスターできたと思いますので、具体的な使い方も見ていきましょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc13">OrderModify関数の実用的なプログラム例</span></h2>



<p>ここからは、実際のEAで使える実用的なプログラム例を紹介していきます。</p>



<p>OrderModify関数の基本的な書き方がわかったら、ぜひこれらの応用例も参考にしてみてください。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc14">例１：トレーリングストップEA</span></h3>



<p>最も実用的な使い方が<strong>トレーリングストップ</strong>です。価格が有利な方向に動いたら、損切りラインを自動で引き上げ（引き下げ）て利益を確保する手法です。</p>



<p>以下のEAは、保有中の全ポジションに対してトレーリングストップを適用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="MQL4"><code>//+------------------------------------------------------------------+
//| トレーリングストップEA                                              |
//| 価格が有利に動いたら損切りラインを自動で追従させる                      |
//+------------------------------------------------------------------+
input int TrailingStopPips = 30;  // トレーリングストップ幅（pips）
input int TrailingStartPips = 20; // トレーリング開始条件（pips利益が出てから）

void OnTick()
{
   // ポイント値を取得（5桁ブローカー対応）
   double pip = Point;
   if(Digits == 3 || Digits == 5)
      pip = Point * 10;

   // 保有中の全ポジションをループ
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      // ポジションを選択
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      // 自分のEAの通貨ペアが一致するか確認
      if(OrderSymbol() != Symbol())
         continue;

      // 買いポジションのトレーリングストップ
      if(OrderType() == OP_BUY)
      {
         // 現在の利益がトレーリング開始条件を超えているか
         double buyProfit = Bid - OrderOpenPrice();
         if(buyProfit >= TrailingStartPips * pip)
         {
            // 新しい損切り価格を計算
            double newSL = Bid - TrailingStopPips * pip;
            // 現在のSLより有利（高い）場合のみ変更
            if(newSL > OrderStopLoss() || OrderStopLoss() == 0)
            {
               bool result = OrderModify(
                  OrderTicket(),       // チケット番号
                  OrderOpenPrice(),    // 取得価格はそのまま
                  NormalizeDouble(newSL, Digits), // 新しい損切り価格
                  OrderTakeProfit(),   // 利確はそのまま
                  OrderExpiration(),   // 有効期限はそのまま
                  clrBlue             // 矢印の色（青）
               );
               if(result)
                  Print("買いトレーリングストップ更新: SL=", newSL);
               else
                  Print("トレーリングストップ更新失敗: エラー=", GetLastError());
            }
         }
      }

      // 売りポジションのトレーリングストップ
      if(OrderType() == OP_SELL)
      {
         // 現在の利益がトレーリング開始条件を超えているか
         double sellProfit = OrderOpenPrice() - Ask;
         if(sellProfit >= TrailingStartPips * pip)
         {
            // 新しい損切り価格を計算
            double newSL = Ask + TrailingStopPips * pip;
            // 現在のSLより有利（低い）場合のみ変更
            if(newSL < OrderStopLoss() || OrderStopLoss() == 0)
            {
               bool result = OrderModify(
                  OrderTicket(),       // チケット番号
                  OrderOpenPrice(),    // 取得価格はそのまま
                  NormalizeDouble(newSL, Digits), // 新しい損切り価格
                  OrderTakeProfit(),   // 利確はそのまま
                  OrderExpiration(),   // 有効期限はそのまま
                  clrRed              // 矢印の色（赤）
               );
               if(result)
                  Print("売りトレーリングストップ更新: SL=", newSL);
               else
                  Print("トレーリングストップ更新失敗: エラー=", GetLastError());
            }
         }
      }
   }
}</code></pre></div>



<p>　</p>



<p>このEAのポイントは以下の通りです。</p>



<ul class="wp-block-list"><li><strong>TrailingStartPips</strong>で指定したpips分の利益が出てからトレーリングを開始します</li><li><strong>TrailingStopPips</strong>で指定したpips幅で損切りラインを追従させます</li><li>現在の損切りラインより有利な場合のみ変更するので、損切りが不利な方向に動くことはありません</li><li><strong>NormalizeDouble関数</strong>で価格を正規化しているため、小数点エラーを防げます</li></ul>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc15">例２：建値ストップ（ブレイクイーブン）</span></h3>



<p>一定の利益が出たら、損切りラインをエントリー価格に移動させる<strong>建値ストップ</strong>も非常に人気があります。</p>



<p>これにより、最低でも損失ゼロ（スプレッド分を除く）を保証できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="MQL4"><code>//+------------------------------------------------------------------+
//| 建値ストップ（ブレイクイーブン）の例                                  |
//| 一定利益が出たらSLをエントリー価格に移動                              |
//+------------------------------------------------------------------+
input int BreakevenPips = 20; // 建値ストップ発動条件（pips）

void SetBreakeven()
{
   double pip = Point;
   if(Digits == 3 || Digits == 5)
      pip = Point * 10;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      if(OrderSymbol() != Symbol())
         continue;

      // 買いポジション
      if(OrderType() == OP_BUY)
      {
         // 条件を満たし、かつSLがまだエントリー価格以下の場合
         if(Bid - OrderOpenPrice() >= BreakevenPips * pip)
         {
            if(OrderStopLoss() < OrderOpenPrice() || OrderStopLoss() == 0)
            {
               bool result = OrderModify(
                  OrderTicket(),
                  OrderOpenPrice(),
                  OrderOpenPrice(),    // SLをエントリー価格に設定
                  OrderTakeProfit(),
                  OrderExpiration(),
                  clrGreen
               );
               if(result)
                  Print("建値ストップ設定完了: チケット=", OrderTicket());
            }
         }
      }

      // 売りポジション
      if(OrderType() == OP_SELL)
      {
         if(OrderOpenPrice() - Ask >= BreakevenPips * pip)
         {
            if(OrderStopLoss() > OrderOpenPrice() || OrderStopLoss() == 0)
            {
               bool result = OrderModify(
                  OrderTicket(),
                  OrderOpenPrice(),
                  OrderOpenPrice(),    // SLをエントリー価格に設定
                  OrderTakeProfit(),
                  OrderExpiration(),
                  clrGreen
               );
               if(result)
                  Print("建値ストップ設定完了: チケット=", OrderTicket());
            }
         }
      }
   }
}</code></pre></div>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc16">例３：利確価格を段階的に変更する</span></h3>



<p>利確価格を状況に応じて変更したい場合の例です。</p>



<p>例えば、エントリー後に相場の勢いが強い場合、利確ラインをさらに遠くに設定し直すことで、利益の最大化を狙えます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="MQL4"><code>//+------------------------------------------------------------------+
//| 利確価格を段階的に変更する例                                        |
//+------------------------------------------------------------------+
input int InitialTPPips = 50;   // 初期利確幅（pips）
input int ExtendedTPPips = 100; // 拡張利確幅（pips）
input int ExtendTriggerPips = 30; // 拡張トリガー（pips利益）

void AdjustTakeProfit()
{
   double pip = Point;
   if(Digits == 3 || Digits == 5)
      pip = Point * 10;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      if(OrderSymbol() != Symbol())
         continue;

      // 買いポジションの利確拡張
      if(OrderType() == OP_BUY)
      {
         double currentProfit = Bid - OrderOpenPrice();
         double initialTP = OrderOpenPrice() + InitialTPPips * pip;
         double extendedTP = OrderOpenPrice() + ExtendedTPPips * pip;

         // トリガー条件を満たし、TPがまだ初期値の場合
         if(currentProfit >= ExtendTriggerPips * pip)
         {
            if(NormalizeDouble(OrderTakeProfit(), Digits) == NormalizeDouble(initialTP, Digits))
            {
               bool result = OrderModify(
                  OrderTicket(),
                  OrderOpenPrice(),
                  OrderStopLoss(),
                  NormalizeDouble(extendedTP, Digits), // 利確を拡張
                  OrderExpiration(),
                  clrYellow
               );
               if(result)
                  Print("利確拡張完了: 新TP=", extendedTP);
            }
         }
      }

      // 売りポジションの利確拡張
      if(OrderType() == OP_SELL)
      {
         double currentProfit = OrderOpenPrice() - Ask;
         double initialTP = OrderOpenPrice() - InitialTPPips * pip;
         double extendedTP = OrderOpenPrice() - ExtendedTPPips * pip;

         if(currentProfit >= ExtendTriggerPips * pip)
         {
            if(NormalizeDouble(OrderTakeProfit(), Digits) == NormalizeDouble(initialTP, Digits))
            {
               bool result = OrderModify(
                  OrderTicket(),
                  OrderOpenPrice(),
                  OrderStopLoss(),
                  NormalizeDouble(extendedTP, Digits), // 利確を拡張
                  OrderExpiration(),
                  clrYellow
               );
               if(result)
                  Print("利確拡張完了: 新TP=", extendedTP);
            }
         }
      }
   }
}</code></pre></div>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc17">OrderModify関数を使うときの注意点</span></h2>



<p>最後に、OrderModify関数を使うときの注意点をまとめます。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc18">注意点１：OrderSelect関数を事前に実行する</span></h3>



<p>OrderModify関数を使う前に、必ず<strong>OrderSelect関数</strong>でポジションを選択しておきましょう。</p>



<p>OrderTicket関数やOrderOpenPrice関数などは、OrderSelect関数で選択されたポジションの情報を返すため、選択を忘れるとエラーの原因になります。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc19">注意点２：NormalizeDouble関数で価格を正規化する</span></h3>



<p>価格を計算で求める場合は、<strong>NormalizeDouble関数</strong>で小数点以下の桁数を揃えましょう。</p>



<p>桁数が合わないと注文が通らないことがあります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="MQL4"><code>// 正しい例
double newSL = NormalizeDouble(Bid - 30 * Point, Digits);

// 間違いやすい例（正規化なし）
double newSL = Bid - 30 * Point; // 桁数がずれる可能性あり</code></pre></div>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc20">注意点３：変更内容がない場合はエラーになる</span></h3>



<p>OrderModify関数は、<strong><span class="marker-under-red">何も変更がない状態で実行するとエラー（エラーコード1）が発生します。</span></strong></p>



<p>損切り価格が同じなのに変更注文を出すと失敗するため、変更前と変更後の値が異なることを確認してから実行しましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc21">注意点４：ストップレベルに注意する</span></h3>



<p>ブローカーによっては、現在価格から一定距離以内にSL/TPを設定できない<strong>ストップレベル</strong>が設けられています。</p>



<p>ストップレベルは<strong>MarketInfo関数</strong>で取得できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="MQL4"><code>// ストップレベルの取得
double stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
Print("ストップレベル: ", stopLevel);</code></pre></div>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc22">まとめ</span></h2>



<p>今回は、OrderModify関数の使い方を解説しました。</p>



<p>　</p>



<p>OrderModify関数を使えば、エントリー後のポジションの損切りや利確を自動で変更できます。</p>



<p>特に<strong>トレーリングストップ</strong>や<strong>建値ストップ</strong>は実際のEAでも非常によく使われるテクニックです。</p>



<p>　</p>



<p>大切なポイントをおさらいしましょう。</p>



<ul class="wp-block-list"><li>OrderModify関数の<strong>返り値はbool型</strong>（true：成功、false：失敗）</li><li><strong>引数は６つ</strong>（チケット番号、価格、損切り、利確、有効期限、矢印の色）</li><li>変更しない項目には、<strong>OrderStopLoss関数やOrderTakeProfit関数</strong>で現在の値を設定する</li><li>事前に<strong>OrderSelect関数</strong>でポジションを選択しておくことを忘れずに</li><li>価格は<strong>NormalizeDouble関数</strong>で正規化する</li></ul>



<p>　</p>



<p>OrderModify関数をマスターすれば、より柔軟で高度な自動売買プログラムを作成できるようになります。</p>



<p>ぜひ今回の記事を参考に、OrderModify関数を使ったEA開発に挑戦してみてください。</p>
<p>投稿 <a href="https://mql-programing.com/archives/839/ordermofidy/">【MQL4関数】OrderModify 関数の使い方！ポジションの変更注文の出し方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】OrderLots関数の使い方！ポジションのロット数の取得方法</title>
		<link>https://mql-programing.com/archives/871/orderlots/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 06 May 2021 05:03:35 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[OrderLots]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[注文]]></category>
		<category><![CDATA[自動売買]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=871</guid>

					<description><![CDATA[<p>OrderLots関数とは OrderLots関数とは、選択したポジションのロット数を取得する関数です。 OrderLots関数を実行する前に、ポジションを選択する必要があるので、OrderSelect関数と組み合わせて [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/871/orderlots/">【MQL4関数】OrderLots関数の使い方！ポジションのロット数の取得方法</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/2021/10/アイコン.png" alt="朝日奈りさ" class="speech-icon-image"/></figure><div class="speech-name">朝日奈りさ</div></div><div class="speech-balloon">
<p>ポジションを決済したいとき、ロット数を取得しないとね！</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc1">OrderLots関数とは</span></h2>



<p><strong>OrderLots関数とは、選択したポジションのロット数を取得する関数です。</strong></p>



<p>OrderLots関数を実行する前に、ポジションを選択する必要があるので、<a href="https://mql-programing.com/orderselect/">OrderSelect関数</a>と組み合わせて使います。</p>



<p>使う場面は限られていますが、ポジションを決済するときに使う重要な関数なので、覚えておきましょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc2">OrderLots関数の書き方</span></h2>



<p>OrderLots関数の使い方は、基本的な関数と同じです。</p>



<p>関数をマスターしていない方はこちらの記事が参考になります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/function/" title="【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/cocoon-resources/blog-card-cache/624de21c236a113367001dd95952af29.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQLプログラミング基礎】関数は難しい？関数の使い方を理解しよう！プログラム例あり</div><div class="blogcard-snippet external-blogcard-snippet">関数とは？ 「プログラムは、何度も同じことを書かないといけない」 と思っている方、ぜひ関数を使ってみてください。 関数とは、何度も繰り返すプログラムを、まとめた状態のものです。 事前に、まとまりを作っておくことで、同じプ</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/183/function/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc3">基本的な書き方</span></h3>



<p>OrderLots関数の基本的な書き方は以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>double lots = OrderLots();</code></pre></div>



<p>　</p>



<p>このように返り値は double型で、引数は必要ありません。</p>



<p>まずは返り値から見ていきましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc4">返り値（戻り値）</span></h3>



<p><strong>OrderLots関数の返り値は double型です。</strong></p>



<p>選択したポジションのロット数が返ってきます。</p>



<p>注意することは１つです。</p>



<p><strong><span class="marker-under-red">ロット数は、全てのポジションの合計値ではなく、１つのポジションのロット数が返ってきます。</span></strong></p>



<p>そのため、全てのポジションの合計値を使いたい場合は、<a href="https://mql-programing.com/repeat-for-while/" title="【MQLプログラミング基礎】繰り返し文を書いてみよう！プログラム例あり">for文</a>で OrderLots関数の返り血を合計すると良いでしょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc5">OrderLots関数の具体的な使い方</span></h2>



<p>それでは、OrderLots関数の具体的な使い方を見ていきましょう。</p>



<p>OrderLots関数は、主に決済注文（<a href="https://mql-programing.com/orderclose/" title="【MQL4関数】決済注文の出し方（OrderClose関数）とサンプルプログラム">OrderClose関数</a>）を出すときに使用します。</p>



<p>具体的には以下のようなプログラムを使います。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//保有ポジションを一つ選択
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   {

      //ロット数を取得
      double lots = OrderLots();

      //ポジションを決済
      bool orderClose = OrderClose( OrderTicket(), lots, OrderClosePrice(), 10, clrNONE);

   }</code></pre></div>



<p>　</p>



<div class="wp-block-cocoon-blocks-button-1 aligncenter button-block"><a href="https://mql-programing.com/product/file_orderclose/" class="btn btn-m btn-circle" target="_self"><span class="fz-20px">サンプルプログラムはこちらから</span></a></div>



<p>　</p>



<p>初めに、<a href="https://mql-programing.com/orderselect/" title="【MQL4関数】保有ポジションの選択（OrderSelect関数）のやり方">OrderSelect関数</a>で決済したいポジションを選択します。</p>



<p>その後にOrderLots関数で、ポジションのロット数を取得し、OrderClose関数の引数に書いています。</p>



<p>このように、決済注文（OrderClose関数）を出すときに便利な関数なので、覚えておくと良いでしょう。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc6">OrderLots関数の実用的なプログラム例</span></h2>



<p>ここからは、OrderLots関数を使った実用的なプログラム例を紹介します。実際のEA開発でよく使うパターンばかりなので、ぜひ参考にしてください。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc7">例1：全ポジションの合計ロット数を計算する</span></h3>



<p>ナンピンEAやマーチンゲールEAでは、保有中の全ポジションの合計ロット数を把握することが重要です。以下のプログラムでは、現在の通貨ペアの合計ロット数を計算しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-mql4" data-lang="MQL4"><code>//+------------------------------------------------------------------+
//| 現在の通貨ペアの合計ロット数を計算する関数                         |
//+------------------------------------------------------------------+
double GetTotalLots(int magicNumber)
  {
   double totalLots = 0.0; // 合計ロット数を格納する変数

   // 全ポジションをループで確認
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      // ポジションを選択
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         // 通貨ペアとマジックナンバーが一致するか確認
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magicNumber)
           {
            // OrderLots関数でロット数を取得し、合計に加算
            totalLots += OrderLots();
           }
        }
     }

   return totalLots; // 合計ロット数を返す
  }

//+------------------------------------------------------------------+
//| 使用例：OnTick内で合計ロット数を確認                              |
//+------------------------------------------------------------------+
void OnTick()
  {
   int myMagic = 12345;

   // 合計ロット数を取得
   double total = GetTotalLots(myMagic);

   // 合計ロット数が上限を超えていたら新規注文を出さない
   double maxLots = 1.0; // 最大合計ロット数
   if(total >= maxLots)
     {
      Comment("合計ロット数が上限に達しています: ", DoubleToString(total, 2), " lots");
      return; // 新規注文を行わない
     }

   // ここに通常のエントリーロジックを記述
   Comment("現在の合計ロット数: ", DoubleToString(total, 2), " lots");
  }</code></pre></div>



<p>このように、for文でOrderLots関数の戻り値を合計することで、リスク管理に役立てることができます。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc8">例2：全ポジションを一括決済するEA</span></h3>



<p>複数のポジションをまとめて決済する場面は非常に多いです。以下のプログラムでは、自分のEAが出した全ポジションをOrderLots関数で取得したロット数を使って一括決済しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-mql4" data-lang="MQL4"><code>#define MAGIC_NUMBER 12345 // マジックナンバーの定義

//+------------------------------------------------------------------+
//| 全ポジションを一括決済する関数                                     |
//+------------------------------------------------------------------+
void CloseAllPositions()
  {
   // ポジション数が0になるまで繰り返す（逆順ループ）
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      // ポジションを選択できるか確認
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      // 自分のEAのポジションかつ、現在の通貨ペアか確認
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC_NUMBER)
         continue;

      // OrderLots関数でロット数を取得
      double lots = OrderLots();

      // 注文タイプに応じて決済価格を設定
      double closePrice = 0;
      if(OrderType() == OP_BUY)
         closePrice = Bid;  // 買いポジションはBidで決済
      else if(OrderType() == OP_SELL)
         closePrice = Ask;  // 売りポジションはAskで決済
      else
         continue; // 指値・逆指値注文はスキップ

      // ポジションを決済（取得したロット数を使用）
      bool result = OrderClose(OrderTicket(), lots, closePrice, 10, clrRed);

      // 決済結果をログに出力
      if(result)
         Print("決済成功 チケット:", OrderTicket(), " ロット:", DoubleToString(lots, 2));
      else
         Print("決済失敗 チケット:", OrderTicket(), " エラー:", GetLastError());
     }
  }

//+------------------------------------------------------------------+
//| OnTick - 利益が一定額を超えたら全決済する例                       |
//+------------------------------------------------------------------+
void OnTick()
  {
   double totalProfit = 0.0;

   // 全ポジションの損益を合計
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER)
           {
            totalProfit += OrderProfit() + OrderSwap() + OrderCommission();
           }
        }
     }

   // 利益が10,000円を超えたら全決済
   if(totalProfit >= 10000)
     {
      Print("利益目標達成！全ポジション決済開始 利益:", DoubleToString(totalProfit, 0), "円");
      CloseAllPositions();
     }

   Comment("現在の合計損益: ", DoubleToString(totalProfit, 0), "円");
  }</code></pre></div>



<p>一括決済は、利益確定や損切りの自動化で非常によく使うパターンです。OrderLots関数でロット数を正しく取得できないと決済が失敗するので、必ずセットで覚えておきましょう。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc9">例3：ポジションの半分だけ部分決済するEA</span></h3>



<p>利益が出たポジションの半分だけを決済して利益を確保し、残りのポジションで利益を伸ばす「部分決済」は、裁量トレーダーにも人気のテクニックです。OrderLots関数で取得したロット数を半分にすることで実現できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-mql4" data-lang="MQL4"><code>#define MAGIC_NUMBER 12345 // マジックナンバー
input double PartialCloseProfit = 50.0; // 部分決済を行う利益pips

//+------------------------------------------------------------------+
//| ポジションの半分を部分決済する関数                                 |
//+------------------------------------------------------------------+
bool PartialClose(int ticket)
  {
   // チケット番号でポジションを選択
   if(!OrderSelect(ticket, SELECT_BY_TICKET))
     {
      Print("ポジション選択失敗 チケット:", ticket);
      return false;
     }

   // OrderLots関数で現在のロット数を取得
   double currentLots = OrderLots();

   // 半分のロット数を計算（最小ロット数以上になるよう調整）
   double halfLots = NormalizeDouble(currentLots / 2.0, 2);
   double minLot   = MarketInfo(Symbol(), MODE_MINLOT); // 最小ロット数を取得

   // 半分のロット数が最小ロット未満なら部分決済できない
   if(halfLots < minLot)
     {
      Print("ロット数が小さすぎるため部分決済できません。現在:", 
            DoubleToString(currentLots, 2), " 半分:", DoubleToString(halfLots, 2));
      return false;
     }

   // 決済価格を注文タイプに応じて設定
   double closePrice = 0;
   if(OrderType() == OP_BUY)
      closePrice = MarketInfo(Symbol(), MODE_BID);
   else if(OrderType() == OP_SELL)
      closePrice = MarketInfo(Symbol(), MODE_ASK);
   else
      return false;

   // 半分のロット数だけ決済を実行
   bool result = OrderClose(ticket, halfLots, closePrice, 10, clrBlue);

   if(result)
      Print("部分決済成功 チケット:", ticket, 
            " 決済ロット:", DoubleToString(halfLots, 2),
            " 残りロット:", DoubleToString(currentLots - halfLots, 2));
   else
      Print("部分決済失敗 チケット:", ticket, " エラー:", GetLastError());

   return result;
  }

//+------------------------------------------------------------------+
//| OnTick - 利益が一定pipsを超えたら半分決済                         |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      // 自分のEAかつ現在の通貨ペアのポジションか確認
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC_NUMBER)
         continue;

      // 現在の利益pipsを計算
      double profitPips = 0;
      if(OrderType() == OP_BUY)
         profitPips = (Bid - OrderOpenPrice()) / Point / 10;
      else if(OrderType() == OP_SELL)
         profitPips = (OrderOpenPrice() - Ask) / Point / 10;

      // OrderLots関数でロット数を確認し、初期ロットから減っていなければ部分決済
      double initialLot = 0.10; // 初期エントリーロット数
      double currentLots = OrderLots();

      // 利益が目標に達し、かつまだ部分決済していない場合
      if(profitPips >= PartialCloseProfit && currentLots >= initialLot)
        {
         PartialClose(OrderTicket());
        }
     }
  }</code></pre></div>



<p>部分決済では、OrderLots関数で取得したロット数を元に「半分のロット数」を計算しています。ブローカーの最小ロット数を下回らないようチェックすることがポイントです。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc10">例4：ポジション情報をチャート上に一覧表示するインジケーター</span></h3>



<p>デバッグや運用監視に便利な、保有中のポジション情報をチャート上に表示するインジケーターです。OrderLots関数を使ってロット数を取得し、各ポジションの詳細を一覧で確認できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-mql4" data-lang="MQL4"><code>//+------------------------------------------------------------------+
//| ポジション情報一覧表示インジケーター                               |
//+------------------------------------------------------------------+
#property indicator_chart_window // チャートウィンドウに表示

//+------------------------------------------------------------------+
//| カスタムインジケーター初期化関数                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   // 表示更新用のタイマーを1秒ごとに設定
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| カスタムインジケーター終了処理                                     |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // チャートのコメントをクリア
   Comment("");
   EventKillTimer();
  }

//+------------------------------------------------------------------+
//| タイマーイベントで定期的に情報を更新                               |
//+------------------------------------------------------------------+
void OnTimer()
  {
   DisplayPositionInfo();
  }

//+------------------------------------------------------------------+
//| メインの計算関数（インジケーター必須）                             |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| ポジション情報をチャートに表示する関数                             |
//+------------------------------------------------------------------+
void DisplayPositionInfo()
  {
   string info = "===== ポジション情報一覧 =====\n"; // 表示用文字列
   double totalLots   = 0.0; // 合計ロット数
   double totalProfit = 0.0; // 合計損益
   int    posCount    = 0;   // ポジション数カウンター

   // 全ポジションをループ
   for(int i = 0; i < OrdersTotal(); i++)
     {
      // ポジションを選択
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      // 現在の通貨ペアのポジションのみ対象
      if(OrderSymbol() != Symbol())
         continue;

      // 成行注文（BUYまたはSELL）のみ対象
      if(OrderType() != OP_BUY &#038;&#038; OrderType() != OP_SELL)
         continue;

      posCount++; // ポジション数をカウント

      // OrderLots関数でロット数を取得
      double lots   = OrderLots();
      double profit = OrderProfit() + OrderSwap() + OrderCommission();

      // 注文タイプを文字列に変換
      string typeStr = (OrderType() == OP_BUY) ? "BUY" : "SELL";

      // 各ポジションの情報を1行ずつ追加
      info += StringFormat("#%d | %s | %.2f lots | 建値:%.5f | 損益:%.0f円 | Magic:%d\n",
                           OrderTicket(),           // チケット番号
                           typeStr,                  // 売買方向
                           lots,                     // ロット数（OrderLots関数）
                           OrderOpenPrice(),         // エントリー価格
                           profit,                   // 損益
                           OrderMagicNumber());      // マジックナンバー

      // 合計値を加算
      totalLots   += lots;
      totalProfit += profit;
     }

   // 合計情報を追加
   info += "==============================\n";
   info += StringFormat("ポジション数: %d\n", posCount);
   info += StringFormat("合計ロット数: %.2f lots\n", totalLots);
   info += StringFormat("合計損益: %.0f円\n", totalProfit);

   // チャートに表示
   Comment(info);
  }</code></pre></div>



<p>このインジケーターをチャートにセットすると、保有中の全ポジションのロット数・損益・チケット番号などがリアルタイムで一覧表示されます。複数のEAを同時に稼働させているときの状況把握に非常に役立ちます。</p>



<p>　</p>



<h3 class="wp-block-heading"><span id="toc11">例5：ナンピンEAで前回ロットの倍でエントリーする</span></h3>



<p>マーチンゲール戦略のナンピンEAでは、前回のポジションのロット数を取得して、次のエントリーを倍のロット数で行います。OrderLots関数を使って最新ポジションのロット数を確認する実用的なパターンです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-mql4" data-lang="MQL4"><code>#define MAGIC_NUMBER 99999 // マジックナンバー
input double BaseLot       = 0.01; // 基本ロット数
input double LotMultiplier = 2.0;  // ロット倍率（マーチンゲール係数）
input double MaxLot        = 1.0;  // 最大ロット数（安全上限）
input int    NanpinPips    = 30;   // ナンピン間隔（pips）

//+------------------------------------------------------------------+
//| 最新ポジションのロット数を取得する関数                             |
//+------------------------------------------------------------------+
double GetLastPositionLots()
  {
   datetime latestTime = 0; // 最新のオープン時間を保持
   double   lastLots   = 0; // 最新ポジションのロット数

   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      // 自分のEAかつ現在の通貨ペアか確認
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC_NUMBER)
         continue;

      // 成行注文のみ対象
      if(OrderType() != OP_BUY && OrderType() != OP_SELL)
         continue;

      // より新しいポジションを見つけたら更新
      if(OrderOpenTime() > latestTime)
        {
         latestTime = OrderOpenTime();
         // OrderLots関数で最新ポジションのロット数を取得
         lastLots = OrderLots();
        }
     }

   return lastLots; // 最新ポジションのロット数を返す
  }

//+------------------------------------------------------------------+
//| 最新ポジションの建値を取得する関数                                 |
//+------------------------------------------------------------------+
double GetLastPositionPrice()
  {
   datetime latestTime  = 0;
   double   lastPrice   = 0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC_NUMBER)
         continue;

      if(OrderType() != OP_BUY && OrderType() != OP_SELL)
         continue;

      if(OrderOpenTime() > latestTime)
        {
         latestTime = OrderOpenTime();
         lastPrice  = OrderOpenPrice();
        }
     }

   return lastPrice;
  }

//+------------------------------------------------------------------+
//| 保有ポジション数を取得する関数                                     |
//+------------------------------------------------------------------+
int CountPositions()
  {
   int count = 0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;

      if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER)
        {
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            count++;
        }
     }

   return count;
  }

//+------------------------------------------------------------------+
//| OnTick - ナンピン買いのロジック例                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int posCount = CountPositions();

   // ポジションが0のとき：基本ロットで初回エントリー
   if(posCount == 0)
     {
      // ここにエントリー条件を記述（例として常にBUY）
      int ticket = OrderSend(Symbol(), OP_BUY, BaseLot, Ask, 10, 0, 0,
                             "Nanpin EA", MAGIC_NUMBER, 0, clrBlue);
      if(ticket > 0)
         Print("初回エントリー成功 ロット:", DoubleToString(BaseLot, 2));
      return;
     }

   // ポジションが1つ以上あるとき：ナンピン条件を確認
   double lastPrice = GetLastPositionPrice();
   double lastLots  = GetLastPositionLots();

   // 最新ポジションからナンピン間隔分だけ逆行したか確認
   double nanpinDistance = NanpinPips * Point * 10;

   if(Ask <= lastPrice - nanpinDistance)
     {
      // OrderLots関数で取得した前回ロットに倍率をかける
      double nextLot = NormalizeDouble(lastLots * LotMultiplier, 2);

      // 最大ロット数を超えないよう制限
      if(nextLot > MaxLot)
         nextLot = MaxLot;

      // ナンピンエントリー
      int ticket = OrderSend(Symbol(), OP_BUY, nextLot, Ask, 10, 0, 0,
                             "Nanpin EA", MAGIC_NUMBER, 0, clrGreen);
      if(ticket > 0)
         Print("ナンピンエントリー成功 ロット:", DoubleToString(nextLot, 2),
               " 前回ロット:", DoubleToString(lastLots, 2));
     }

   // チャートに情報を表示
   Comment("ポジション数: ", posCount,
           "\n最新ロット: ", DoubleToString(lastLots, 2),
           "\n最新建値: ", DoubleToString(lastPrice, 5));
  }</code></pre></div>



<p>このプログラムでは、GetLastPositionLots関数の中でOrderLots関数を使い、最新ポジションのロット数を取得しています。そのロット数に倍率をかけることで、マーチンゲール方式のナンピンを実現しています。MaxLotで上限を設けることで、ロット数が際限なく増えることを防いでいる点もポイントです。</p>



<p>　</p>



<h2 class="wp-block-heading"><span id="toc12">まとめ</span></h2>



<p>OrderLots関数は、選択したポジションのロット数を取得するシンプルな関数ですが、EA開発では非常に多くの場面で活躍します。</p>



<p>特に以下の3つの場面で使うことが多いので、しっかり覚えておきましょう。</p>



<ol class="wp-block-list"><li><strong>ポジションの決済時</strong>：OrderClose関数の引数としてロット数を指定する</li><li><strong>リスク管理</strong>：合計ロット数を計算して、上限を超えないよう制御する</li><li><strong>ナンピン・マーチンゲール</strong>：前回のロット数を基に次のエントリーロットを計算する</li></ol>



<p>OrderLots関数を使う前には、必ずOrderSelect関数でポジションを選択することを忘れないようにしましょう。</p>
<p>投稿 <a href="https://mql-programing.com/archives/871/orderlots/">【MQL4関数】OrderLots関数の使い方！ポジションのロット数の取得方法</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
