インジケーターを作ってみる

インジケーターを作ってみる

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

にほんブログ村 為替ブログ FX システムトレード派へ

今回は、インジケータを作ってみようと思います。 3本の移動平均を表示したいと思います。  

 簡単なプログラムを作ってみるを参考にMetaEditorのメニューでFile-Newで「Expert Advisor Wizard」を開きます。 「Custom Indicator」にチェックを入れて、次へを押します。   

3EAパラメータ追加

3EAパラメータ追加

Nameに3EA(名前なので何でもいいです)、Addボタンを押してパラメータを3つ追加します。

Nameをそれぞれ、Peried1、Peried2、Peried3とします。 Typeはintにしてください。  

次へを押します。

 

グラフの種類を選択

グラフの種類を選択

Addボタンを押して、表示するグラフのラインを追加します。

3つ追加して、Red、Yellow、Greenを選んでください。

別に違う色でもかまいません。

今回は、線で表示するのでTypeはLineのままにしてください。

 

完了を押すと、スケルトンが作成されます。

 

先頭の方に以下の行があると思います。

コメントを付けて、説明します。

//メインウィンドウに表示する。

#property indicator_chart_window

//グラフに利用する入れ物が3つ(最大8個)

#property indicator_buffers 3

//1本目は、太さ1の赤

#property indicator_color1 Red

//2本目は、太さ1の黄色

#property indicator_color2 Yellow

//3本目は、太さ1の緑

#property indicator_color3 Green

//入力するパラメータは、以下の3つ

extern int       Peried1;

extern int       Peried2;

extern int       Peried3;

//表示するグラフに対応する入れ物3つ

double ExtMapBuffer1[];

double ExtMapBuffer2[];

double ExtMapBuffer3[];

インジケータを使うときは、必要な数の上記の設定が必要になります。
ちょこっとだけ改造します。
extern int       Peried1=7;
extern int       Peried2=14;
extern int       Peried3=21;
とデフォルトの数字を設定しましょう。
これで、何も入力しなくても利用可能になります。
次は、初期設定です。
int init()
  {
//—- indicators
//1本目(0番から始まる)はライン
   SetIndexStyle(0,DRAW_LINE);
//1本目のバッファをExtMapBuffer1とする
   SetIndexBuffer(0,ExtMapBuffer1);
//2本目はライン
   SetIndexStyle(1,DRAW_LINE);
//2本目のバッファをExtMapBuffer2
   SetIndexBuffer(1,ExtMapBuffer2);
//3本目はライン
   SetIndexStyle(2,DRAW_LINE);
//3本目のバッファをExtMapBuffer3
   SetIndexBuffer(2,ExtMapBuffer3);
//—-
   return(0);
  }
最初の方で、色を設定したのでここでは、どのように描画するか。
線ごとにバッファをどれにするかをしていします。
これで、ExtMapBuffer1などに値を入れるだけで線を書いてくれるようになります。
ExtMapBuffer1などは、描画されている足の数に対応したバッファです。
ExtMapBuffer1[0]から始まり、最新が0になります。

 

実際に、移動平均の値を登録していきましょう。
int start()
  {
//変化していない足の数を取得する
   int counted_bars=IndicatorCounted();
//値を入れる足番号の変数
   int i;
//表示されている足の数から、変化のない足の数を引いたもの(描画すべき足)の値をセット
   i = Bars-counted_bars-1;
//最新の足(0)をを描画するまで繰り返す。
//古いものから書いていきます。
   while(i>=0)
   {
//1本目の単純移動平均の値を取得
       ExtMapBuffer1[i]=iMA(NULL,0,Peried1,0,MODE_SMA,PRICE_CLOSE,i);
//2本目の単純移動平均の値を取得
       ExtMapBuffer2[i]=iMA(NULL,0,Peried2,0,MODE_SMA,PRICE_CLOSE,i);
//3本目の単純移動平均の値を取得
       ExtMapBuffer3[i]=iMA(NULL,0,Peried3,0,MODE_SMA,PRICE_CLOSE,i);
//1つ新しい足番号にする(1引く)
       i–;
   }
   return(0);
  }

 

