初めてのインジケータ作成② インジケータの作成手順

この記事では、インジケーターをはじめて作る人へインジケータを作る全体的な手順を説明します。

イメージしやすいように簡単なインジケータ作成を通じて説明していきます。実際にご自身で作りながらながら読んで頂くと理解しやすいと思います。

なお、インジケーターの作成にはメタエディターというソフトを使います。メタエディターはMT4のインストール時にPCにインストールされています。

まだメタエディターを使ったことがないという人は、前回の記事からお読みください。

今回作成するインジケータ

今回作るインジケータの機能は、下図のように「ターミナルに現在のBid価格を表示する」というごく単純なものです。

インジケータをチャートに適用

このインジケーターには実用性は全くありません(汗)。

簡単なインジケーターを実際に作ることで、全体の流れを理解してしまおうというのが今回の趣旨なのです。

手順1. インジケータのテンプレートを作成

では作成手順に入ります。まずは以下の手順でインジケータのテンプレートを新規作成します

MQLウィザードを開く

MetaEditorのツールバーにある「新規作成」をクリックし、MQLウィザードを開きます。

MQLウィザード(新規作成)

作成するプログラムの種類を選択

「カスタムインジケータ」にチェックを入れて「次へ」

MQLウィザード(カスタムインジケータ)

一般プロパティを入力

名前、著作者、リンクを入力して「次へ」

  • 名前:インジケータ名(ファイル名)
  • 著作者:インジケータの著作者の名前
  • リンク:ウェブサイトを持っている人はURL

MQLウィザード(一般プロパティ)

補足

「パラメータ」は必要に応じてプログラム内に直接記述すれば良いので、ここで指定する必要はありません。

イベントハンドラ

そのまま何も入力せずに「次へ」

MQLウィザード(イベントハンドラ)

補足

補足:[OnTimer]や[OnChartEvent]は必要に応じてプログラム内に直接記述すれば良いので、ここでチェックする必要はありません。

描画プロパティ

そのまま何も入力せずに「完了」

MQLウィザード(描画プロパティ)

補足

補足:色などの描画プロパティは、必要に応じてプログラム内に直接記述すれば良いので、ここで指定する必要はありません。

テンプレート完成

ここまでで指定した内容でインジケータのテンプレートが作成されます。

MQLウィザード(テンプレート)

これでインジケーターのテンプレート作成は完了です。

手順2. テンプレートの内容を確認

出来上がったテンプレートの内容を説明します。

テンプレートの構造

テンプレートは大きく分けて3つのエリアに分かれています。

①のエリア
インジケータ全体に関する値を記述するエリアです。作者などの情報の他、グローバル変数、ユーザーの入力パラメータなど、このインジケータ全体で使う値を記述します。
②のエリア
初期化処理(OnInit)を記述するエリアです。インジケータをチャートに適用した直後にここの記述内容が一度だけ実行されます。最初に1回だけ実行したい処理(例えば使用する変数に初期値を代入するなど)をここに記入します。
③のエリア
ティック受信時の処理(OnCalculate)を記述するエリアです。ここの内容はMT4がティックを受信するたびに実行されます。通常はここにインジケーターのメインとなる機能を記述します。

手順3. コードを書く

いよいよインジケータの機能をプログラムに書いていきます。といっても今回は単純な処理なのでたった1行のコードを追記するだけです。

先ほど作成したテンプレートの③のエリアに下記のコードを追記します。

Print(Bid);  //Bid価格をターミナルに表示する

このコードの内容は「Bid価格(売値)をMT4のターミナルに表示する」というものです。使っているPrint()は、()の中の変数や文字列をMT4のターミナルに表示する関数です。

またセミコロン;は、コード一文の終わりを意味します。「ここまでが一つの命令ですよ」と宣言する意味があります。文章の「。」みたいなものですね。このセミコロン;を書き忘れるとプログラムがエラーになりますので忘れないように記述しましょう。

その後にある//はコメントを意味し、//以降のその行の記述はプログラムの処理からは無視されます。処理内容のメモなどを書いておくと後でプログラムを見たときに分かりやすくなります。

なお、プログラム中のスペースは基本的に無視されます。コードの先頭をそろえるなど、適当にスペースを挿入するとプログラムが見やすくなります。

コード追記後の③エリアは下記のようになります。

コード追記後

この③エリアは、MT4がティックを受信するたびに実行されるので、MT4のターミナルに最新のBid価格が次々と表示されるというわけです。

これでコードの記述は終わりです。たった1行コードを書き加えるだけなので簡単でしたね。

手順4. コンパイルする

コードを書き終えたらコンパイルします。コンパイルとは、MQL言語で書かれたプログラムを、コンピュータが実行できるデータ形式に変換することを指します。

コンパイル

ツールバーの「コンパイル」をクリック

コンパイル

コンパイル完了

メタエディター下部のツールボックスに、0 error(s), 0 warning(s)と0と表示されれば無事コンパイル完了です。エラーがあった場合はコードを修正して再度コンパイルしてください。

エラーメッセージ

補足:errorとwarningについて

  • エラー(error)は、致命的な誤り箇所を意味します。errorが表示された場合は、コンパイルできていません。コードを修正してから再度コンパイルしてください。
  • 警告(waring)は、修正が望まれる箇所を意味します。プログラム中にあいまいな記述がある場合などです。warningが出てもコンパイルはできていますが、意図通りにプログラムが動作しない可能性があります。

※基本的にはerrorもwarningも全て解消されるまでコードを修正しましょう。

エラーが出なければコンパイルは一瞬で完了します。

補足:ファイルの場所

