■超直感!MT4プログラミング講座■ 第17回 iMA()に慣れよう

スポンサーリンク

こんばんは!キリンです。
今日、鮒谷さんのかの有名なメルマガ、平成進化論において面白い話が載っていました。
簡単にご紹介させていただきますね。
鮒谷さんに、既に超有名起業の内定をもらった大学4年生から
メッセージが届いたそうです。
それが、下記の内容でした。
> --------------------------------------------------------
> (前略)
> 
> 無理を承知でお願いするのですが…
> 自分を鮒谷さんの雑用にしてくれないでしょうか!
>
> 未熟な自分のロールモデルになって欲しいのです。
> 
>
> オフィスの掃除からゴミ出し、買いもの、鞄持ちなど
> なんでもやります。
> 
> 授業がある水曜日の午前以外であればいつでも行きます。
> もちろん無給でお願いします。
> 
> 必要あれば、寝袋も持っていきます。
>
> (後略)
> --------------------------------------------------------
「やられたーっ!」って思いました。
素晴らしい行動力ですよね。
「学ぶために、一緒にいさせてください!なんでもしますから!」
という素晴らしい姿勢をお持ちの彼。
また歳下に先を越された(w
負けたとは思いませんが、大学4年のときはこの大学生のような意識を持ち合わせていなかった。
大学のときからこのような意識であったらよかったのに・・・。
このギャップをバネにして頑張っていかなきゃなりません。
この件に関しては、毎日コツコツ書いているサブブログで
本日書いてみようと思っています。
よければご覧になっていただけると嬉しいです。

風来のキリンの「人とのつながりを大切に」
http://ameblo.jp/furai-kirin/

・・・にしても悔しいw
さて、では今回の講義です。
まずは前回の宿題のおさらいと解説を。
■前回の宿題の回答と解説
すばらしい内容をまたまたりあるさんからいただきました。
ぜひ、その内容に沿ってお話させてもらおうと思います。
りあるさんが私にくださったメッセージには、
全てりあるさん自身作成されたプログラムが載せられていました。
それが、下記のプログラムです。

//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright ゥ 2010, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright “Copyright ゥ 2010, MetaQuotes Software Corp.”
#property link “http://www.metaquotes.net”
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_level1 0
double Buf[];
extern int MAPeriod = 13;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//—- indicators
SetIndexBuffer(0, Buf);
string label = “MA(“+MAPeriod+”)”;
IndicatorShortName(label);
SetIndexLabel(0, label);
// return(0);
//—-
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//—-
//—-
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int limit = Bars-counted_bars;
for(int i=limit-1; i>=0; i–)
{
//Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
Buf[i] = 92.30;
//—-
}
//—-
return(0);
}
//+------------------------------------------------------------------+

基本的な構成としては、私が前回ご紹介したプログラムの内容と変わっていません。
まず、これを元に前回の宿題の回答を説明させていただきます。

~前回の宿題~
Bufの配列の中身全てに[93.30]を入力するインディケーターのfor分を作ってください。
そして、ドル円のチャートで実際に動作させてみましょう。
ヒント:Bufの中身全てに93.30を入力するにはどこを変更すればいいかを考えれば・・・

この回答は、りあるさんのプログラムでは、
//Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
Buf[i] = 92.30;
この部分になります。
まず、私のプログラムで書かれていた、
Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
の部分の先頭に「//」を入れてコメント化(メモ化)しています。
これを、「コメントアウト」といい、元のプログラムを残し変更した部分を分かりやすくするという
プログラミング上の手法なのですが、それを実践されています。
素晴らしいです。勉強されているのが伝わってきます。
そして、実際の回答部分、
Buf[i] = 92.30;
です。
これで、Buf[i]の中身が92.30になります。
iが0から表示バーの本数分変化するので、
Bufの中身すべてが92.30になります。
これが今回の答えですね。
junkyさんのコメントなども、簡潔にお答えなさった良答だ思います。

インチキ技ですが・・・
Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);

Buf[i] = 93.30;
にしたらOKでした(笑)

ちなみに、インチキでもなんでもありません。
これが今回の答えです。
りあるさんのプログラムの中で、
ぜひ皆さんにご紹介したい場所があるんです。
それが、この部分。
int counted_bars=IndicatorCounted();
です。
関数IndicatorCounted()の値を、counted_barsという変数に置き換えています。
これ、意外に重要なんです。
全てMQL定義済み関数をそのまま呼び出してしまうと、
プログラム全体が長くなり、さらに関数が「引数」を必要とする場合、
さらに関数文全体が長くなってしまいます。
それを避けるために、このように関数の出力を変数に置き換えるんです。
ぜひぜひ、実践してみてくださいね!
では、本日の本題です。


