<?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>OnTick アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/ontick/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/ontick/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Tue, 31 Mar 2026 13:14:53 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>OnTick アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/ontick/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4関数】OnTick関数とは？ロウソク足が動いたときに実行されるイベント関数</title>
		<link>https://mql-programing.com/archives/2949/ontick/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sun, 15 May 2022 07:54:53 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[自動売買]]></category>
		<category><![CDATA[OnTick]]></category>
		<category><![CDATA[イベント関数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=2949</guid>

					<description><![CDATA[<p>OnTick関数とは？ OnTick関数は、EAがアタッチされたチャートの通貨ペアに新しいティック（価格変動）が発生するたびに自動的に呼び出されるイベント関数です。MT4のEA（Expert Advisor）において最も [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/2949/ontick/">【MQL4関数】OnTick関数とは？ロウソク足が動いたときに実行されるイベント関数</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">OnTick関数とは？</span></h2>
<p>OnTick関数は、EAがアタッチされたチャートの通貨ペアに<strong>新しいティック（価格変動）が発生するたびに自動的に呼び出されるイベント関数</strong>です。MT4のEA（Expert Advisor）において最も基本的かつ重要な関数であり、売買ロジックのほとんどはこの関数の中に記述します。</p>
<p>「ロウソク足が動いたとき」という表現は、正確には<strong>「新しい価格データ（ティック）がサーバーから配信されたとき」</strong>を意味します。1本のロウソク足の中でも価格が変動するたびに何度も呼び出されます。</p>
<h2><span id="toc2">基本的な書式</span></h2>
<pre><code class="language-mql4">void OnTick()
{
   // ティック発生時に実行したい処理をここに記述
}
</code></pre>
<h3><span id="toc3">引数</span></h3>
<p>OnTick関数は<strong>引数を取りません</strong>。</p>
<h3><span id="toc4">戻り値</span></h3>
<p>戻り値の型は<strong>void</strong>（なし）です。値を返す必要はありません。</p>
<h3><span id="toc5">対象ファイル</span></h3>
<p>OnTick関数は<strong>EA（.mq4ファイル）専用</strong>です。カスタムインジケーターやスクリプトでは使用できません（インジケーターではOnCalculate関数が同様の役割を果たします）。</p>
<h2><span id="toc6">OnTick関数の呼び出しタイミング</span></h2>
<p>OnTick関数が呼び出される条件を正しく理解することが重要です。</p>
<ul>
<li><strong>呼び出される条件：</strong>EAがアタッチされたチャートの通貨ペアで新しいティックが発生したとき</li>
<li><strong>呼び出し頻度：</strong>相場が活発なときは1秒間に何度も呼ばれ、相場が閑散としているときはほとんど呼ばれない</li>
<li><strong>週末・祝日：</strong>マーケットが閉まっている間はティックが発生しないため、OnTick関数は呼ばれない</li>
<li><strong>他の通貨ペア：</strong>アタッチした通貨ペア以外の価格変動では呼ばれない</li>
</ul>
<h2><span id="toc7">プログラム例1：基本的なティック情報の表示</span></h2>
<p>最もシンプルな例として、ティックが発生するたびに現在の価格情報をログに出力するEAです。OnTick関数の動作を確認するのに最適です。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 基本的なティック情報表示EA                                         |
//+------------------------------------------------------------------+
void OnTick()
{
   // 現在のBid価格とAsk価格を取得
   double currentBid = Bid;
   double currentAsk = Ask;
   
   // スプレッドをポイント単位で計算
   double spread = (Ask - Bid) / Point;
   
   // ログに価格情報を出力
   Print("通貨ペア: ", Symbol(),
         " | Bid: ", DoubleToString(currentBid, Digits),
         " | Ask: ", DoubleToString(currentAsk, Digits),
         " | スプレッド: ", DoubleToString(spread, 1), " pips");
   
   // チャート上にも情報を表示
   Comment("最終ティック時刻: ", TimeToString(TimeCurrent(), TIME_SECONDS),
           "\nBid: ", DoubleToString(currentBid, Digits),
           "\nAsk: ", DoubleToString(currentAsk, Digits),
           "\nスプレッド: ", DoubleToString(spread, 1), " points");
}
</code></pre>
<p>このEAをチャートにアタッチすると、ティックが発生するたびにエキスパートタブにログが出力され、チャート左上に価格情報がリアルタイム表示されます。</p>
<h2><span id="toc8">プログラム例2：新しいロウソク足の確定を検出する</span></h2>
<p>OnTick関数はティックごとに呼ばれるため、「新しいロウソク足が形成されたとき（＝前の足が確定したとき）だけ処理を実行する」というパターンは非常によく使われます。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 新しいバー検出EA                                                   |
//+------------------------------------------------------------------+

// 前回のバーの時刻を記録するためのグローバル変数
datetime lastBarTime = 0;

//+------------------------------------------------------------------+
//| 新しいバーが形成されたかを判定する関数                              |
//+------------------------------------------------------------------+
bool IsNewBar()
{
   // 現在のバー（最新の未確定バー）の開始時刻を取得
   datetime currentBarTime = iTime(Symbol(), Period(), 0);
   
   // 前回記録した時刻と異なれば新しいバーが形成された
   if(currentBarTime != lastBarTime)
   {
      lastBarTime = currentBarTime;  // 時刻を更新
      return true;                    // 新しいバーが出現
   }
   
   return false;  // まだ同じバーの中
}

//+------------------------------------------------------------------+
//| OnTick関数                                                        |
//+------------------------------------------------------------------+
void OnTick()
{
   // 新しいバーが形成されたときだけ処理を実行
   if(!IsNewBar())
      return;  // 新しいバーでなければ何もしない
   
   // ここに新しいバー確定時の処理を記述
   // インデックス1が直前に確定したバー
   double closePrice = iClose(Symbol(), Period(), 1);
   double openPrice  = iOpen(Symbol(), Period(), 1);
   double highPrice  = iHigh(Symbol(), Period(), 1);
   double lowPrice   = iLow(Symbol(), Period(), 1);
   
   Print("=== 新しいバー検出 ===");
   Print("確定したバーの情報:");
   Print("  始値: ", DoubleToString(openPrice, Digits));
   Print("  高値: ", DoubleToString(highPrice, Digits));
   Print("  安値: ", DoubleToString(lowPrice, Digits));
   Print("  終値: ", DoubleToString(closePrice, Digits));
   
   // 陽線か陰線かを判定
   if(closePrice > openPrice)
      Print("  → 陽線（上昇）");
   else if(closePrice < openPrice)
      Print("  → 陰線（下降）");
   else
      Print("  → 十字線（同事線）");
}
</code></pre>
<p>この「新しいバー検出パターン」は、EAの処理負荷を軽減し、確定した価格データのみで売買判断を行う際に不可欠なテクニックです。</p>
<h2><span id="toc9">プログラム例3：移動平均線クロスによる売買EA</span></h2>
<p>OnTick関数の中で実際に売買注文を出す実践的な例です。短期移動平均線と長期移動平均線のクロスを検出して売買を行います。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 移動平均線クロスEA                                                 |
//+------------------------------------------------------------------+

// 外部パラメータ（ユーザーが変更可能）
extern int    FastMA_Period = 10;     // 短期移動平均線の期間
extern int    SlowMA_Period = 25;     // 長期移動平均線の期間
extern double LotSize       = 0.1;   // 取引ロット数
extern int    Slippage      = 3;     // 許容スリッページ
extern int    MagicNumber   = 12345; // マジックナンバー

// 新しいバー検出用の変数
datetime g_lastBarTime = 0;

//+------------------------------------------------------------------+
//| 新しいバー判定                                                     |
//+------------------------------------------------------------------+
bool IsNewBar()
{
   datetime currentBarTime = iTime(Symbol(), Period(), 0);
   if(currentBarTime != g_lastBarTime)
   {
      g_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;
}

//+------------------------------------------------------------------+
//| 指定タイプのポジションをすべて決済する関数                          |
//+------------------------------------------------------------------+
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)
         {
            if(OrderType() == type)
            {
               double closePrice;
               if(type == OP_BUY)
                  closePrice = Bid;   // 買いポジションはBidで決済
               else
                  closePrice = Ask;   // 売りポジションはAskで決済
               
               bool result = OrderClose(OrderTicket(), OrderLots(), closePrice, Slippage, clrNONE);
               if(!result)
                  Print("決済エラー: ", GetLastError());
            }
         }
      }
   }
}

//+------------------------------------------------------------------+
//| OnTick関数 - メインロジック                                        |
//+------------------------------------------------------------------+
void OnTick()
{
   // 新しいバーが確定したときだけ判定を行う
   if(!IsNewBar())
      return;
   
   // 移動平均線の値を取得（バーインデックス1 = 直前の確定バー）
   double fastMA_current  = iMA(Symbol(), Period(), FastMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1);
   double slowMA_current  = iMA(Symbol(), Period(), SlowMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1);
   
   // 1本前の移動平均線の値（バーインデックス2）
   double fastMA_previous = iMA(Symbol(), Period(), FastMA_Period, 0, MODE_SMA, PRICE_CLOSE, 2);
   double slowMA_previous = iMA(Symbol(), Period(), SlowMA_Period, 0, MODE_SMA, PRICE_CLOSE, 2);
   
   // ゴールデンクロス判定（短期が長期を下から上に抜ける）
   bool goldenCross = (fastMA_previous <= slowMA_previous) &#038;&#038; (fastMA_current > slowMA_current);
   
   // デッドクロス判定（短期が長期を上から下に抜ける）
   bool deadCross = (fastMA_previous >= slowMA_previous) && (fastMA_current < slowMA_current);
   
   // ゴールデンクロス → 売りポジションを決済して買い注文
   if(goldenCross)
   {
      Print("★ ゴールデンクロス検出！買いエントリー");
      
      // 売りポジションがあれば決済
      ClosePositions(OP_SELL);
      
      // 買いポジションがなければ新規買い注文
      if(CountPositions(OP_BUY) == 0)
      {
         int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage,
                                0, 0, "MA Cross Buy", MagicNumber, 0, clrBlue);
         if(ticket < 0)
            Print("買い注文エラー: ", GetLastError());
         else
            Print("買い注文成功 チケット: ", ticket, " 価格: ", Ask);
      }
   }
   
   // デッドクロス → 買いポジションを決済して売り注文
   if(deadCross)
   {
      Print("★ デッドクロス検出！売りエントリー");
      
      // 買いポジションがあれば決済
      ClosePositions(OP_BUY);
      
      // 売りポジションがなければ新規売り注文
      if(CountPositions(OP_SELL) == 0)
      {
         int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage,
                                0, 0, "MA Cross Sell", MagicNumber, 0, clrRed);
         if(ticket < 0)
            Print("売り注文エラー: ", GetLastError());
         else
            Print("売り注文成功 チケット: ", ticket, " 価格: ", Bid);
      }
   }
}
</code></pre>
<p>この例では、OnTick関数内で新しいバーの確定を検出し、移動平均線のクロスを判定して自動売買を行っています。実際のEA開発の基本パターンとして参考にしてください。</p>
<h2><span id="toc10">プログラム例4：複数の処理を整理して管理する構造</span></h2>
<p>実際のEA開発では、OnTick関数の中に全ての処理を詰め込むと可読性が下がります。役割ごとに関数を分割し、OnTick関数はそれらを呼び出すだけのシンプルな構造にするのがベストプラクティスです。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| 構造化されたEAのテンプレート                                        |
//+------------------------------------------------------------------+

