MT4に矢印を表示させるサインツールの作り方を分かりやすく解説!

MQL4でEAやインジケーターのプログラミングを行うと、矢印の表示が必要になることがあります。

例えば、特定の条件を設定し、その条件が満たされた時に矢印を表示するシーンは、MT4でインジケーターを作成する際によく見られます。

今回は、そんな場面で矢印を表示する方法についてまとめました。

分かりやすさを重視して、矢印の表示方法やコードの記述手順も解説していますので、最後までお読みください。

MT4に矢印を表示させるサインツールを作るメリット

インジケーターを作成する際に矢印を表示させるのには次のようなメリットがあります。

  1. チャート分析に必要な時間を効率的に減らすことが可能
  2. 過去のデータを使った検証も行うことができる
  3. サイン条件を視覚化することによって、他の要素も把握できる

これらのメリットについて詳しく解説しましょう。

チャート分析に必要な時間を効率的に減らすことが可能

MQL4で矢印を表示できるようにするメリットは、時間の短縮にあります。

矢印を表示させる機能を持たせることによって、画面を注視し続ける必要がなくなり、席を立ったりすることもより容易になります。

このような機能があれば、スマートフォンが通信状態にあってサインが分かる場所にさえいれば、どこでも対応できます。

こういった機能を持つことで、生活の質が向上し、リラックスした状態でより優れたアイデアが生まれるかもしれません。

ただし、確実に言えることは、サインを示せるようにするだけで、トレードの肉体的、精神的負担が軽減されるという点です。

過去のデータを使った検証も行うことができる

矢印などでサイン条件を可視化できれば、過去チャートの状況も検証できます。

過去のデータを元にした検証をバックテストといいますが、サイン矢印を表示させるだけで、バックテストが容易になります。

具体的には次のような場面で役立ちます。

  • FXトレードにおいて指値や逆指値の設定をし、バックテストをすると矢印で分かりやすくなります。
  • バイナリーオプションにおいて次のタイミングでの反発確率が予想できます。

矢印を自動で付けることで、このような視覚的メリットもあります。

例えば、勝率の高いロジックであれば、資金が増えるタイミングを矢印で理解しやすくなります。

一方、勝率が振るわない場合は、負けるポイントを矢印で確認し、回避するタイミングを学ぶことができます。

サイン条件を視覚化することによって、他の要素も見ることができる

矢印を表示するサインツールを作成することで、サイン条件を視覚的に表現し、他の要素を確認できるようになります。

例えば、オシレーター系インジケーターと移動平均線をサインインジケーター化することで、ローソク足の形や波形により注目しやすくなります。

エントリーする際に、ローソク足の形、波形、オシレーターインジケーターの値、移動平均線などの情報を確認する必要があり、これらの情報を十分に把握することが難しい場合もあります。

一方、サインツールを使用することで、プログラムがこれらの要素を代わりに解決し、投資家は他の要素(波形の様子やローソク足の値動き)に集中できるようになります。

特に、プライスアクションと呼ばれる、値動きそのものを分析してチャートに刻まれた投資家心理を予測し、相場状況を判断していく手法が容易になるでしょう。

サインが出たらエントリーするだけで、資金がプラスになるインジケーターをMT4上で使用できるようになるため、投資で勝ちやすくなる可能性もあります。

このように、インジケーターのサイン条件が可視化されるサインツールを用いることで、他の要素を適切にチェックできる点もメリットといえるでしょう。

サインツールの作り方

メリットを紹介したところで、実際にサインツールを作る方法について説明します。

サインツールの作成は次のステップで行います。

  1. 新規作成
  2. インジケーターバッファの用意
  3. 使用するローソク足本数の計算
  4. ローソク足本数分のループ処理
  5. ロジックの条件式などのコードを記述
  6. アローを表示
  7. MT4チャートで確認

これらの手順について順番に解説します。

新規作成

矢印を表示するためのインジケーターを作成するために、まずは新規作成を行います。

MQL4の新規作成ボタンをクリックし、ファイル名を設定します。

ファイル名は自由に設定できますが、ここでは分かりやすく「Sample_Yajirusi」としておきましょう。

他の設定は特に指定する必要はありません。

「次へ」ボタンをクリックしてウィザードを進め、最終的に完了させます。

すると、ファイル「Sample_Yajirusi」が生成され、コードが表示されます。

インジケーターバッファの用意

インジケーターバッファを用意します。

インジケーターバッファとは、一言で言うとインジケーター用の配列のことで、チャート上にグラフィカルに値を示す機能を持った配列です。

インジケーターバッファを用意することで、次のような要素を簡単に取り扱えます。

  1. チャートのローソク足の数だけ要素数を用意できる
  2. 新しいローソク足が生成されてもその要素数が自動的に増加する

これらの特徴により、操作が非常に簡単になります。

通常、配列を生成する場合、いくつかの要素として連番を事前に指定する必要があります。

また、新しい要素数が必要になったら、そのたびに追加用のコードを実行する必要も出てきます。

しかし、インジケーターバッファを用意することで、そういった手間から解放されるメリットがあります。

インジケーターバッファの追加は次のように記述します。