インジケーターのプログラムファイルは、メニューバー「ファイル」→「データフォルダを開く」→「MQL4」フォルダ→「Indicators」フォルダの中に保存されます。

プログラムファイルの保存場所

拡張子.mq4がコンパイル前のファイルで、拡張子.ex4がコンパイル後のファイルです。


長いプログラムになるとコンパイル時にエラーがどっさり出てくるようになります。でも本当につらいのは、エラーがないのにインジが思った通りに動いてくれない時です。そんな時は、原因を特定するのに結構苦労します。デバッグのコツはいつか記事にまとめたいと思います。

手順5. MT4のチャートに適用

では作成したインジケータを実際にチャートに適用してみましょう。

コンパイルが完了していれば、MT4のナビゲーターに作成したインジケータ名が表示されているはずですので、それをチャートに適用します。

インジケータをチャートに適用

ターミナルの「エキスパート」タブを見てみてください。最新のBid価格が次々と表示されれば、インジケーターは正常に動作しています。

※土日などで市場が閉まっているときはティックが更新されないので1回しかBid価格は表示されません


ちゃんと動いたでしょうか?ちゃんと動いたならコングラチュレーション!です。もしかしたらこれがあなたが作った最初のインジケーターかもしれませんね。

まとめ

今回は実際にインジケーターを作りながら、インジケーター作成の全体的な手順を説明しました。手順を整理すると以下のとおりです。

  1. インジケータのテンプレートを作成する
  2. コードを記述する
  3. コンパイルする(エラーがあれば修正)
  4. チャートに適用して動作確認

複雑なインジケーターであっても、コードを書く量やエラーの修正箇所が増えるだけで、根本的な流れは同じです。あとは数をこなしてMQLのコマンドを覚えたりコードの書き方に慣れたりしていけばOKです。

「インジケーターのプログラミングって思ったよりも大したことないな。」と思えばいいんです。それが上達のポイントだと思いますよ。

さて、次の記事↓では、少しだけレベルアップしてチャートにラインを描画するインジケータの作り方を説明します。

コメント

この記事へのコメント(6 件)

  • yuzuponさんより

    説明がわかりやすい
    簡単なインジを自分でも作ってみたいと思って本ももってますが
    EAの本だったので 挫折してました

  • 管理人ですさんより

    yuzuponさんへ
    コメントありがとうございます。私自身が最初にインジケーターを作った時にどこでつまづいたかな?ということを思い出しながら書きました。わかりやすいと言っていただけると嬉しいです。
    この「はじめての・・」シリーズは全20回ぐらいの構想なのですが、4回で止まってしまってます、、、。いつか更新するのでよかったらまたお越しください。
    ちなみにインジもEAもプログラムの書き方は8割くらいは同じですので、yuzuponさんがお持ちの本もいずれ役に立つときが来ると思いますよ。

  • whiteさんより

    はじめまして。
    挑戦してみましたところ、

    {
    //---
    print(bid); //bidの価格をターミナルに表示する
    //--- return value of prev_calculated for next call
    return(rates_total);
    }

    と、打ってみましたがbidのところの()と34行の{ と、39行の} の2つがエラーになりました。
    bidをBidに変えたら()のエラーがなくなりましたがそういうものなのでしょうか、
    頭が大文字でなくてはならないという事でしょうか?

    あともう一つのエラーの原因がわかりません。
    ご教授よろしくお願いします。

  • 管理人ですさんより

    whiteさんへ
    コメントいただいたものをコピーしてコンパイルすると下記の2件エラーが出ますね。
    1:'bid' - undeclared identifer
    2:'print' - function not defined

    エラーについて説明する前に、覚えておくと良いことが2つあります。
    まず一つは、MQLは大文字と小文字を別物として区別するということです。ですので大文字と小文字を正確に書かないとプログラムがエラーになります。
    もう一つは予約語と呼ばれるものです。予約語とは用途が最初から固定されている変数のようなものです。そして大文字の「Bid」はMQLの予約語の一つで、最新のビッド価格が自動で格納されます。MQLには他にも、アスク価格を自動で格納する「Ask」のような予約語などがあります。予約語は一般的なプログラム用語ですのでネット検索すると詳しく分かると思います。

    では、エラーについてです。
    一つ目のエラーは予約語である大文字の「Bid」と記載すべきところを、小文字で「bid」と書いたため「undeclared identifer」というエラーが出たものです。「聞いたことのない語句です」といったニュアンスですね。対処法はwhiteさんが行ったとおり大文字のBidと書けばOKです。
    二つ目のエラーは「Print」と大文字で書くべきところを「print」と小文字で書いたため「function not defined」というエラーが出ています。「そのような関数は登録されていません」という意味です。関数名も大文字と小文字を区別していますので、正しく記載しないとエラーになります。対処法は「Print」と大文字で書けばOKです。

    >34行の{ と、39行の}  の2つがエラー
    という件については、私が試したところエラーが出ませんでした。「Print」の大文字小文字違いでエラーが出ていたのかな?エラーメッセージを書いていただけると原因が分かるかもしれません。

  • whiteさんより

    こんにちは。
    詳しい解説ありがとうございます。

    なるほど、決まりごとがあるのですね。
    printもそう言われてみると小文字ですね。気づきませんでした。
    {}については{}に色がついたのでこれがエラーなんだと勘違いしました。エラーメッセージの見方が解りませんでしたが今は理解できました。

    MQLの勉強を始めまして2日目ですが、頑張りたいと思います。
    ご返信ありがとうございました。

  • 管理人ですさんより

    whiteさんへ
    お役に立てたならなによりです。MQLのプログラムはトレードとはまた別の楽しさがありますよ。私はトレードもMQLも楽しみながらやっています。