extern double LotSize     = 0.1;
extern int    MagicNumber = 99999;

datetime g_lastBarTime = 0;

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
{
   Print("EA初期化完了: ", Symbol(), " ", EnumToString((ENUM_TIMEFRAMES)Period()));
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| 終了処理関数                                                      |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print("EA停止: 理由コード = ", reason);
   Comment("");  // チャート上のコメントをクリア
}

//+------------------------------------------------------------------+
//| OnTick関数 - すべての処理の起点                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   // ステップ1: チャート上に情報を表示（毎ティック更新）
   DisplayInfo();
   
   // ステップ2: 新しいバーでなければ以降の処理をスキップ
   if(!IsNewBar())
      return;
   
   // ステップ3: 既存ポジションの管理（トレーリングストップなど）
   ManagePositions();
   
   // ステップ4: エントリーシグナルの確認
   int signal = CheckSignal();
   
   // ステップ5: シグナルに基づいてエントリー
   if(signal != 0)
      ExecuteTrade(signal);
}

//+------------------------------------------------------------------+
//| チャート上に情報を表示する関数                                      |
//+------------------------------------------------------------------+
void DisplayInfo()
{
   int buyCount  = CountMyPositions(OP_BUY);
   int sellCount = CountMyPositions(OP_SELL);
   double totalProfit = CalculateTotalProfit();
   
   string info = "";
   info += "━━━ EA情報パネル ━━━\n";
   info += "通貨ペア: " + Symbol() + "\n";
   info += "時間足: " + IntegerToString(Period()) + "分\n";
   info += "現在時刻: " + TimeToString(TimeCurrent(), TIME_SECONDS) + "\n";
   info += "━━━━━━━━━━━━━━━\n";
   info += "買いポジション: " + IntegerToString(buyCount) + "\n";
   info += "売りポジション: " + IntegerToString(sellCount) + "\n";
   info += "合計損益: " + DoubleToString(totalProfit, 2) + " " + AccountCurrency() + "\n";
   
   Comment(info);
}