記述例)インジケーターバッファを2つ宣言し、インジケーターバッファ用の配列を用意します。0番目に「High_Arrow」、1番目に「Low_Arrow」を指定します。

double High_Arrow[]; //上向きアロー用の配列
double Low_Arrow[]; //下向きアロー用の配列

int OnInit()
{
IndicatorBuffers(2); //インジケーターバッファ用配列を2つ指定

SetIndexBuffer(0, High_Arrow); //0番目のバッファにHigh_Arrow配列を指定
SetIndexLabel(0, "High_Arrow"); //0番目のバッファのラベルを"High_Arrow"に指定
SetIndexStyle(0, DRAW_ARROW, 0, 2, clrLightGreen); //0番目のバッファのスタイルをアローにして大きさや色を指定
SetIndexArrow(0, 233); //0番目のバッファのアローの種類を指定

SetIndexBuffer(1, Low_Arrow); //1番目のバッファにLow_Arrowを指定
SetIndexLabel(1, "Low_Arrow"); //1番目のバッファのラベルを"Low_Arrow"に指定
SetIndexStyle(1, DRAW_ARROW, 0, 2, clrOrangeRed); //1番目のバッファのスタイルをアローにして大きさや色を指定
SetIndexArrow(1, 234); //1番目のバッファのアローの種類を指定
}

インジケーターバッファは、0番からカウントする仕組みです。
そのため、0番目に「High_Arrow」、1番目に「Low_Arrow」を指定しています。

ここまでで準備は完了です。

使用するローソク足本数を計算

準備ができたら、ローソク足が何本存在するかをMQL4のコードで確認するための記述を行います。

メイン関数である「OnCalculate()」関数内に、以下のようなコードを使うことで計算が可能です。

int limit; //使用するローソク足本数用変数

if(prev_calculated==0) //初回時
{
limit = rates_total - 1;
}
else limit = rates_total - prev_calculated; //2回目以降

このように、「limit」という変数名を宣言します。

ローソク足の本数は整数で数えるため(1本、2本など)、int limitと記述します。

次に、if文で条件分岐を行います。

条件分岐は、ある条件が満たされているかどうかによって次に実行するプログラム上の位置を変化させるアクションです。

if内にある「prev_calculated」は、以前の呼び出しで処理されたローソク足の本数を示しています。

if文の内部にある「limit = rates_total – 1;」は、初回の呼び出し時にローソク足の本数から1を引いた値を「limit」に代入しています。

1本目が「0」となるためです。

次に、「else limit = rates_total – prev_calculated;」と記述していますが、これは2回目以降の場合です。

「rates_total – prev_calculated」とすることで、ローソク足の差分だけが計算され、次々と更新されていきます。

以上の仕組みをローソク足が100本あるケースを例に整理してみましょう。

初回:limit = 100 – 0 2回目以降:limit = 100 – 100 新しい足が生成される:limit = 101 – 100 次の更新時:limit = 101 – 101

ローソク足本数分のループ処理

プログラムに何度も同じ処理を繰り返し行わせることをループ処理(for)といいます。

ここでは、繰り返し処理を行いたいので、次のような記述を行います。

記述例)「i」が「0」以上の場合はループ処理を行い、「1」ずつ減らし、「0」未満になるとループ処理は終了します。

for(int i = limit; i >= 0; i--) //ローソク足本数分のループ処理
{
// ここに処理内容を記述
}

ここまで紹介した内容を記述することですべてのローソク足がチェックできます。

ロジックの条件式などのコードを書く

ロジックとは、プログラムを動かすために、処理内容や手順、方法を指す言葉です。

つまり、ここではプログラムを動かすための条件式を書きます。

詳細な説明は次のステップで行いますので、まずは以下のステップで解説します。

  1. テクニカルチャートの値を取得する
  2. if文を使って条件式を書く

まず、テクニカルチャートの値を取得します。

買われすぎか、売られすぎかを知るために、RSIやストキャスティクス(ストキャス)の値を取り入れましょう。

具体的な記述としては次のようになります。

  • iRSI()関数→RSIの値を取得
  • iStochastic()関数→ストキャスティクス

記述例)テクニカルチャートのメイン値やシグナル値を取得

//RSI値を変数に代入
double rsi_value = iRSI(NULL,NULL,14,PRICE_CLOSE,i);

//ストキャス メイン値を変数に代入
double sto_main = iStochastic(NULL,NULL,5,3,3,MODE_SMA,0,MODE_MAIN,i);
//ストキャス シグナル値を変数に代入
double sto_signal = iStochastic(NULL,NULL,5,3,3,MODE_SMA,0,MODE_SIGNAL,i);

次にif文を使って条件式を書きましょう。

条件と記述をまとめます。

Low条件
RSI(14)が閾値70以上
→rsi_value >= 70
ストキャス(5,3,3)のメインとシグナル閾値が80以上
→sto_main >= 80 かつ sto_signal >= 80

High条件
RSI(14)が閾値30以下
→ rsi_value <= 30
ストキャス(5,3,3)のメインとシグナル閾値が20以下
→sto_main <= 20 かつ sto_signal <= 20

