【簡単】FXやバイナリーで使えるサインツールの作り方!MT4(MQL4)で実装

サインツールの作り方 サインツール

FXやバイナリーオプションで使えるサインツールの作り方を初心者向けに解説!陽線にサインを出すコードの実装・カスタムインジケーターの設定・MQL4の学習方法まで詳しく紹介。サインツールを自作して、取引の精度を向上させましょう!

このページで分かる事
項目 内容
サインツールの作成手順 MT4のメタエディターで学習用コードの記述・コンパイル・保存までを画像付きで解説
コードの実装 陽線のみにサインを表示するプログラムを記述し、MT4に組み込み動作を確認する
コードの解説 初期設定・メイン処理 (OnCalculate関数)・計算処理の仕組みを詳しく解説
MQL4の学習方法 C++を学ぶと理解が早まる。ChatGPTで質問したり、無料のサインツール配布サイトのコードを参考にする。

サインツールの作り方

まずは、MT4を起動します。

MT4のメニュー画面

上部のメニューバーより「ツール」⇒「メタエディター」を選択します。

メタエディターの起動

MetaEditor(メタエディター)が起動します。

メタエディターより新規ファイルの選択

メタエディターのメニューより「ファイル」⇒「新しいファイル」を選択します。

カスタムインディケータ

「MQLウィザード:ファイル」のポップアップが表示されるので、「カスタムインディケータ)」を選択し、次へボタンをクリックします。

カスタムインディケータの保存先

次にインジケーターの保存先を決めます。

デフォルトの状態では「Indicators\」のみ表示されています。

※Indicators\はカスタムインジケーターの保存先になるので消さないで下さい。

今回はyajirushiと言うファイル名で保存するので「Indicators\yajirushi」と記入します。名前を追加後に「次へ」ボタンをクリックします。

MQLウィザードの次へボタン

次に表示されるポップアップはデフォルトのまま「次へ」ボタンをクリックします。

MQLウィザードの完了ボタン

次に表示されるポップアップはデフォルトのまま「完了」ボタンをクリックします。

MQLメインテンプレート

デフォルトのテンプレートが表示されます。

陽線のみにサインを出してみよう

サインツールを出す初級編として、陽線のみにサインを出すコードを紹介します。陽線にはローソク足の始値や終値の測定など、覚えておいた方が良い項目が多く含まれていますのでおすすめです。

コードを貼り付けてみよう

まずは以下のコードをコピーしてメタエディターに張り付けてみましょう。


//+------------------------------------------------------------------+
//| カスタムインジケーターの初期設定                                |
//+------------------------------------------------------------------+
#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内のインディケーター

MT4のナビゲーター内にある「Examples」の中に「yajirushiファイル」が追加されている事を確認します。

次に「yajirushi」をダブルクリックします。

yajirushiファイルの起動

ポップアップが表示されるので「OK」ボタンをクリックします。

サインの確認

陽線のみにサインが表示される事を確認します。

インディケーターの保存先

今回作成した「yajirushiファイル」の保存先を詳しく紹介します。

※yajirushiファイルを「Indicators\yajirushi」で保存した場合

MT4のデータフォルダーを開く

yajirushiファイルはMT4の中に保存されています。

確認の為に、MT4の上部メニューより「データフォルダーを開く」を選択します。

MQL4フォルダーを開く

表示されるポップアップより「MQL4」を選択します。

インジケーターファイル

次に「Indicators」を選択します。

インジケーターの保存先

Indicatorsの中にyajirusiファイルがある事を確認します。

サインツールのコードを詳しく解説

サインツールのコードを
詳しく解説
解説項目
  • カスタムインジケーターの初期設定を詳しく解説
  • インジケーターの初期化を詳しく解説
  • メインループを詳しく解説

カスタムインジケーターの初期設定を詳しく解説

#property は、MQL4のスクリプトでインジケーターの動作や見た目を設定する命令です。例えば、インジケーターをメインチャートに表示するか、色を何にするか などを決めることができます。

カスタムインジケーターの初期設定
#property copyright “あなたの名前”
#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[]; サインを表示するためのデータを格納する配列

著作者情報・ウェブサイトのリンク・バージョンは必要に応じて記入しましょう。

ここで理解しておきたいのはバッファになります。バッファは後々重要になるので必ず理解しておきましょう。

バッファとは(SignalBuffer[];)
バッファとは、データを一時的に保存する箱のようなものです。

例えば、陽線にサインを表示させるために、「サインの位置」を保存する箱が必要です。

バッファに値を入れることで、チャートにサイン(矢印)を表示できるようになります!

インジケーターの初期化を詳しく解説

OnInit()で初期化(初期設定)を行う
int OnInit()
{
// バッファをセット
SetIndexBuffer(0, SignalBuffer);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 233); // 矢印のシンボル
IndicatorShortName(“陽線サインインジケーター”);
return(INIT_SUCCEEDED);
}
OnInit()とは
  • 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);について

