【MQL4入門】input変数って何?普通の変数と何が違うの?【年利255%EA作成者がAIで1から学ぶ】
はじめに
MQL4でインジケーター作ってると、こういうコードが出てきます:
input int ShortMAPeriod = 5;「inputって何...?」
最初、私も全く分かりませんでした😂
int period = 14; なら分かるけど、なんでinputがついてるの?
GPTに聞いても、「ユーザーが設定できる変数です」って言われて、
「いや、だから何??」
ってなりました。
今回は、プログラミング初心者の私でも理解できるように、input変数を解説します。
まず、普通の変数
これは分かる:
int period = 14;
double lots = 0.1;
string message = "Hello!";「箱を作って、値を入れる」
periodという箱に、14を入れる
lotsという箱に、0.1を入れる
messageという箱に、"Hello!"を入れる
でも、この値を変えたい時
コードを開いて、書き換えないといけない。
int period = 14; // これを20に変えたい↓
int period = 20; // 書き換える
めんどくさい😂
しかも、コンパイルし直さないといけない。
inputを使うと
こう書く:
input int period = 14;たったこれだけで、何が変わるかというと、
MT4の設定画面で変更できるようになる!
実際にどう見えるのか
ゴールデンクロスアラートインジケーターで実践
今回は、以前作った実際に動くゴールデン(デッド)クロスアラートインジケーターを例に説明します。
コード(重要部分のみ抜粋):
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;
input bool UseAlert = true;
input double ArrowOffsetPips = 20;インジケーターをチャートに入れる時
こういう画面が出ますよね

ここに"input"で宣言した変数が表示される!
ShortMAPeriod:短期移動平均の期間
LongMAPeriod:長期移動平均の期間
UseAlert:アラート通知のON/OFF
ArrowOffsetPips:矢印の表示位置(pips)
ここで数字を変えれば、コードいじらなくても動きが変わる。
具体例で比較
① inputなし
int ShortMAPeriod = 5;
int LongMAPeriod = 20;
int OnInit()
{
Print("短期MA期間は ", ShortMAPeriod);
Print("長期MA期間は ", LongMAPeriod);
return(INIT_SUCCEEDED);
}結果:
チャートに入れても、期間を変更できない
「5と20」固定
変えたかったらコード書き換え
② inputあり
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;
int OnInit()
{
Print("短期MA期間は ", ShortMAPeriod);
Print("長期MA期間は ", LongMAPeriod);
return(INIT_SUCCEEDED);
}結果:
チャートに入れる時、設定画面が出る
期間を好きな数字に変更できる
「5と20」「10と50」「20と200」自由
これ、めちゃくちゃ便利です。
私の失敗談
最初、inputを書いてなかった
ゴールデンクロスのインジケーター作った時、最初こう書いてました:
int ShortMAPeriod = 5;
int LongMAPeriod = 20;動いた!
でも、「期間変えて試したいな」って思って、毎回コード開いて書き換えてた😂
int ShortMAPeriod = 10; // 5→10に変更↓ 保存
↓ コンパイル
↓ チャートに入れ直す
めんどくさすぎるw
inputつけたら
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;チャートに入れる時に変更できる!
コード一切いじらず、
「5と20」「10と50」「20と200」
色んなパターン試せる。
最高!!!!
どんな時に使うの?
ユーザーが変えそうな値は全部input
よくある例:
// 期間設定
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;
// ロット数(EAの場合)
input double lots = 0.1;
// 色
input color BuyArrowColor = Red;
input color SellArrowColor = Blue;
// ON/OFF設定
input bool UseAlert = true;
// 矢印の位置調整
input double ArrowOffsetPips = 20;
「この値、後で変えるかも」って思ったら、全部inputつけとけばOK。
実際のコード例:ゴールデン(デッド)クロスアラート
完全版コード
//+------------------------------------------------------------------+
//| GoldenCrossAlert_v5_fixed (安定版:矢印は全期間、アラートは確定バー) |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red // ゴールデンクロス
#property indicator_color2 Blue // デッドクロス
double BuyArrow[];
double SellArrow[];
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;
input bool UseAlert = true;
input double ArrowOffsetPips = 20;
static datetime lastAlertBarTime = 0;
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0, BuyArrow);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 233);
SetIndexBuffer(1, SellArrow);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 234);
IndicatorShortName("GoldenCrossAlert_v5_fixed");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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[])
{
if(rates_total < LongMAPeriod + 1) return(0);
// 初回のみ全バー初期化
if(prev_calculated == 0)
{
for(int j=0; j<rates_total; j++)
{
BuyArrow[j] = EMPTY_VALUE;
SellArrow[j] = EMPTY_VALUE;
}
}
// 全バーで矢印描画判定
for(int i = rates_total - LongMAPeriod - 1; i >= 1; i--)
{
double maShortNow = iMA(NULL,0,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,i);
double maLongNow = iMA(NULL,0,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,i);
double maShortPrev = iMA(NULL,0,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,i+1);
double maLongPrev = iMA(NULL,0,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,i+1);
// クロス検出
if(maShortPrev < maLongPrev && maShortNow > maLongNow)
BuyArrow[i] = Low[i] - ArrowOffsetPips * Point * 10;
if(maShortPrev > maLongPrev && maShortNow < maLongNow)
SellArrow[i] = High[i] + ArrowOffsetPips * Point * 10;
}
// ---- アラート用(確定バーのみ) ----
int bar = rates_total - 2;
double shortNow = iMA(NULL,0,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,bar);
double longNow = iMA(NULL,0,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,bar);
double shortPrev = iMA(NULL,0,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,bar+1);
double longPrev = iMA(NULL,0,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,bar+1);
string msg = "";
if(shortPrev < longPrev && shortNow > longNow)
msg = Symbol() + " " + IntegerToString(Period()) + "分足: ゴールデンクロス!";
else if(shortPrev > longPrev && shortNow < longNow)
msg = Symbol() + " " + IntegerToString(Period()) + "分足: デッドクロス!";
if(UseAlert && msg != "" && time[bar] != lastAlertBarTime)
{
Alert(msg);
Print(msg);
lastAlertBarTime = time[bar];
}
return(rates_total);
}
//+------------------------------------------------------------------+
input変数の役割
① ShortMAPeriod / LongMAPeriod
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;
役割:
短期移動平均と長期移動平均の期間を設定
デフォルトは「5と20」
設定画面で「10と50」「20と200」など自由に変更可能
使い方:
double maShortNow = iMA(NULL,0,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,i);
double maLongNow = iMA(NULL,0,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,i);② UseAlert
input bool UseAlert = true;役割:
アラート通知のON/OFF
true:アラートあり
false:アラートなし
使い方:
if(UseAlert && msg != "")
{
Alert(msg);
Print(msg);
}③ ArrowOffsetPips
input double ArrowOffsetPips = 20;役割:
矢印の表示位置を調整
ローソク足から何pips離すか
使い方:
BuyArrow[i] = Low[i] - ArrowOffsetPips * Point * 10;
SellArrow[i] = High[i] + ArrowOffsetPips * Point * 10;
色やON/OFFも設定できる
色の設定
input color BuyArrowColor = Red;
input color SellArrowColor = Blue;設定画面で色を選べる。
ON/OFF設定
input bool UseAlert = true;選択ボックスで切り替えられる。
true:アラートあり
false:アラートなし

