• カテゴリー別アーカイブ MetaTrader4入門
  • MT4入門(4) – カスタムインディケータの作り方(2)

    MT4入門の第4回目で、前回の「カスタムインディケータの作り方」の続きです。
    「カスタムインディケータの作り方(2) – プログラミングの基礎」
    というお題です。基礎ということでちょっと堅い部分もありますが、やっぱり基礎をしっかり勉強しておかないと応用がききませんので、ここは焦らずにお付き合い下さい。
    MQL4のプログラムはC言語と同様に関数というブロックを並べることで構成されます。前回のサンプルプログラム(Sample1_Ind.mq4) 中に
    int init()
    {
    }

    とか、
    int start()
    {
    }

    のような書式が出てきましたが、このかたまりを関数と呼びます。
    関数はユーザーが自由に名前をつけて作ることができますが、MQL4では、以下の3つの関数が特別な関数として予約されています。
    init()
    start()
    deinit()

    カスタムインディケータで必ず必要なのは、init()start() です。
    start()インディケータの本体で、init()初期化のための関数です。
    deinit() は後始末が必要なときに使いますが、Sample1_Ind では不要なので使っていません。
    では、次に関数の書き方について見ていきます。
    関数の中身は基本的にはインディケータの計算なので、
    ・変数の定義
    ・計算式の記述
    ・戻り値の指定

    の順に書いていきます。
    ますは変数の定義です。
    変数を定義するときにはその変数の型を指定しなくてはいけません。
    MQL4で使える変数の型としては色々ありますが、ここでは、数を表す型として intdouble を紹介します。
    int は integer の略で整数を表します。
    double実数を表すのですが、なぜ double というのかというと、C言語で実数を表す型として単精度(float)と倍精度(double)というのがあり、その倍精度の方をそのまま使ったのだと思います。
    要するに、整数はint、プライスやインディケータの値など小数がつくものは double を使えばいいというわけです。
    実際の変数の定義の仕方は
    int i;
    double x;

    などと書くだけでもいいですが、
    int i=0;
    double x=1.05;

    のように初期値を指定することもできます。
    定義した後にすぐ具体的な値が入力される場合は定義だけでもいいですが、初期化しないと何の値が入っているかわからないので、できれば初期値を書いておいた方が確実です。
    あ、ここで言い忘れましたが、MQL4 では、定義や式の最後にセミコロン ; を書くのを忘れないようにしましょう。これもC言語と同じスタイルです。
    ただ、関数のように {} で囲んだときは最後に ; を書く必要はありません。
    慣れてもセミコロンはよく忘れることがあるので、コンパイルでエラーが出たときにはエラーの行の前でセミコロンが抜けてないかチェックしてみてください。
    コンパイルした後、エラーの行をダブルクリックするとその行に印がつきますが、下の図のように直接セミコロンが抜けているというエラーが出なくて、その次の行でエラーが出る場合もあるので注意が必要です。

    次に変数の中でも配列変数について説明します。
    配列変数は変数をいくつか並べたものですが、それぞれの変数に対して同じ計算をさせたり、変数をまとめて別の関数に渡したりするときに使います。
    関数の中で配列変数を宣言する場合、通常確保する配列のサイズを指定します。例えば、
    double x[10];
    と書くと、10個の実数の変数を確保したことになります。
    但し、実際に使える変数は、x[0] から x[9] までの10個となります。x[10] は使えないので注意してください。
    では、ここまで説明したところでサンプルの Sample1_Ind.mq4 に戻ってみます。
    start() の関数の中で Buf0[i] というように配列を使っていますが、よく見ると、start() の中で Buf0 の定義を行っていません。通常定義しない変数は使えないので、コンパイルでエラーが出るはずですが、この場合エラーは出ません。
    どうしてかというと、関数の外側の #property 命令の後に
    double Buf0[];
    という形で定義しているからです。
    なぜ、こんなところで定義するのかいうと、関数の中と外ではちょっと意味が違うのです。
    関数の内部で定義されている変数はその関数の中だけで有効です。言い換えると、同じ名前の変数を別の関数の中で使ってもお互い影響を受けないということです。これは変数の有効な範囲を関数内に限定することで、プログラムの間違いを少なくするためです。
    それに対して関数の外部で宣言した変数はそれぞれの関数の中も含めてプログラム全体で有効になります。
    サンプルプログラムでは、Buf0 の配列にインディケータの値を計算させて入れるのですが、このようにチャートに表示させる値はプログラム全体で使う必要があるので、外部で宣言するのです。
    あと、もう一つ注意する点は、宣言時に Buf0[] のように配列のサイズを指定していない点です。
    これはちょっと特殊な指定の仕方ですが、チャート上では、過去に何個のデータがあるかわからないし、時間が経てば次々に増えていくので、予め配列のサイズが決められないのです。
    MQL4では、外部で宣言したサイズなしの配列の最初の値、つまり、Buf0[0] は常に一番最新のバーでの値になります。そして、Bu0f[1]は1つ前のバー、Buf0[2]は二つ前のバーでの値ということになります。新しいバーが出ると、同じようなルールで配列の値がすべて置き換わります。
    チャート上の始値、安値、高値、終値も同様のルールで、予約された配列変数に格納されます。つまり、最新のバーの始値、安値、高値、終値がそれぞれ、Open[0], Low[0], High[0], Close[0] という配列に入っていて、一つ前のバーは、Open[1], Low[1], High[1], Close[1]、二つ前のバーはOpen[2], Low[2], High[2], Close[2]となります。
    Bars.png
    このようにチャート上のバーの位置と配列の対応がわかったところでサンプルプログラムを見てみます。
    for(i=limit-1; i>=0; i–)
    {
    Buf0[i] = (Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;
    }

    の部分は繰り返し計算を表します。
    変数 ilimit-1 から 1ずつ減らして i>=0 の範囲で {} の中身を繰り返すというものです。i– というのは i=i-1 という意味です。
    これは言い換えると i=0 から limit-1 まで1ずつ増やして繰り返すのと同じことなので、
    for(i=0; i < limit; i++)
    と書くこともできます。同じく i++i=i+1 の意味です。要するに for の後に、(変数の初期値;繰り返す範囲;変数の増やし方)を指定して繰り返しの制御を行っているのです。
    この書き方で説明すると、この繰り返しは
    Buf0[0] = (Close[0]+Close[1]+Close[2]+Close[3])/4;
    Buf0[1] = (Close[1]+Close[2]+Close[3]+Close[4])/4;
    Buf0[2] = (Close[2]+Close[3]+Close[4]+Close[5])/4;
      :
      :

    の順に、それぞれのバーで、そのバーから過去に遡った4つのバーの終値を平均しています。いわゆる4バーの単純移動平均です。
    こういう例では、i=0 から計算を始めても問題はありませんが、EMAのようにインディケータそのものの過去の値を計算に利用する場合、
    Buf0[0] = (Close[0]+Buf[1])/2;
    Buf0[1] = (Close[1]+Buf[2])/2;
    Buf0[2] = (Close[2]+Buf[3])/2;
     :
     :

    の順番だと、Buf0[0] の計算にBuf0[1]を使っていますが、この時点では Buf0[1] はまだ計算されていません。これはプログラムの記述上間違いではないのでコンパイルではエラーは出ませんが、当然ながら正しい結果にはなりません。コンパイルでエラーが出ないけど結果がおかしいというのが最も間違いを見つけにくいパターンです。
    なので、こういう場合があるということも想定して、インディケータの繰り返し計算では、
     :
     :
    Buf0[2] = (Close[2]+Buf[3])/2;
    Buf0[1] = (Close[1]+Buf[2])/2;
    Buf0[0] = (Close[0]+Buf[1])/2;

    となるように、i=limit-1 から始めていく順番の方が間違いがなくてがいいのです。
    ところで、limit という変数は、
    limit = Bars-IndicatorCounted();
    と定義されています。Bars は、Open, Close などと同様に予め定義されている特別な変数で、チャート上のバーの総数を表します。なので、limit=Bar; だけでもいいのですが、レートが変化する度に全部のバーの計算をすると大変なので、IndicatoCounted()という過去の変化しなかったバーの数を返す関数を使って、それをBars から引くことで、変化したバーの部分だけ計算させるようにするのです。
    最後にそれぞれの関数の最後に return(0) と書かれていますが、これが戻り値の指定です。この場合、0を戻すので、init()、 start()の値がそれぞれ0となりますが、なぜ0を戻すかということには深い意味はありません。
    今日はこんなところです。次回はインディケータの表示の変え方などを説明する予定です。今回よりは実践的になると思います。
    この記事、書くのに結構時間がかかります。次回の記事も読んでみたい方は下のクリックにご協力ください。
    にほんブログ村 為替ブログへ為替ブログランキング 現在10位
    へーっと思った方はクリックにご協力ください↑



  • MT4入門(3) – カスタムインディケータの作り方(1)

    MT4入門の第3回目です。
    今回は「カスタムインディケータの作り方」ということですが、1回じゃ説明しきれないので、まずは、その1回目として
    「カスタムインディケータの作り方(1) – 雛形から始めよう」
    です。まずは一番簡単な雛形を見ながら、MetaEditor の使い方を含めて説明していきたいと思います。
    下のプログラムは一番基本的な単純移動平均のインディケータを表示するものです。

    ここでは、Sample1_Ind.mq4 というファイル名にしてあります。
    (Sample1_Ind.mq4 のダウンロード)
    ファイル名は何でもよいのですが、カスタムインディケータのプログラムということで、Ind という名前をつけています。
    このファイルを前回説明したフォルダーにコピーしてみましょう。
    C:\Program Fies\MetaTrader 4\experts\indicators
    の下です。コピーした後でMetaTrader を起動してください。
    すると、Navigator ウインドウの Custom Indicators の下に Sample1_Ind という項目が表示されるはずです。ない場合は、コピー先を確認してください。
    ここで、Sample1_Ind に合わせて右クリックすると、サブメニューが現れます。ここでModify を選ぶと、MetaEditor が起動し、Sample1_Ind.mq4 ファイルをオープンします。
    このファイルはわかりやすいように日本語でコメントを書いていますが、もし文字が化けている場合は、
    MetaEditor のメニューの、[Tools] – [Options] で Font を日本語のものに変えてみてください。ここでは、Terminal の10ポイントのフォントに変えてみました。

    この記事では、プログラムのコメントには日本語を使いますが、MetaTrader自身は英語のメニューで説明します。(日本語のメニューが中途半端で逆にわかりにくいためです。)
    MQL4の文法はC言語によく似ているので、C言語をご存知の方は飛ばしてもらって構いません。ここでは、プログラムは初めてという人のために基本的な説明から始めます。
    まず、// から始まる行はコメント行です。実行には全く関係ありません。
    コメント行の使い方は実際のコメントを書いたりすることはもちろんですが、プログラムを書き換えるときに、完全に上書きするのではなく、元の行をコメントにして残しておいて、その次の行に新しく書くようにすることをお勧めします。そうすると、書き換えた箇所がはっきりしますし、もし問題があれば簡単に元に戻すことができます。
    複数行をまとめてコメントにしたい場合は、/**/ で、囲みます。これもC言語と同じ仕様です。MetaEditor 上ではコメント行がグレーで表示されます。
    次に、#property から始まる行が並んでいます。
    この # から始まる命令はプリプロセッサ命令と呼ばれるもので、プログラム全体に関わる設定です。
    まず、
    #property copyright “Copyright ゥ 2006, Toyolab FX”
    #property link “http://forex.toyolab.com”

    この二つは著作権とリンクを表すだけで実際の実行とは関係ありません。
    次に
    #property indicator_chart_window
    は、インディケータをチャート上に表示することを指定します。
    オシレータのように別のウインドウに表示させたい場合は、代わりに
    #property indicator_separate_window
    と書きます。
    #property indicator_buffers 1
    は、表示させたいインディケータの数を指定します。この場合、1個です。
    とここまで説明したところで力尽きてしまった(^^;ので、プログラムの説明の続きは次回ということで、とりあえずコンパイルしてみましょう。
    コンパイルは、MetaEditor のメニューの[File]-[Compile]を選ぶかF5キーを押すだけで実行されます。下のウインドウに
    0 error(s), 0 warning(s)
    と表示されればOKです。

    ついでですが、右側のNavigator ウインドウに、MQL4のクイックレファレンスがあります。詳しく知りたい方はここから調べてみてください。私もこれを調べながらMQL4の勉強をしています。
    さて、コンパイルされたカスタムインディケータは、MetaTraderのNavigator ウィンドウの Sample1_Ind のところでダブルクリックするか、メニューの[Insert]-[Indicators]-[Custom] から選ぶと、チャートに表示されます。
    このインディケータは単純移動平均なので、こんな感じです。

    なんか地味ですが、これからバージョンアップしていきます。
    お楽しみに。
    にほんブログ村 為替ブログへ為替ブログランキング 現在9位
    へーっと思った方はクリックにご協力ください↑



  • MT4入門(2) – MQL4で何ができるの?

    MT4入門の第2回目は、「MQL4で何ができるの?」です。
    MQL4というのはMetaTrader4で使われるプログラミング言語のことです。
    普通のチャートソフトや業者のウェブサイトで提供されているチャートにも、いくつかのテクニカルインディケータを表示させることはできます。表示されるインディケータが予め決まっている場合、プログラミング言語を搭載する必要はありません。
    しかし、ユーザーが自分でインディケータを作る場合には、プログラムによってそのインディケータを定義する必要があります。そのための決まりごとがプログラミング言語として定められているわけです。MQL4 は、MetaQuotes Language Veriosn 4 の略ですが、MetaQuotes が開発した言語ということです。
    MQL4で何ができるかということは、MQL4で書いたプログラムがMetaTrader の中でどういう働きをするかということになります。
    MQL4プログラムを作るためには、MetaEditor というプログラムを使います。これは、mq4 という拡張子のファイルをダブルクリックすることでも起動できますし、MetaTrader のメニューの[Tools]-[MetaQuotes Language Editor]からも起動されます。
    MetaEditorから、[File]-[New] を選ぶと次のような画面が表示されます。これがMQL4でできることです。

    ここで関係があるのは上の二つ
    Expert Advisor
    Custom Indicator

    です。そのうち、下のCustom Indicator というのは、文字通り、チャート上に表示させるインディケータを自分で作ったものです。
    上のExpert Advisor というのはインディケータなどがどういう条件のときに売買するかというルールを書いたプログラムです。これは、チャートにアタッチしておけば、そのチャート上で自動的に売買が行われますし、Strategy Tester で過去のデータに対して適用させてバックテストを行うことができます。
    参考までにその下のScriptというのは、いくつかの決まった操作をまとめてやるためのプログラム、エクセルのマクロのようなものです。さらにその下のLibrary、Include は、MQL4 のプログラムを作るためのプログラムみたいなもの、なので、上級者向けと考えていただいて結構です。
    ここでは、MQL4でできることに、Expert Advisor とCustom Indicatorの大きく二つあると理解してください。それぞれのプログラムは .mq4 という同じ拡張子のファイルとして作成されますが、ファイルの置き場所、プログラムの書き方、MetaTrader上での実行の仕方などすべてにおいて異なるので注意してください。
    まずはプログラムファイルを置く場所について見てみます。
    MetaTraderは通常、以下のフォルダーの下にインストールされます。
    C:\Program Files\MetaTrader 4\
    ここをMetaTraderをインストールしたフォルダと呼びます。このフォルダーを開くとさらにたくさんのサブフォルダーが現れます。たいていの人はここでわけがわからなくなって戻ってしまうでしょうが、ここで関係があるのは、experts というフォルダーです。
    下の図のようにExpert Advisor のプログラムは experts フォルダーに入っています。
    またCustom Indicator のプログラムは experts フォルダーの下の indicators フォルダーに入っています。
    MetaTraderFolderSelect.png
    これらのフォルダーに入っている mq4 ファイルは、MetaTrader 起動時に自動的に ex4 ファイルに変換されます。
    ここで mq4ファイル とex4ファイル の違いですが、mq4ファイルは、人が読めるテキストとしてプログラムが書かれていますが、ex4ファイルはテキストではないので直接人が読むことはできません。しかし、MetaTrader 自身がコンピュータプログラムなので、人が読みやすいテキストファイルはそのままでは実行しにくいので、MetaTrader が実行しやすい形に変えておく必要があるのです。これがコンパイルという操作で、通常のプログラムを作るときに行っているのと同じことです。
    実際にはex4ファイルさえあればMetaTrader で実行できるわけですが、ex4ファイルだけではプログラムの変更ができません。しかし、プログラムの中身を他人に知らせたくないけど、使ってもらいたいときに、ex4ファイルだけを配布したりすることがあります。販売されているインディケータやシステムはex4ファイルだけというのが多いです。
    ところで、ex4ファイルであれば中身が絶対にわからないかというとそうではなく、ex4ファイル中の人には読めない命令を解読すれば中身がわかることもあります。でも、それをやるには相当の技術が必要となりますし、仮にできたとしても解読したものを著作権者に無断で配布するなどは著作権法に違反するので注意が必要です。
    この連載では、mq4ファイルを自分で作ることが目的ですので、これからは mq4 ファイルの書き方について説明していきます。
    次回はカスタムインディケータの作り方の予定です。
    にほんブログ村 為替ブログへ為替ブログランキング 現在14位
    へーっと思った方はクリックご協力ください↑



  • MT4入門(1) – MetaTraderって何?

    いきなり始まりましたMT4(MetaTrader4)入門シリーズ第1回です。
    まず、MetaTraderって何?ということですが、既にチャートソフトとしてMetaTrader を使っている人は多いと思います。
    が、ここで説明するのは、カスタムインディケータやトレーディングシステムを作るためのプログラミング言語についてです。
    さらに、トレーディングシステムを過去のデータに対して適用させるバックテストのやり方についても説明していきたいと思います。
    ところで、MetaTraderの前に他の同様なソフトをいくつか紹介します。
    TradeStation
    海外では非常に有名なトレーディングプラットフォームです。
    EeasyLanguage という言語でシステム記述でき、バックテストや自動売買などができます。
    トレーディングシステムをEeasyLanguage のコードとして掲載している本も多数あります。
    但し、有料で月々の支払いが必要となります。
    eSignal
    これも海外で有名なトレーディングプラットフォームです。eSignal’s formula script (EFS)という言語でシステムを記述できます。月々の支払いの必要な有料ソフトです。
    VT Trader
    FXA証券など国内の業者で採用しているところがあるので、デモアカウントで無料で使うことができます。プログラミング言語を装備しており、インディケータやシステムを記述することができます。
    IntelliChart
    FXに特化したチャートソフトです。デスクトップ版とWeb版があり、それぞれ月払いの有料ソフトです。
    IntelliScriptという言語で、インディケータやシステムを記述することができます。
    データはFXCMから供給されています。
    他にもいくつかあるのですが長くなるので本命の MetaTrader を紹介します。
    MetaTrader3
    既にMetaTrader4 が出ているので開発は終了していますが、パッケージが小さく軽いので、このバージョンを採用しているブローカーもあります。デモアカウントで無料で使用できます。MQL2 という言語でインディケータ、システムを記述します。
    MetaTrader4
    MetaTrader3の後継ソフトです。同じくデモアカウントで無料で使用できます。これを採用しているブローカーもいくつかあります。MQL4という言語でインディケータ、システムを記述でき、ストラテジーテスターというバックテストを行う機能が強化されています。但し、MQL2との互換性はありません。
    私も最初は MetaTrader4をチャートソフトとしてしか使っていなかったのですが、システムトレーディングをやり始めると、結構便利なことが多いのに気が付きました。
    まず、お勧めなのは無料で使えるという点です。これからシステムトレーディングを始めようという人には非常に導入しやすいと思います。
    でも、無料だからといって機能的に劣るわけでもありません。MQL4はC言語に近い文法になっており、ファイルやメールに関する関数も組み込まれており、外部ソフトとの連携もしやすくなっています。私は個人的にこの辺が気に入っています。
    この連載記事では、MQL4 を使ってカスタムインディケータ、トレーディングシステムを作り、そのシステムをバックテストする方法まで解説していきたいと思います。
    ただ、不定期な連載になると思いますし、内容が合わない人もいるかと思いますので、同じような内容を掲載しているサイトやブログを紹介しておきます。
    お急ぎの方はそちらへどうぞ。
    SKILL UP FX!
    為替ロボット
    プログラマーなFX
    はー、長くなった。次回は「MQL4で何ができるの?」についてを予定しています。
    にほんブログ村 為替ブログへ為替ブログランキング 現在15位
    へーっと思った方はクリックご協力ください↑