//+------------------------------------------------------------------+
//| 新しいバーの判定                                                   |
//+------------------------------------------------------------------+
bool IsNewBar()
{
   datetime currentBarTime = iTime(Symbol(), Period(), 0);
   if(currentBarTime != g_lastBarTime)
   {
      g_lastBarTime = currentBarTime;
      return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| 既存ポジションの管理                                               |
//+------------------------------------------------------------------+
void ManagePositions()
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         continue;
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber)
         continue;
      
      // 例：利益が50pips以上なら建値にストップロスを移動
      double profitPips = 0;
      if(OrderType() == OP_BUY)
         profitPips = (Bid - OrderOpenPrice()) / Point;
      else if(OrderType() == OP_SELL)
         profitPips = (OrderOpenPrice() - Ask) / Point;
      
      // 5桁ブローカー対応（10で割る）
      if(Digits == 3 || Digits == 5)
         profitPips /= 10.0;
      
      if(profitPips >= 50.0 && OrderStopLoss() != OrderOpenPrice())
      {
         bool result = OrderModify(OrderTicket(), OrderOpenPrice(),
                                    OrderOpenPrice(), OrderTakeProfit(), 0, clrGreen);
         if(result)
            Print("建値ストップに移動: チケット ", OrderTicket());
      }
   }
}