これらの条件をつなげるのに「&&」を使用します。

記述例)条件を記述してつなげる。

//Lowアロー条件
if (rsi_value >= 70 && sto_main >= 80 && sto_signal >= 80)
{
// ここにアローを出すための処理を記述
}

//Highアロー条件
if (rsi_value <= 30 && sto_main <= 20 && sto_signal <= 20)
{
// ここにアローを出すための処理を記述
}

これらは矢印を出すためのコードになります。

次の項目では、実際に矢印を出す記述について解説します。

アローを出す

矢印をアローといいます。

この矢印(アロー)は、すぐに表示できるものの、そのまま表示してしまうと、ローソク足が見えにくくなるというトラブルが発生します。

こうしたトラブルを回避するために、記述を工夫しましょう。

その工夫は次の2点です。

  1. アローの向きを変える
  2. 位置を少しずらす

まず、アローの向きを変える方法として、配列の「Low_Arrow[i]」に高値の価格を表す「high[i]」を記述します。

この例では、下向きの矢印を「Low_Arrow[i]」に高値で表示することで見やすくなります。

次に重ならないように「10 * Point」を足します。

15や20でも問題ありません。

ここでいう「10 * Point」とは、座標から10ポイントずらすという意味ではなく、通貨ペアの価格の小数点の値を返してくれるあらかじめ定義された変数分だけずらすという意味です。

これらの工夫を反映して記述すると次のようになります。

記述例)これまでの条件で矢印を表示させ、少し位置をずらし、矢印の向きを変える。

//Lowアロー条件
if(rsi_value >= 70 && sto_main >= 80 && sto_signal >= 80)
{
Low_Arrow[i] = high[i] + 10 * Point;
}

//Highアロー条件
if(rsi_value <= 30 && sto_main <= 20 && sto_signal <= 20)
{
High_Arrow[i] = low[i] - 10 * Point;
}

以上で一連の記述が完成し、条件が合致するとローソク足から少しだけずれた位置に見やすい形で矢印(アロー)が表示されます。

コード全文

//+------------------------------------------------------------------+
//| Sample_Yajirusi.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2

double High_Arrow[]; //上向きアロー用の配列
double Low_Arrow[]; //下向きアロー用の配列

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
IndicatorBuffers(2); //インジケーターバッファ用配列を2つ指定

SetIndexBuffer(0, High_Arrow); //0番目のバッファにHigh_Arrow配列を指定
SetIndexLabel(0, "High_Arrow"); //0番目のバッファのラベルを"High_Arrow"に指定
SetIndexStyle(0, DRAW_ARROW, 0, 2, clrLightGreen); //0番目のバッファのスタイルをアローにして大きさや色を指定
SetIndexArrow(0, 233); //0番目のバッファのアローの種類を指定

SetIndexBuffer(1, Low_Arrow); //1番目のバッファにLow_Arrowを指定
SetIndexLabel(1, "Low_Arrow"); //1番目のバッファのラベルを"Low_Arrow"に指定
SetIndexStyle(1, DRAW_ARROW, 0, 2, clrOrangeRed); //1番目のバッファのスタイルをアローにして大きさや色を指定
SetIndexArrow(1, 234); //1番目のバッファのアローの種類を指定

return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
//---
int limit; //使用するローソク足本数用変数

if(prev_calculated == 0) //初回時
{
limit = rates_total - 1;
}
else
limit = rates_total - prev_calculated; //2回目以降

for(int i = limit; i >= 0; i--) //ローソク足本数分のループ処理
{

//RSI値を変数に代入
double rsi_value = iRSI(NULL, NULL, 14, PRICE_CLOSE, i);
//ストキャス メイン値を変数に代入
double sto_main = iStochastic(NULL, NULL, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, i);
//ストキャス シグナル値を変数に代入
double sto_signal = iStochastic(NULL, NULL, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, i);

//Lowアロー条件
if(rsi_value >= 70 && sto_main >= 80 && sto_signal >= 80)
{
Low_Arrow[i] = high[i] + 10 * Point;
}
//Highアロー条件
if(rsi_value <= 30 && sto_main <= 20 && sto_signal <= 20)
{
High_Arrow[i] = low[i] - 10 * Point;
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

MT4チャートで確認

コンパイル(MT4で動かせる形に変換する作業)を完了させたら、デバックのスタートボタンを押して動かしてみましょう。

ここで矢印が表示されたら、成功です。

さらに条件通りの場所に表示されているか、念のために確認しておくのもおすすめです。

サインツールの作り方まとめ

今回は、サインツールについてインジケーターバッファを用意し、ローソク足を計算し、さらにリアルタイムで計算し続ける記述について解説しました。

また、矢印を出す条件や実際に矢印を見やすく表示させる方法についてもまとめています。

これらの記述を参考にして、徐々に改変しながら仕組みを学んでいきましょう。

弊さいとが独自に開発した「FXオリジナルインジケーター」を無料でプレゼント!

インターネット上に存在しないインジケーター、他では高額な金額で販売されているようなインジケーターも無料で配布する期間限定のプレゼント企画!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です