FXやバイナリーオプションで使えるサインツールの作り方を初心者向けに解説!陽線にサインを出すコードの実装・カスタムインジケーターの設定・MQL4の学習方法まで詳しく紹介。サインツールを自作して、取引の精度を向上させましょう!
項目 | 内容 |
---|---|
サインツールの作成手順 | MT4のメタエディターで学習用コードの記述・コンパイル・保存までを画像付きで解説 |
コードの実装 | 陽線のみにサインを表示するプログラムを記述し、MT4に組み込み動作を確認する |
コードの解説 | 初期設定・メイン処理 (OnCalculate関数)・計算処理の仕組みを詳しく解説 |
MQL4の学習方法 | C++を学ぶと理解が早まる。ChatGPTで質問したり、無料のサインツール配布サイトのコードを参考にする。 |
サインツールの作り方
まずは、MT4を起動します。
上部のメニューバーより「ツール」⇒「メタエディター」を選択します。
MetaEditor(メタエディター)が起動します。
メタエディターのメニューより「ファイル」⇒「新しいファイル」を選択します。
「MQLウィザード:ファイル」のポップアップが表示されるので、「カスタムインディケータ)」を選択し、次へボタンをクリックします。
次にインジケーターの保存先を決めます。
デフォルトの状態では「Indicators\」のみ表示されています。
※Indicators\はカスタムインジケーターの保存先になるので消さないで下さい。
今回はyajirushiと言うファイル名で保存するので「Indicators\yajirushi」と記入します。名前を追加後に「次へ」ボタンをクリックします。
次に表示されるポップアップはデフォルトのまま「次へ」ボタンをクリックします。
次に表示されるポップアップはデフォルトのまま「完了」ボタンをクリックします。
デフォルトのテンプレートが表示されます。
陽線のみにサインを出してみよう
サインツールを出す初級編として、陽線のみにサインを出すコードを紹介します。陽線にはローソク足の始値や終値の測定など、覚えておいた方が良い項目が多く含まれていますのでおすすめです。
コードを貼り付けてみよう
まずは以下のコードをコピーしてメタエディターに張り付けてみましょう。
//+------------------------------------------------------------------+
//| カスタムインジケーターの初期設定 |
//+------------------------------------------------------------------+
#property copyright "あなたの名前"
#property link "あなたのウェブサイト"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
// サインを表示するためのバッファ
double SignalBuffer[];
//+------------------------------------------------------------------+
//| インジケーターの初期化 |
//+------------------------------------------------------------------+
int OnInit()
{
// バッファをセット
SetIndexBuffer(0, SignalBuffer);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 233); // 矢印のシンボル
IndicatorShortName("陽線サインインジケーター");
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[])
{
// 前回計算された位置からスタート
int start = prev_calculated > 0 ? prev_calculated - 1 : 0;
for (int i = start; i < rates_total; i++)
{
// 陽線かどうかのチェック (終値 > 始値)
if (close[i] > open[i])
{
SignalBuffer[i] = low[i] - 10 * Point; // 矢印をロウソク足の下に表示
}
else
{
SignalBuffer[i] = EMPTY_VALUE; // サインを非表示
}
}
return(rates_total);
}
メタエディターに表示されている初期テンプレートを全て削除します。
上記のコードを貼り付けます。
次に上部メニューより「ファイル」⇒「コンパイル」を選択します。
ツールボックスの「エラー」タブにエラーが発生していない事を確認します。
※メタエディターでコンパイルしたyajirushiファイルは「Indicators\yajirushi」に保存されています。保存先に関しては後程詳しく説明しますが、MT4に保存されており直ぐに利用する事が出来ます。
次にMT4を立ち上げます。
MT4のナビゲーター内にある「Examples」の中に「yajirushiファイル」が追加されている事を確認します。
次に「yajirushi」をダブルクリックします。
ポップアップが表示されるので「OK」ボタンをクリックします。
陽線のみにサインが表示される事を確認します。
今回作成した「yajirushiファイル」の保存先を詳しく紹介します。
※yajirushiファイルを「Indicators\yajirushi」で保存した場合
yajirushiファイルはMT4の中に保存されています。
確認の為に、MT4の上部メニューより「データフォルダーを開く」を選択します。
表示されるポップアップより「MQL4」を選択します。
次に「Indicators」を選択します。
Indicatorsの中にyajirusiファイルがある事を確認します。
サインツールのコードを詳しく解説
詳しく解説
- カスタムインジケーターの初期設定を詳しく解説
- インジケーターの初期化を詳しく解説
- メインループを詳しく解説
カスタムインジケーターの初期設定を詳しく解説
#property は、MQL4のスクリプトでインジケーターの動作や見た目を設定する命令です。例えば、インジケーターをメインチャートに表示するか、色を何にするか などを決めることができます。
#property link “あなたのウェブサイト”
#property version “1.00”
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
// サインを表示するためのバッファ
double SignalBuffer[];
コード | 意味 |
---|---|
#property copyright "あなたの名前" | 著作権情報(開発者の名前) |
#property link "あなたのウェブサイト" | ウェブサイトのリンク(開発者情報) |
#property version "1.00" | バージョン情報(現在のインジケーターのバージョン) |
#property indicator_chart_window | メインチャートにインジケーターを表示 |
#property indicator_buffers 1 | バッファの数(描画に使用する配列の数) |
#property indicator_color1 Red | インジケーターの色(ここでは赤) |
double SignalBuffer[]; | サインを表示するためのデータを格納する配列 |
著作者情報・ウェブサイトのリンク・バージョンは必要に応じて記入しましょう。
ここで理解しておきたいのはバッファになります。バッファは後々重要になるので必ず理解しておきましょう。
例えば、陽線にサインを表示させるために、「サインの位置」を保存する箱が必要です。
バッファに値を入れることで、チャートにサイン(矢印)を表示できるようになります!
インジケーターの初期化を詳しく解説
{
// バッファをセット
SetIndexBuffer(0, SignalBuffer);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 233); // 矢印のシンボル
IndicatorShortName(“陽線サインインジケーター”);
return(INIT_SUCCEEDED);
}
- OnInit() は最初に1回だけ実行される初期化処理
- バッファ・スタイル・パラメータの設定を行う
- 成功時は INIT_SUCCEEDED を返す
OnInit() で準備を整え、次で紹介するOnCalculate() で計算処理を実行します。
コード | 意味 |
---|---|
SetIndexBuffer(0, SignalBuffer); | インジケーターのバッファを SignalBuffer に設定し、描画データを格納するための配列を指定する。 |
SetIndexStyle(0, DRAW_ARROW); | インジケーターの描画スタイルを矢印(DRAW_ARROW)に設定する。 |
SetIndexArrow(0, 233); | 矢印のシンボルを 233 に設定する。(MT4の指定された矢印シンボルを使用) |
IndicatorShortName(“陽線サインインジケーター”); | インジケーターの名前を「陽線サインインジケーター」に設定し、チャート上で表示される名称を決める。 |
return(INIT_SUCCEEDED); | 初期化処理が成功したことを示し、インジケーターのセットアップが完了したことを返す。 |
SetIndexBuffer(0, SignalBuffer);はSignalBuffer[];をバッファとして登録し、値がリアルタイムで反映されるようにする役割を持ちます。
SetIndexBuffer(0, SignalBuffer); を実行すると、SignalBuffer[] はMetaTraderに登録されてバッファになります。バッファになったSignalBuffer[] に値を入れると、チャートにサインが表示される仕組みです。
SetIndexStyle(0, DRAW_ARROW);で矢印を設定していますが、矢印以外にも折れ線や、ヒストグラムなども表示する事が出来ます。
スタイル | 説明 |
---|---|
DRAW_LINE | 折れ線 を描画する(デフォルト)。移動平均線などに使用。 |
DRAW_HISTOGRAM | ヒストグラム(棒グラフ)を描画する。MACDやボリューム系のインジケーターで使用。 |
DRAW_ARROW | 矢印 を描画する。サイン系のインジケーター(売買シグナル)に使用。 |
DRAW_NONE | 描画なし。バッファを計算には使用するが、チャートには表示しない。 |
DRAW_SECTION | 線分 を描画する。線を分割して表示するインジケーターで使用。 |
DRAW_ZIGZAG | ジグザグライン を描画する。ジグザグインジケーターのような波形を描くのに使用。 |
DRAW_BARS | 棒グラフ(バー) を描画する。バーチャートのように表示。 |
DRAW_CANDLES | ローソク足 を描画する。カスタムのローソク足インジケーターなどに使用。 |
DRAW_COLOR_LINE | 色付きライン を描画する。ラインの色を動的に変更できる。 |
DRAW_COLOR_HISTOGRAM | 色付きヒストグラム を描画する。棒グラフの色を条件に応じて変更可能。 |
SetIndexArrowは様々なサインを設定する事が出来ます。
シンボルコード | 表示されるシンボル | 説明 |
---|---|---|
233 | ▲(上向き三角) | 買いサイン によく使われる。 |
234 | ▼(下向き三角) | 売りサイン によく使われる。 |
159 | ↑(上向き矢印) | 買いシグナルとして利用。 |
158 | ↓(下向き矢印) | 売りシグナルとして利用。 |
217 | □(小さい四角) | 汎用的に使われるシンボル。 |
216 | ■(大きい四角) | 重要なポイントを示すのに使用。 |
221 | ◇(ひし形) | 価格の転換点などのマークに使われる。 |
222 | ◆(塗りつぶしのひし形) | 強いシグナルの表示に使われる。 |
225 | ○(丸) | ニュートラルなサインやエントリーポイントの表示に利用。 |
226 | ●(塗りつぶしの丸) | 目立つマークとして使われる。 |
242 | ☀(太陽) | 特別なマークとして利用。 |
251 | ☝(上向き指) | 買いサインをわかりやすくするために使用。 |
252 | ☟(下向き指) | 売りサインをわかりやすくするために使用。 |
IndicatorShortNameはインジケーターを表示した際に、表示される名前になります。
メインループを詳しく解説
メインループは簡略すると以下の様になります。
ここで処理
}
まず覚えて欲しいのがOnCalculate()の関数になります。
- インジケーターのメイン処理を行う関数
- チャートの価格データ(ローソク足)を受け取り、計算・描画する
- 新しいローソク足ができるたびに自動で実行される
OnCalculate() は新しいローソク足ができるたびに自動で処理される関数です。MT4側が勝手に処理してくれるので深く考える必要はありません。
OnCalculate()の中には引数が入っています。
順番 | 変数名 | 型 | 意味 |
---|---|---|---|
① | rates_total | const int | ローソク足の総数(チャートにあるバーの数) |
② | prev_calculated | const int | 前回計算したローソク足の数(再計算の最適化に使用) |
③ | time[] | const datetime & | 各ローソク足の時間(タイムスタンプ) |
④ | open[] | const double & | 各ローソク足の始値 |
⑤ | high[] | const double & | 各ローソク足の高値 |
⑥ | low[] | const double & | 各ローソク足の安値 |
⑦ | close[] | const double & | 各ローソク足の終値 |
⑧ | tick_volume[] | const long & | 各ローソク足のティック出来高(FXではこれを使用) |
⑨ | volume[] | const long & | 実際の出来高(FXでは通常未使用) |
⑩ | spread | const int & | 各ローソク足のスプレッド(Bid-Askの差) |
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[])
{
OnCalculate() は自動で処理を実行します。新しいローソク足が追加されると、high[](高値)、low[](安値) などの配列に自動でデータが格納されます。
high[]やlow[] などは分かりやすいのですが、「rates_total」と「prev_calculated」は少し分かりにくいのでしっかりと理解しましょう。
prev_calculated(前回の OnCalculate() 実行時に計算済みのローソク足の数)
少し分かりにくいのですがprev_calculated を使うことで、前回の続きから計算できると覚えておきましょう。
// 前回計算された位置からスタート
int start = prev_calculated > 0 ? prev_calculated – 1 : 0;
for (int i = start; i < rates_total; i++)
{
// 陽線かどうかのチェック (終値 > 始値)
if (close[i] > open[i])
{
SignalBuffer[i] = low[i] – 10 * Point; // 矢印をロウソク足の下に表示
}
else
{
SignalBuffer[i] = EMPTY_VALUE; // サインを非表示
}
}
return(rates_total);
}
まず前提として、OnCalculate() の引数には、MetaTrader が自動で値をセットします。ツールの起動時や新しいローソク足が追加された際はOnCalculate()に値が入り、OnCalculate()の処理が開始します。
int start = prev_calculated > 0 ? prev_calculated – 1 : 0;
この式の書き方は簡略がされたもので、細かく書くと以下の様になります。
int start;
if (prev_calculated > 0) {
start = prev_calculated – 1;
} else {
start = 0;
}
それ以外はstartに0を与えます。
前回の計算で処理されなかったローソク足がある可能性があるため、prev_calculated – 1 で直前のローソク足から再計算します。
OnCalculate() は自動で引数が格納されるのですが、初回に限って言えばprev_calculated(前回計算したローソク足の数)の値が分かりません。※前回が無いので
値が無い初回は自動的に「0」が配置されるので、初回のstartには0が代入されます。
この式を細かく書くと以下の様になります。
while (i < rates_total) { // ★条件を満たす間ループ
// ここに処理を書く
i++;// インデックスを1つ進める
}
この式は、条件を満たすまで処理を繰り返すという意味になります。
初回は「Start=0」ですので、rates_total(ローソク足の総数)になるまで、処理を繰り返しマス。
また、2回目以降はStartに前回のローソク足の一つ前のデータが入るので、前回一つ前のローソク足から処理を行います。
{
SignalBuffer[i] = low[i] – 10 * Point; // ✅ 矢印の位置をローソク足の下に設定
}
else
{
SignalBuffer[i] = EMPTY_VALUE; // ❌ サインを非表示
}
close[]とopen[]はOnCalculate() の引数で自動的に格納されています。ローソク足の終値がローソク足の始値より大きいとが陽線となります。
ここでまず覚えて欲しいのが、SignalBuffer[]です。
MQL4はSignalBuffer[]は値を入れた際に、自動的にサインを表示させます。
※SetIndexBuffer(0, SignalBuffer); でSignalBuffer[]をバッファとして登録しています。バッファはMetaTraderが自動管理しており、バッファ内に値が入るとサインが表示されます。
この場合ローソク足の安値より- 10 * Pointの位置(0.01)にサインと表示させます。
USD/JPYの場合、Point = 0.01、10 * Point = 0.10
EUR/USDの場合、Point = 0.00001、10 * Point = 0.0001
※サインの種類や色などはOnCalculate()の初期設定の値が反映されます。
MQL4の学習方法について
学習方法について
MQL4やMQL5はメジャーなプログラミング言語ではないため、基本的に独学で学ぶことになります。もし身近にMQL4を理解している人がいれば、その人に教えてもらうのが理想ですが、そう都合よくはいかないのが現実です。
そこで、個人でMQL4を学ぶ為の手順をまとめています。
プログラム初心者の方はいきなりMQL4を学ぼうとしてもチンプンカンプンになると思います。実際に「変数」・「関数」・「データ型」・「if, for, while, switch 」などの基礎知識は避けては通れません。
プログラムの基礎を学ぶなら「C++」がおすすめになります。
C++はMQL4に近いプログラム言語になります。
- 構文が C++ とほぼ同じ
- データ型(int, double, bool など)が C++ と同じ
- ポインタは使えないが、配列や参照渡し (&) は使える
- if, for, while, switch などの制御構文も C++ と同じ
- C++ に比べて低レベルの操作(メモリ管理など)は不要
C++であれば「C++ 基礎」と検索すればいくらでも学べるサイトが見つかります。
MQL4の学習はチャットGPTを使う事で効率が上がります。プログラムの基礎は必要になりますが、チャットGPTを使う事で分からない事はほとんど解決します。
今回陽線のみにサインを表示させたのですが、「陽線でopenとcloseの差が0.5円以上」ある時だけ表示したい場合、以下の様に質問します。
以下のコードを覚えて
まずは今回のコードをチャットGPTに覚えさせます。
先ほどのコードをベースに「陽線でopenとcloseの差が0.5円以上」の時だけサインを出してと質問する
するとコードを出してくれます。
実際に起動させてみると陽線でopenとcloseの差が0.5円以上の時のみサインが出ていました。あとは変更された部分を再学習していくだけです。
サインツールを作るとき、最初はどんなものにするか迷うことが多いものです。一人で悩むよりも、先人の知恵を参考にするのは良い方法だと思います。
そこでおすすめしたいのがMT4インジケーター倉庫になります。
ここでは様々なサインツールが配布されており、コードの確認はもちろん、二次配布も可能になっています。
MT4インジケーター倉庫のコードをそのまま使う事もでき、学習もできるのでかなりおすすめとなります。
MT4インジケーター倉庫のコードを見て分からない事があればチャットGPTに質問すれ答えてくれます。
サインツールのコードを全てコピーしてチャットGPTに貼り付けて「このコードを覚えて」と伝えます。その後コードのなかで分からない文言があれば「○○の意味を教えて」と質問するだけで事細かく教えてくれます。