見出し画像

【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のメタエディタで保存

  1. MT4を開く

  2. メタエディタを開く(F4キー)

  3. 「ファイル」→「新規作成」→「カスタムインディケータ」

  4. 「GoldenCrossAlert.mq4」としてファイル作成(任意の名前でOK)

  5. コードを貼り付け


ステップ3:コンパイル

  1. 「コンパイル」ボタンをクリック

  2. エラーが出なければ成功


ステップ4:チャートに適用

  1. MT4のチャートを開く

  2. ナビゲーターから「GoldenCrossAlert」をドラッグ&ドロップ

  3. 設定画面が表示される


ステップ5:設定を変更してみる

  • ShortMAPeriod:5 → 10に変更

  • LongMAPeriod:20 → 50に変更

  • UseAlert:true → false に変更

  • ArrowOffsetPips:20 → 30に変更

「OK」をクリック。

設定した期間で、移動平均が計算される!

コードを一切いじらずに、色んなパターンを試せます。


input変数のポイント

  • 設定画面で変更できる

  • コンパイルし直さなくていい

  • ユーザーが変えそうな値は全部input

  • bool型でON/OFF設定

  • color型で色設定

  • externは古い書き方(使わない)

「この値、後で変えるかも」って思ったら、全部inputつける。

これが、プロっぽいインジケーターの作り方です。


次回予告

次は「input変数を使った実践的なEA開発」を解説します。

フォローして更新を見逃さないでください!


⚠️ 免責事項

このコードは学習用です。実際の取引に使用する場合は、十分にテストしてから自己責任でお願いします。

いいなと思ったら応援しよう!