さて、以上でプログラムは終了です。

コンパイル(F5)してみましょう。

メタトレーダーへ戻って、3EAを表示させたい通貨のウィンドウへドロップしてみてください。

 

3EAパラメータ

3EAパラメータ

ドラッグしたときに表示されるウィンドウの「パラメータ入力」タブを押すと上の画面のようになります。
初期設定した内容が表示されていることが分かると思います。
この設定は、後で変更可能です。
OKボタンを押して、描画させてみましょう。
3EA表示

3EA表示

3種類の移動平均が表示されていることが分かります。

簡単でしょ!!

 

iMaが移動平均を取得する関数です。

パラメータで、いろいろな移動平均を取得できます。

今回は、単純移動平均(MODE_SMA)、終値(PRICE_CLOSE)を利用しました。

他にも、指数平均、平滑平均、加重平均なども選べます。

終値の他にも始値、高値、安値、平均をとったものなどを選ぶことができます。

 

今回のプログラムは、以下からダウンロードできます。

ここから、ダウンロード

 

インジケータは、

インストールパス\MetaTrader\experts\indicators

に入れてください。

 

 

にほんブログ村 為替ブログ FX システムトレード派へ 人気ブログランキングへ

タグ

トラックバック&コメント

この記事のトラックバックURL:

トラックバック

  1. [...] めたぷろで紹介した「インジケータを作ってみる」で作成したインジケーター。 [...]

    ピングバック投稿者: 3EA 3種類の単純移動平均を表示 | MT4 めたぷろ ダウンロードセンター — 2009年05月16日