//+------------------------------------------------------------------+
//| エントリーシグナルの確認                                            |
//| 戻り値: 1=買い, -1=売り, 0=シグナルなし                            |
//+------------------------------------------------------------------+
int CheckSignal()
{
   // RSIを使った簡単なシグナル例
   double rsi = iRSI(Symbol(), Period(), 14, PRICE_CLOSE, 1);
   
   // RSIが30以下で買いシグナル
   if(rsi < 30.0)
   {
      Print("買いシグナル検出 RSI=", DoubleToString(rsi, 2));
      return 1;
   }
   
   // RSIが70以上で売りシグナル
   if(rsi > 70.0)
   {
      Print("売りシグナル検出 RSI=", DoubleToString(rsi, 2));
      return -1;
   }
   
   return 0;  // シグナルなし
}

//+------------------------------------------------------------------+
//| 売買を実行する関数                                                 |
//+------------------------------------------------------------------+
void ExecuteTrade(int signal)
{
   // 既にポジションがある場合はエントリーしない
   if(CountMyPositions(OP_BUY) + CountMyPositions(OP_SELL) > 0)
      return;
   
   int ticket = -1;
   
   if(signal == 1)  // 買い
   {
      ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3,
                          0, 0, "RSI Buy", MagicNumber, 0, clrBlue);
   }
   else if(signal == -1)  // 売り
   {
      ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3,
                          0, 0, "RSI Sell", MagicNumber, 0, clrRed);
   }
   
   if(ticket < 0)
      Print("注文エラー: ", GetLastError());
   else
      Print("注文成功: チケット ", ticket);
}