SetIndexBuffer(0, SignalBuffer);はSignalBuffer[];をバッファとして登録し、値がリアルタイムで反映されるようにする役割を持ちます。

SetIndexBuffer(0, SignalBuffer); を実行すると、SignalBuffer[] はMetaTraderに登録されてバッファになります。バッファになったSignalBuffer[] に値を入れると、チャートにサインが表示される仕組みです。

SetIndexStyleについて

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について

SetIndexArrowは様々なサインを設定する事が出来ます。

注意
SetIndexArrow(0, 233);(▲(上向き三角))で矢印を設定しても↑サインが出る場合は Wingdingsのフォントに依存している為、置き換えられたか、233がサポートしていないので代替えとして159の↑サインが自動適用されています。
シンボルコード 表示されるシンボル 説明
233 ▲(上向き三角) 買いサイン によく使われる。
234 ▼(下向き三角) 売りサイン によく使われる。
159 ↑(上向き矢印) 買いシグナルとして利用。
158 ↓(下向き矢印) 売りシグナルとして利用。
217 □(小さい四角) 汎用的に使われるシンボル。
216 ■(大きい四角) 重要なポイントを示すのに使用。
221 ◇(ひし形) 価格の転換点などのマークに使われる。
222 ◆(塗りつぶしのひし形) 強いシグナルの表示に使われる。
225 ○(丸) ニュートラルなサインやエントリーポイントの表示に利用。
226 ●(塗りつぶしの丸) 目立つマークとして使われる。
242 ☀(太陽) 特別なマークとして利用。
251 ☝(上向き指) 買いサインをわかりやすくするために使用。
252 ☟(下向き指) 売りサインをわかりやすくするために使用。
IndicatorShortNameについて

IndicatorShortNameについて

IndicatorShortNameはインジケーターを表示した際に、表示される名前になります。

メインループを詳しく解説

メインループは簡略すると以下の様になります。

OnCalculate()を簡略化
OnCalculate(){

ここで処理

}

まず覚えて欲しいのがOnCalculate()の関数になります。

OnCalculate() とは?
  • インジケーターのメイン処理を行う関数
  • チャートの価格データ(ローソク足)を受け取り、計算・描画する
  • 新しいローソク足ができるたびに自動で実行される

OnCalculate() は新しいローソク足ができるたびに自動で処理される関数です。MT4側が勝手に処理してくれるので深く考える必要はありません。

OnCalculate()の引数

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()の中身は引数の順番で処理していますので、上記の順番が重要になります。順番や変数名などはそのまま利用す事を推奨します。

OnCalculate() は自動で処理を実行します。新しいローソク足が追加されると、high[](高値)、low[](安値) などの配列に自動でデータが格納されます。

high[]やlow[] などは分かりやすいのですが、「rates_total」と「prev_calculated」は少し分かりにくいのでしっかりと理解しましょう。

rates_total
rates_total は変数ですが、OnCalculate() の引数の順番によってローソク足の総数が自動的に格納されます。※引数の1番目はローソク足の総数
prev_calculated
prev_calculatedは変数ですが、OnCalculate() の引数の順番によって「前回計算したローソク足の数」が自動的に格納されます。※引数の2番目は前回計算したローソク足の数
rates_totalとprev_calculatedの違い
rates_total(チャートにある「すべてのローソク足の数」)

prev_calculated(前回の OnCalculate() 実行時に計算済みのローソク足の数)

少し分かりにくいのですがprev_calculated を使うことで、前回の続きから計算できると覚えておきましょう。