externとの違い
昔の書き方
extern int ShortMAPeriod = 5;これ、古いMQLの書き方。
今はinputに置き換わってます。
なぜexternが残ってるのか
昔のコードとの互換性のため。
新しく書くなら、input使ってください。
(これは私も知らなかったのです、ChatGPTにインジケーターやEAの作成をお願いするとたまにexternを出してくることがあるので注意ですw)
まとめ
変数の種類

使い分け
内部でしか使わない値:
int count = 0;
double temp = 0.0;
static datetime lastAlertBarTime = 0;ユーザーが変えそうな値:
input int ShortMAPeriod = 5;
input int LongMAPeriod = 20;
input bool UseAlert = true;
input double ArrowOffsetPips = 20;迷ったら、inputつけとけばOK。
実際に試してみよう
ステップ1:コードをコピー
上記の完全版コードをコピー。
ステップ2:MT4のメタエディタで保存
MT4を開く
メタエディタを開く(F4キー)
「ファイル」→「新規作成」→「カスタムインディケータ」
「GoldenCrossAlert.mq4」としてファイル作成(任意の名前でOK)
コードを貼り付け


ステップ3:コンパイル
「コンパイル」ボタンをクリック
エラーが出なければ成功

ステップ4:チャートに適用
MT4のチャートを開く
ナビゲーターから「GoldenCrossAlert」をドラッグ&ドロップ
設定画面が表示される
ステップ5:設定を変更してみる
ShortMAPeriod:5 → 10に変更
LongMAPeriod:20 → 50に変更
UseAlert:true → false に変更
ArrowOffsetPips:20 → 30に変更
「OK」をクリック。
設定した期間で、移動平均が計算される!
コードを一切いじらずに、色んなパターンを試せます。
input変数のポイント
設定画面で変更できる
コンパイルし直さなくていい
ユーザーが変えそうな値は全部input
bool型でON/OFF設定
color型で色設定
externは古い書き方(使わない)
「この値、後で変えるかも」って思ったら、全部inputつける。
これが、プロっぽいインジケーターの作り方です。
次回予告
次は「input変数を使った実践的なEA開発」を解説します。
フォローして更新を見逃さないでください!
⚠️ 免責事項
このコードは学習用です。実際の取引に使用する場合は、十分にテストしてから自己責任でお願いします。