第17回 iMA()に慣れよう

■iMA()の構成
■iMA()の構成
まず、iMA()関数は次のようにMQLで定義されています。
double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
「リファレンスのリンク」
前から順を追って説明していきますね。
▼関数の定義
・double iMA
iMA関数の戻り値が「double」型であることを定義しています。
▼引数
・string symbol
「通貨ペア」のシンボルを入力します。
USDEURや、USDJPYなどと入力することができます。
※インディケーターを導入した通貨ペアを選択したい場合は、
 NULLと入力します。
・int timeframe
時間軸を選択します。
導入した通貨ペアの時間軸で表示させたい場合は、0と入力します。
時間軸を変更したい場合は、
MQLの中ではあらかじめ定数として定義されている時間軸がありますので、
「リンク先」を参考に、入力してくださいね。
※このページでのConstant定数というのは、MQLで定義済みの「定数」です。
 定数は、変数と同様に文字列が割り当てられています。
 変数との違いは、「値の変更ができない」点です。
 定数の出力は、リンク先でいうと、「Value値」になります。
 このValue値をConstant定数の変わりに入力しても同じ値になります。
・int period
移動平均線を計算する区間を指定します。
移動平均線とは、表示しているローソク足から
period分後ろまでのローソク足の平均値をグラフ化したものですよね。
そのperiodを変更できます。
・int ma_shift
通常はほとんど使いません。
ここに割り当てた数値だけ、右にグラフを移動させることができます。
・ma_method
!非常に面白い部分です!
ここの数値を変更することで、移動平均線の種類を変更できます。
「リンク先」を参照してみてくださいね。
ここの定数を、MODE_SMAから、MODE_EMAに変更するだけで、
「単純移動平均」から、「指数移動平均」に種類を変更することができるんです。
平滑移動平均や、線形加重移動平均などにも定数を変更するだけで簡単に行えます。
ぜひ、変更してみてくださいね。
・int applied_price
この数値を変更することによって、移動平均を算出する基準を変更することができます。
これも「リンク先」をご参照いただければと。
オープンやクローズ、最安値、最高値だけでなく、中央値なども使えるのが面白い点ですね。
・int shift
!超重要な部分です!
このshiftの値で、移動平均を計算する場所を指定しています。
0と入れれば、最新のローソク足における移動平均の値を返し、
100と入れれば、100本前のローソク足における移動平均の値を返します。
ですので、前回のプログラムでは、
Buf[i] = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
このように、Bufの[ ]の中と iMAの一番最後の引数にiがあるんですね。
i本目の移動平均の値を、Buf[i]に割り当てているんです。
そして、iを0から表示ているチャートのバーの本数分計算させれば、
全てのグラフが作成できますよね。
iMAの説明だけでも結構長くなっちゃいましたね。
上記でわからないことがありましたらドンドン質問ください!
それを今回の宿題にしたいと思います。
この部分を理解できたら、MQLのプログラミングが一気に楽しくなりますよ!
次回は実際にこのインディケーターの各場所を色々いじって遊びたいと思います。
最後までお読みくださりまして、ありがとうございます^^

コメント

  1. junky より:

    SECRET: 0
    PASS:
    iMAっていう名前の「i」って、この引数「i」のことだったんですね。。。
    MQL定義済み関数って、大文字から始まるものだと思っていたので、違和感を感じていたんですが、妙に納得しました(笑)

  2. SECRET: 0
    PASS:
    >junkyさん
    そういう意味の「i」だったんですね。
    私もよく分かってません^^;
    今日もコメントありがとうございます!

  3. Purplefunnel より:

    SECRET: 0
    PASS:
    初めまして。
    数日前に初めてこちらを知り、第1回から読ませていただいています。
    で、どうでも良いことなのですが・・・(汗
    >iMAっていう名前の「i」って、この引数「i」のことだったんですね。。。
    >そういう意味の「i」だったんですね。
    横からすいません。
    indicators の 「i」ではないでしょうか?
    iADX
    iATR
    iBands



    iMA
    iOsMA
    などなど・・・

タイトルとURLをコピーしました