OnCalculate()の計算について
OnCalculate()の計算
{
// 前回計算された位置からスタート
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 = prev_calculated > 0 ? prev_calculated – 1 : 0;

この式の書き方は簡略がされたもので、細かく書くと以下の様になります。

int start;
if (prev_calculated > 0) {
start = prev_calculated – 1;
} else {
start = 0;
}

式の意味
prev_calculated が 1 以上(0より上)なら、start に前回計算したローソク足の最後の位置(prev_calculated – 1)を設定する。

それ以外はstartに0を与えます。

-1を使う理由
前回のローソク足の一つ前から処理する事が重要になります。前回の処理で確認した最後のローソク足は処理中の可能性があります。

前回の計算で処理されなかったローソク足がある可能性があるため、prev_calculated – 1 で直前のローソク足から再計算します。

初回の動きについて

OnCalculate() は自動で引数が格納されるのですが、初回に限って言えばprev_calculated(前回計算したローソク足の数)の値が分かりません。※前回が無いので

値が無い初回は自動的に「0」が配置されるので、初回のstartには0が代入されます。

for (int i = start; i < rates_total; i++)について

この式を細かく書くと以下の様になります。

式を細かく書くと
int i = start;// 初期値をセット

while (i < rates_total) { // ★条件を満たす間ループ

// ここに処理を書く

i++;// インデックスを1つ進める

}

この式は、条件を満たすまで処理を繰り返すという意味になります。

初回は「Start=0」ですので、rates_total(ローソク足の総数)になるまで、処理を繰り返しマス。

また、2回目以降はStartに前回のローソク足の一つ前のデータが入るので、前回一つ前のローソク足から処理を行います。

if分での処理について
if文の中身
if (close[i] > open[i])
{
SignalBuffer[i] = low[i] – 10 * Point; // ✅ 矢印の位置をローソク足の下に設定
}
else
{
SignalBuffer[i] = EMPTY_VALUE; // ❌ サインを非表示
}

close[]とopen[]はOnCalculate() の引数で自動的に格納されています。ローソク足の終値がローソク足の始値より大きいとが陽線となります。

サインを表示させる
SignalBuffer[i] = low[i] – 10 * Point; // ✅ 矢印の位置をローソク足の下に設定

ここでまず覚えて欲しいのが、SignalBuffer[]です。

MQL4はSignalBuffer[]は値を入れた際に、自動的にサインを表示させます。

※SetIndexBuffer(0, SignalBuffer); でSignalBuffer[]をバッファとして登録しています。バッファはMetaTraderが自動管理しており、バッファ内に値が入るとサインが表示されます。

この場合ローソク足の安値より- 10 * Pointの位置(0.01)にサインと表示させます。

pointとは
MetaTrader における最小の価格変動単位(1ポイント)
USD/JPYの場合、Point = 0.01、10 * Point = 0.10
EUR/USDの場合、Point = 0.00001、10 * Point = 0.0001

※サインの種類や色などはOnCalculate()の初期設定の値が反映されます。

return rates_total;
OnCalculate() 実行時に prev_calculated に渡される値となる。これにより、2回目以降は前回のローソク足の直前から再計算できる。

MQL4の学習方法について

MQL4の
学習方法について

MQL4やMQL5はメジャーなプログラミング言語ではないため、基本的に独学で学ぶことになります。もし身近にMQL4を理解している人がいれば、その人に教えてもらうのが理想ですが、そう都合よくはいかないのが現実です。

そこで、個人でMQL4を学ぶ為の手順をまとめています。

C++を学習する

プログラム初心者の方はいきなりMQL4を学ぼうとしてもチンプンカンプンになると思います。実際に「変数」・「関数」・「データ型」・「if, for, while, switch 」などの基礎知識は避けては通れません。

プログラムの基礎を学ぶなら「C++」がおすすめになります。

C++はMQL4に近いプログラム言語になります。

MQL4がC++ に近い理由
  • 構文が C++ とほぼ同じ
  • データ型(int, double, bool など)が C++ と同じ
  • ポインタは使えないが、配列や参照渡し (&) は使える
  • if, for, while, switch などの制御構文も C++ と同じ
  • C++ に比べて低レベルの操作(メモリ管理など)は不要

C++であれば「C++ 基礎」と検索すればいくらでも学べるサイトが見つかります。

チャットGPTをフル活用する

MQL4の学習はチャットGPTを使う事で効率が上がります。プログラムの基礎は必要になりますが、チャットGPTを使う事で分からない事はほとんど解決します。

今回陽線のみにサインを表示させたのですが、「陽線でopenとcloseの差が0.5円以上」ある時だけ表示したい場合、以下の様に質問します。

質問①

チャットGPTに質問①

以下のコードを覚えて

まずは今回のコードをチャットGPTに覚えさせます。

質問②

先ほどのコードをベースに「陽線でopenとcloseの差が0.5円以上」の時だけサインを出してと質問する

チャットGPTの質問②

するとコードを出してくれます。

変更後のサイン

実際に起動させてみると陽線でopenとcloseの差が0.5円以上の時のみサインが出ていました。あとは変更された部分を再学習していくだけです。

無料のサインツール配布サイトのコードを見て学習する

サインツールを作るとき、最初はどんなものにするか迷うことが多いものです。一人で悩むよりも、先人の知恵を参考にするのは良い方法だと思います。

インジケーター倉庫

そこでおすすめしたいのがMT4インジケーター倉庫になります。

ここでは様々なサインツールが配布されており、コードの確認はもちろん、二次配布も可能になっています。

MT4インジケーター倉庫のコードをそのまま使う事もでき、学習もできるのでかなりおすすめとなります。

MT4インジケーター倉庫のコードを見て分からない事があればチャットGPTに質問すれ答えてくれます。

サインツールのコードを全てコピーしてチャットGPTに貼り付けて「このコードを覚えて」と伝えます。その後コードのなかで分からない文言があれば「○○の意味を教えて」と質問するだけで事細かく教えてくれます。

綾瀬 文也

10年以上のFXトレード経験を持ち、チャート分析と戦略構築を専門とするトレーダー。マーケットの変動を的確に捉え、リスク管理を徹底することで安定した収益を実現。現在はpokyun企画代表として活動

綾瀬 文也をフォローする
サインツール
綾瀬 文也をフォローする
タイトルとURLをコピーしました