//+------------------------------------------------------------------+
//| 自分のポジション数を数える関数                                      |
//+------------------------------------------------------------------+
int CountMyPositions(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;
}

//+------------------------------------------------------------------+
//| 全ポジションの合計損益を計算する関数                                |
//+------------------------------------------------------------------+
double CalculateTotalProfit()
{
   double profit = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
            profit += OrderProfit() + OrderSwap() + OrderCommission();
      }
   }
   return profit;
}
</code></pre>
<p>この構造では、OnTick関数は5つのステップ（情報表示→新バー判定→ポジション管理→シグナル確認→売買実行）を順に呼び出すだけのシンプルな形になっています。各処理が独立した関数に分離されているため、メンテナンスや機能追加が容易です。</p>
<h2><span id="toc11">OnTick関数の重要なポイントと注意事項</span></h2>
<h3><span id="toc12">1. ティック頻度は一定ではない</span></h3>
<p>OnTick関数の呼び出し頻度は相場の活発さに依存します。ロンドン・ニューヨーク時間は1秒に何十回も呼ばれることがありますが、週末前やアジア早朝は数秒〜数十秒に1回しか呼ばれないこともあります。<strong>「一定間隔で処理を実行したい」場合はOnTimer関数の使用</strong>を検討してください。</p>
<h3><span id="toc13">2. 他の通貨ペアのティックでは呼ばれない</span></h3>
<p>EAをEURUSDのチャートにアタッチした場合、USDJPYの価格が変動してもOnTick関数は呼ばれません。複数通貨ペアを監視したい場合は工夫が必要です。</p>
<h3><span id="toc14">3. 重い処理を入れない</span></h3>
<p>OnTick関数内の処理が完了するまで次のティックの処理は待機状態になります。大量のループや複雑な計算を毎ティック実行すると、<strong>ティックの取りこぼしや動作の遅延</strong>が発生します。重い処理は新しいバー確定時だけ実行するなど、工夫しましょう。</p>
<h3><span id="toc15">4. バックテストでの動作</span></h3>
<p>ストラテジーテスターでは、テストモデル（全ティック、コントロールポイント、始値のみ）によってOnTick関数の呼び出し頻度が大きく異なります。「始値のみ」モデルでは各バーにつき1回しか呼ばれないため、ティックごとの処理は正しくテストできません。</p>
<h3><span id="toc16">5. エラー処理を忘れない</span></h3>
<p>OnTick関数内で注文を出す場合、通信エラーやスリッページなどで失敗することがあります。OrderSend関数やOrderClose関数の戻り値を必ず確認し、エラー時の処理（リトライやログ出力）を実装しましょう。</p>
<h3><span id="toc17">6. OnTick関数とOnInit/OnDeinitの関係</span></h3>
<p>EA全体のライフサイクルは以下の順序で進みます。</p>
<ul>
<li><strong>OnInit()</strong> → EAがチャートにアタッチされたとき1回だけ実行（初期化処理）</li>
<li><strong>OnTick()</strong> → ティック発生のたびに繰り返し実行（メイン処理）</li>
<li><strong>OnDeinit()</strong> → EAが停止・削除されるとき1回だけ実行（終了処理）</li>
</ul>
<h2><span id="toc18">まとめ</span></h2>
<p>OnTick関数はMQL4のEA開発における<strong>心臓部</strong>であり、価格変動に応じた自動売買ロジックのすべてがこの関数を起点に動作します。以下のポイントを押さえておきましょう。</p>
<ul>
<li>ティック（価格変動）が発生するたびに自動的に呼ばれるイベント関数</li>
<li>引数なし、戻り値なし（void）のシンプルな関数</li>
<li>EA専用の関数であり、インジケーターやスクリプトでは使えない</li>
<li>新しいバーの確定検出と組み合わせて使うのが定番パターン</li>
<li>処理の構造化（関数分割）を意識して、保守しやすいコードを書く</li>
</ul>
<p>投稿 <a href="https://mql-programing.com/archives/2949/ontick/">【MQL4関数】OnTick関数とは？ロウソク足が動いたときに実行されるイベント関数</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】OnStart関数とは？スクリプトだけに使われるイベント関数！</title>
		<link>https://mql-programing.com/archives/2889/onstart/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Mon, 09 May 2022 12:45:52 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[自動売買]]></category>
		<category><![CDATA[OnStart]]></category>
		<category><![CDATA[OnTick]]></category>
		<category><![CDATA[スクリプト]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=2889</guid>

					<description><![CDATA[<p>OnStart関数とは 「自動売買を作るほどじゃないけど、少しだけプログラムを実行したい！」 という方は、スクリプトを作成してみましょう！ 例えば、勝敗を集計してファイルに出力するだけのプログラムなどです。 ちょっとした [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/2889/onstart/">【MQL4関数】OnStart関数とは？スクリプトだけに使われるイベント関数！</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 class="wp-block-paragraph">OnStart関数は、自動売買EAを作成するために使われる関数では<strong><span class="marker-under-red">ありません</span></strong>。<br>スクリプトというプログラムで使われるイベント関数で、よほど詳しくないと使う機会はないでしょう。</p>
</div></div>



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



<p class="wp-block-paragraph"><strong>「自動売買を作るほどじゃないけど、少しだけプログラムを実行したい！」</strong></p>



<p class="wp-block-paragraph">という方は、スクリプトを作成してみましょう！</p>



<p class="wp-block-paragraph">例えば、勝敗を集計してファイルに出力するだけのプログラムなどです。</p>



<p class="wp-block-paragraph">ちょっとしたプログラムを動かすときは、自動売買プログラムよりもスクリプトが適切です。</p>



<p class="wp-block-paragraph">　</p>



<p class="wp-block-paragraph"><strong>スクリプトを新規作成すると、以下のようなプログラムが自動作成されます。</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//+------------------------------------------------------------------+
//|                                                  onStartTest.mq4 |
//|                                     Copyright 2022, Asahina Risa |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright &quot;Copyright 2022, Asahina Risa&quot;
#property link      &quot;https://mql-programing.com/&quot;
#property version   &quot;1.00&quot;
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   
  }
//+------------------------------------------------------------------+</code></pre></div>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">このように、すでにOnStart関数が記述されています。</p>



<p class="wp-block-paragraph"><strong><span class="marker-under-red">OnStart関数とは、スクリプトだけに使用される関数なので、馴染みのない方が多いと思います。</span></strong></p>



<p class="wp-block-paragraph">スクリプトで使われる唯一のイベント関数です。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">OnStart関数はイベント関数なので、イベントが起こったときに実行されます。</p>



<p class="wp-block-paragraph"><strong>そのイベントとは、「ロウソク足が動いたとき」です。</strong></p>



<p class="wp-block-paragraph">感覚的には、OnTick関数と似たような感じです。</p>



<p class="wp-block-paragraph">そのため、OnTick関数とOnStart関数を、一緒のものだと勘違いする方が多いです。</p>



<p class="wp-block-paragraph">実際、OnTick関数をOnStart関数に書き換えても、問題なく動きます。</p>



<p class="wp-block-paragraph">しかしMT4では、<strong><span class="marker-under-red">OnTick関数が記述されているのが自動売買EAで、OnStart関数が記述されているのがスクリプトと判断する</span></strong>ので、どこかで不具合が発生する可能性があります。</p>



<p class="wp-block-paragraph">そのような不具合を作らないためにも、今回はOnStart関数を理解していきましょう！</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



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



<p class="wp-block-paragraph">OnStart関数の使い方は、基本的な関数と同じです。</p>



<p class="wp-block-paragraph">関数をマスターしていない方はこちらの記事が参考になります。</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 fetchpriority="high" 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="320" height="180" /></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 class="wp-block-paragraph">　</p>



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



<p class="wp-block-paragraph">OnStart関数はとてもシンプルな関数です。</p>



<p class="wp-block-paragraph">引数なしで実行できます。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">OnStart関数の基本的な書き方は以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>void OnStart()
  {
   
  }</code></pre></div>



<p class="wp-block-paragraph">　</p>



<p class="wp-block-paragraph">返り値は void型なので、特にreturnを書く必要はありません。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



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



<p class="wp-block-paragraph">void型</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



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



<p class="wp-block-paragraph">なし</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">プログラム例</span></h3>



<p class="wp-block-paragraph">以下は、OnStart関数を使ったスクリプトの簡単なプログラム例です。チャートにスクリプトを適用すると、現在の通貨ペア名と現在価格をアラートで表示します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//+------------------------------------------------------------------+
//|                                            onStartSample.mq4     |
//|                                     Copyright 2022, Asahina Risa |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright &quot;Copyright 2022, Asahina Risa&quot;
#property link      &quot;https://mql-programing.com/&quot;
#property version   &quot;1.00&quot;
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   // 現在の通貨ペア名を取得
   string symbol = Symbol();

   // 現在の売値（Bid）を取得
   double price = Bid;

   // アラートで通貨ペア名と現在価格を表示
   Alert(symbol + &quot; の現在価格は &quot; + DoubleToStr(price, Digits) + &quot; です。&quot;);
  }
//+------------------------------------------------------------------+</code></pre></div>



<p class="wp-block-paragraph">このスクリプトをチャートにドラッグ＆ドロップすると、OnStart関数が1度だけ実行され、アラートが表示されます。</p>



<p class="wp-block-paragraph"><strong>スクリプトはEAと異なり、一度実行されると処理が完了した時点で自動的に終了します。</strong>繰り返し実行されることはありません。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">　</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 class="wp-block-paragraph">　</p>



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



<p class="wp-block-paragraph"><strong><span class="marker-under-red">OnStart関数は、スクリプトで実行される唯一のイベント関数です。</span></strong></p>



<p class="wp-block-paragraph">スクリプトをチャートに適用すると、OnStart関数内の処理が1度だけ実行されます。</p>



<p class="wp-block-paragraph">OnTick関数と混同してしまうことがありますので、注意しましょう。</p>



<p class="wp-block-paragraph">余計な不具合を出さないためにも、正しくOnStart関数を使ってください。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<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 decoding="async" src="https://mql-programing.com/main29/wp-content/uploads/cocoon-resources/blog-card-cache/a4e701a9f8569faadbe992111b709637.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></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">はじめに この記事は、MQLプログラミング基礎を理解している方向けに作成しております。 もしMQLプログラミングがわからないという方は、先に以下の記事を読んでおくことをオススメします。 カテゴリー：MQLプログラミング基</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/2889/onstart/">【MQL4関数】OnStart関数とは？スクリプトだけに使われるイベント関数！</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