コメント

  1. 尖 信一 より:

    はじめまして、大阪の尖(とがり と読みます)

    最近MT4の存在を知り、そのインディケーターの書き方を勉強してみたいなーと思い始めた、54歳の、プログラムを何にも知らないおっさんです。

    サイト調べていたらあなたの教え方が一番分かりやすそうで、内容をザクッと読んで、即コメントしてしまいました。

    ゆっくり読んで、作りたいインディケーターがあるんでチャレンジしてみます。Excelでは簡単にできるMAとそれを元にしたモメンタムなんですが、
    作れるか・・・・・・。

    分からない所がありましたら、ご指導お願いします!

    とりあえずはご挨拶まで。
                             尖 信一

    • kei より:

      尖さん、はじめまして
      プログラムの書き方は、なるべく簡単に説明していくつもりですが、わからないことは質問してくださいね。
      MT4では、MAは簡単に求めることができます。
      iMaという関数で、好きな時間軸の好きな時間の値を求められます。
      それも、単純移動平均や指数移動平均などいろいろな種類を求めることができます。

      MAもそうですが、標準でたくさんの指標を求める関数が用意されています。
      たぶん、Exelだと多少計算式を駆使したと思いますが、用意されている関数なら簡単に取得できます。

      もちろん、足が抜けたなど条件を組み合わせられますので、きっと作ることができると思います。

      これから、自動売買のプログラミング方法もアップしていきますので、インジケーターだけではなくEA(自動売買)もチャレンジしてみてください。

  2. [...] めたぷろで紹介した「インジケータを作ってみる」で作成したインジケーター。 [...]

  3. kenken より:

    初めまして。
    MQL4プログラミングについて調べていたら、このサイトに辿り着きました。
    EXCELのマクロが少し組める程度で、Cは全くやった事ないので、MQL4もコードにちょっと変更を加えるくらいしか出来ません。
    めたぷろさん(運営者さんをそう呼んでもよいのでしょうか?)の記事を読んでいけば、プログラムを組めるようになりそうですね。
    ただ、トレードに役立つインジケーターを作成するのには時間が掛かりそうです。
    1つ、題材として取り上げて頂きたいものがあります。インジケーターのシグナル表示、BoxでのAlert表示、音でのAlert、メール送信は、コードをどう書くのか知りたいです。中々、画面に貼り付いてはいられないので、役立ち度合いは高いと思います。
    RSIOMA V3というフリーのインジケーターがあり、シグナル表示はあるのですが、Box、音、メールを追加したいです。Heiken Ashi Alertからコピーしようとしたのですがうまく行きませんでした。
    もし、RSIOMA V3へのAlert追加を題材として取り上げて頂ければ、非常に嬉しいです。是非ともよろしくお願い致します。

    • kei より:

      コメントありがとうございます。
      メッセージのポップアップと音を鳴らすことですね。

      順次取り上げていきたいと思うので、しばらくお待ちください。

      RSIOMA V3については、利用していないので分かりませんが、調べてみます。
      情報ありがとうございます。

    • kei より:

      ちなみに、
      MessageBox
      SendMail

      という関数を使います。

      MessageBoxはインジケーターでは、利用できません。

      で、ダメなはずのインジケーターからはどういうことをやっているかというとWindowsのAPIを呼んでいるんです。
      メタトレーダーは、外部のDLLなどを呼び出すことができるんです。

      細かくは、ここではかけませんのでそのうちやってみますね。
      ちょっと設定がややこしくなるので。。

      • kenken より:

        ご返信ありがとうございます。
        MT4は外部DLLの呼び出しが出来てWindowsのAPIからMessageBoxが使うんですね。本当に勉強になります。
        RSIOMA(正式にはRSIOMA V3)はRSI of Moving Averageの略で平均化したRSIとの事です。2本のラインのクロスでエントリーを考えます。外為男さんのブログで紹介されており、ダウンロードが出来ます。
        http://gaitameotoko.seesaa.net/article/54576203.html
        プログラムが組める自分を想像しながら、少しずつ勉強して行きます。よろしくお願い致します。

        • kei より:

          Alert(…)

          PlaySound(ファイル名)
          で対応できそうです。

          Alert(”High:”,High[0]);
          PlaySound(”alert.wav”);
          これで、うまくいくと思います。

          この関数を知らなかったので、前回のコメントではAPIを使うようなことを言ってしまいました。

  4. Yukki(行待秀一) より:

    コメントを入力してください。

    メタプロ担当者 様

    MQL4で検索をしていて辿り着きました。
    実は作成したいインジケータがあるのですが、必要なデータ定義と使用する関数や指定方法が分からないのです。
    もし、コメント欄の趣旨にそぐわないようでしたら、ネグレクトしてくださって結構です。
    もし、ご教示いただけるようでしたら、よろしくお願いいたします。
    作成しようとしているインジケータですが、チャートウィンドウをUSDJPYで開いて、サブウィンドウにEURJPYとEURUSDを表示させるといった内容です。
    そもそも各通貨ペアの価格の取り方が分からないのですが、とりあえず移動平均のピリオドを1にすれば代用できるのでは(?)と思いトライしてみました。
    実際に、USDJPで開いたチャートウィンドウに、imaのsynbolパラメタに”EURJPY”と記述してコンパイル&実行したところ、移動平均線は水平方向に一本の線となって表示されてしまいました。
    正しく表示されていたUSDJPYの移動平均線に対して変更した個所は、imaのsymbolパラメタだけです。
    これは、チャートウィンドウの通貨ペアと異なる通貨ペアのデータを取得・加工するためには、何らかの宣言や定義が必要になるということでしょうか?
    また、もし教えていただけるようでしたら、通貨ペアの価格を取得する関数につきましてもお教えいただければ助かります。
    上記の疑問につきましては、書籍等を見ても、チャートウィンドウに表示されている通貨ペアについては、Synbol()やNULLで良いとあるのですが、他の通貨ペアのケースについては記述されておらず、どこかに載っていないかと探しまわっていたところ、貴サイトに辿り着いた次第です。
    コメントというより、完全に質問ですが、許容範囲でしたら、回答よろしくお願いいたします。


コメントを投稿する



この記事のコメントだけのRSSフィードを取得

Spam Protection by WP-SpamFree


簡単なプログラムを作ってみる »
« かるく文法(if文編)