本格的にインジケータを作ってみよう。セパレート型インジケータ作成プログラムは習うより慣れろが基本です。そこで、本格的なちゃんと使える(?)インジケータを確認しながら作成していきたいと思います。MT4では、通常見えている価格の情報以外に価格の更新回数という情報も保持しています。更新回数が多いほど活発に取引されていることを示しています。値段が動きやすいタイミングというのがデータで判別可能です。これは通常の価格チャートでは表示されていません。MT4には、この情報を表示するためのVolumesというデフォルトのインジケーターが存在しますが、基準値が表示されおらず、で?って感じのインジケータとなってしまっています。そこで、インジケータの現在値と平均値を同時に表示して活発に取引されているかどうかを判定するインジケータを作成したいと思います。新しいインジケータを作成してみてください。やってみよう!簡単インジケータ作成1http://mt4program.blogspot.jp/2015/12/mql-005.htmlを、参考にTickVolumeという名前のインジケータを作成します。カスタムイベントハンドラの選択」以降の作業は無視して、すべて[次へ(N)]ボタンを押してウィザードを終了してください。すると次のようなファイルが出来上がります。これがインジケータ最小限のひな型となります。生成コードを見てみようhttp://mt4program.blogspot.jp/2015/10/blog-post_95.html時間足の中央値を描画するサンプルhttp://mt4program.blogspot.jp/2015/10/blog-post_79.htmlでも少し書いてありますが、もう一度、重要な部分だけおさらいしたいと思います。"1.00"まず、上から4行ですが、これはプログラムに関する情報です。動作には大きく影響しません。気になる方は修正しましょう。外部に向けて公開するときなどは、著作権情報などを入力します。strictこの一行は、あたらしいMQL形式に対応するという文言ですが、特に気にせず付けます。indicator_chart_windowこの一行は、重要です。indicator_chart_windowは、価格が表示されているチャートの上に描画されるインジケータのことを示しています。やってみよう!簡単インジケータ作成2http://mt4program.blogspot.jp/2015/12/mql-006-2.htmlで作成したような形のものです。TickVolumeというのは価格情報とは異なる値ですので、分割したインジケータとして表示したい情報です。そこで、ここの値を次のように変更します。indicator_separate_windowこの状態で、一度実行してみましょう。分割したインジケータ価格情報が表示されている場所とは別の場所に枠が表示されました。これがセパレート型インジケータとなります。次回は、このチャート上に、価格の更新回数を描画したいと思います。次の回へブログランキングにご協力よろしくお願いします。MT4プログラミング2016年1月7日木曜日[雑記]思えばたくさん作ったものです。無料公開中のインジケータ追加FX-ONにて公開している無料インジケータを更新しました。ブログ左にある豚さんリンクからダウンロードできます。下記のインジケータが含まれています。自分で言うのもなんですが、いっぱい作りましたね^^;;;役に立っていると思うのは、S/RオシレータとTEMA関係でしょうか?TEMAかい離率なんかも1時間足では、なかなか役に立っています。実行ファイル:WaveletEnagy.ex4http://mt4program.blogspot.jp/2015/10/mt4_34.html・各国の取引時間を表示する。ファイル:MAMA.ex4ソースコード:MAMA.mq4http://mt4program.blogspot.jp/2015/10/blog-post_71.html・状況に応じて色が変わるボリンジャーバンド実行ファイル:colorfulMTBB.ex4ソースコード:colorfulMTBB.mq4http://mt4program.blogspot.jp/2015/10/mt4_22.html・二つのMA間に雲を描画する。http://mt4program.blogspot.jp/2015/10/mt413_8.html・[MT4インジケータ&プログラム]TEMAに標準偏差バンドをつけてみた。実行ファイル:TEMABB.ex4ソースコード:TEMABB.mq4http://mt4program.blogspot.jp/2015/10/mt4tema_15.html・[MT4インジケータ]13本高値安値にトレンド成分を追加してみた。実行ファイル:Kairiritsu.ex4ソースコード:Kairiritsu.mq4http://mt4program.blogspot.com/2015/10/mt4_5.html・レンジ・エクスパンション・インデックス(REI)を作ってみた。実行ファイル:RangeExpansionIndex.ex4ソースコード:RangeExpansionIndex.mq4http://mt4program.blogspot.jp/2015/10/rei_8.html・シンプルだけど効果あり!MT4でDrawSimpleLineインジケータを作ってみた。http://mt4program.blogspot.jp/2015/10/mt4drawsimpleline_8.html・[MT4インジケータ]S/RオシレータをTEMAで平滑化してみる。・ATR君・・ほしい値はそこじゃない!複数バーを使ったATRを表示する。瞬間的かい離で利食い&逆張りタイミング?実行ファイル:TemaKairiritsu.ex4ソースコード:TemaKairiritsu.mq4http://mt4program.blogspot.jp/2015/12/mt4tema.html・[MT4インジケータ]平均足を漸進計算で上位足を表示する。実行ファイル:VMTHeikinAshiOnChart.ex4ソースコード:VMTHeikinAshiOnChart.mq4http://mt4program.blogspot.jp/2016/01/mt4.htmlブログにてコードもアップしているものはソースコードも含めています。詳細は各記事をご確認ください。プロぐランキングにご協力よろしくお願いします。雑記2016年1月6日水曜日[MT4インジケータ]平均足を漸進計算で上位足を表示する。チャート版ここ最近、MQLの入門記事ばかりでしたので、たまにはインジケータを。漸進マルチタイムフレーム平均のチャート表示版です。1時間足をベースに取引すると仮定します。その際4時間足の平均足を参考にすると、高値安値の発生が時間によって影響時間が異なるという問題が発生します。4時間足で、高値が、0時~1時の間に発生したとします。その場合、その高値はその後3時間平均足に大きく影響します。ところが、3時~4時の間に発生すると、その1時間後には次の足へ移動してしまうため、影響時間は短くなります。このように、上位時間足を参考にした場合、ある時間でまとめられてしまうため、影響時間が大きく異なる問題が発生してしまいます。過去のデータを参考にする場合には、まとめることがノイズ成分を除去することにつながるため利点が大きいのですが、現在値として参考にしようとするとバーの形成時間によって判断が一定しないという問題が発生します。そこで、漸進マルチタイムフレームの考え方となります。これは、計算対象の足から必ず指定時間前までの値をとることによって、高値安値発生の影響時間を一定に保つ効果があります。問題点としては、必ず最大時間の影響を与えるため判断が遅くなるということです。例として、1時間足に16時間足で計算した平均足を表示します。一度高値が発生すると以後16本影響を及ぼす状況がわかるかと思います。平均足のチャートとしても見た目的に微妙ですよね。触った感じでは、表示時間足の2倍~4倍までの平均足計算が実用的な範囲に思われます。(追記)時間の経過において高値安値の影響を減衰させる改良版を作成しています。http://mt4program.blogspot.jp/2016/01/mt4_20.htmlプロぐランキングにご協力よろしくお願いします。m(._.)mソースコードはこちらから。年明けから世界の株式が大暴れで大変ですね。超入門ということで、プログラムを作るうえで、この程度は必要と思われる内容を挙げています。今回は条件分岐について記述したいと思います。if文というやつです。判定式と呼ばれる数式とセットで使います。記述方法は次の通りです。){判定式が真の時}else{判定式が偽の時}判定式というのは、結果が真か偽のどちらかになる式のことをいいます。yといった比較式が代表例です。比較式の中で、よく使う下の式を覚えましょう。baとbが等しいまた、条件式同士を結ぶ論理式というのも使用します。使うのは次の二つです。daよりbが大きく[かつ]cよりdが大きい二つの条件が共に真の時、真になります。daよりbが大きく[もしくは]cよりdが大きい二つの条件のどちらかが真の時、真になります。これらと()を組み合わせて判定式を組み立てます。なれるということで、とりあえずやってみましょう。やってみよう!簡単インジケータ作成2http://mt4program.blogspot.jp/2015/12/mql-006-2.htmlで作成したインジケータをさらに修正してみます。OnCalculateの部分を修正します。前回同様に赤字の部分を修正してみましょう。}//+------------------------------------------------------------------+さて、早速実行して、前回と比べてみてください。一定ボリュームがあるときだけ、中央値を更新する。一部分、中央値が更新されない区間が出てきたと思います。過去21本の取引量平均の半分を超えていない場合、ラインを更新しないという処理を追加してみました。一挙に本格的なプログラムになってきましたね。余談ですが、コメントが無いため、プログラムの中で何をしているのかわかりにくいですね。コメントも入れてみましょう。過去21本の取引量平均を求める。チャートの最大本数を超える場合は、そこまでの計算とする。0除算対策で、count値が0より大きい場合のみ計算する。一定以上のボリュームを伴っている場合のみ、チャート更新する。}//+------------------------------------------------------------------+このようにコメントを入れておくと、あとから見たときに何してたっけ?ってわかりやすいかなと思うのですが、皆さまどうですか?ちなみに会社では、まずコメントから書きなさいと新人には指導しています。変数と、繰り返し制御文、if制御文を勉強したことで、自分の考えをプログラムとして作る基礎が出来上がりました。ここまでできると後は実際にあれこれやってみる段階になります。追加で必要な知識は、具体的に作りながら覚えていきましょう。いうことで、関数とかプログラムを作るうえで追加で必要な知識はやりながら覚えていくとして、次からはMQLならではの特徴を説明しながら掘り下げていきます。インジケータからです。今までは説明を省いていましたが、OnCalculateについて詳しく説明したいと思います。2重ループで皆様戸惑うようです。MT4の仕様としてOnCalculateの引数として渡ってくるclose[]などの配列は0番目の要素が最新の値(一番右端バーの値)です。//最新の値そして、この配列にはrates_total数要素があります。C言語の文法に従って、最初の要素は0で指定しますから最後の要素はrates_total-1となります。){....}は、iの値を、未計算分の一番大きな値から0までiを1ずつ減らしながらループする。1){}}少し難しいですね。中のループはiの値毎に動きます。iが0の時を考えてみるとわかりやすいです。21の条件で、jが1ずつ上がっていくループになります。j=0,1,2,....20って感じです。その場合、次のように処理を書いてあると結果は。tick_volume[j];}結果は、countは21、volumeTotalはtick_volume[0]~tick_volume[20]を足した値です。21の条件となります。結果はcountは21、volumeTotalはtick_volume[1]~tick_volume[21]を足した値です。rates_total-21を超えてくると、配列に存在しない値を見ようとしてエラーになってしまいます。21で条件終了なので、jは80~100までの値をとります。1]=tick_volume[99]です。処理の最後にtick_volume[100]を読もうとしてエラーになってしまいます。これを防止するのに条件を追加しています。rates_totalが条件的には正しいですが、いつも隣の要素まで見ることが多いので安全マージンとして癖で-1って入れてしまっています。(汗ブログランキングにご協力よろしくお願いします。変数の型さてさて、変数について、もう少し掘り下げてみましょう。変数というのは値が変化する名前の付いた箱のようなものと説明しました。MQLでは箱の種類がいくつか存在します。代表的なものを説明します。2147483648~2147483647(±約20億)の整数値だけ代入可能な型です。MQLでは主に配列の添え字やfor文の回数を制御するために使用します。小数点を含む値を代入することが可能です。MQLでは主に価格情報や計算結果で使用します。int型とdouble型ですが、最大の違いは割り算です。world!http://mt4program.blogspot.jp/2015/12/mql-002-hello-world.htmlで作成したプログラムを少し改造して、intとdoubleの割り算の違いを見てみましょう。}//+------------------------------------------------------------------+画面に0と表示されたメッセージと、0.5と表示されたメッセージが出てくると思います。このようにint同士の割り算では、小数点以下は切り捨てとなります。思わぬ切り捨てが発生して予期しない計算式とならないように注意が必要です。MQLでは文字列の定数は""で囲んで宣言しますが、宣言した文字列を代入するための変数です。MQLでは主にメッセージボックスの文字列や、インジケータの情報を表示するための文字列として使用します。論理型と呼ばれる、trueかfalseの2値のみをが入る値です。これは、まだ説明していないif文と呼ばれる条件によって処理が変わる制御で使用します。日時が設定可能な型です。現在時刻や、チャート上のバーの時間などを取得する際に使用します。日付関数と呼ばれる日付を操作する関数群とセットで利用します。少々説明が長くなりますので、別の機会を設けて説明します。ここでは日付を扱うための専用の変数があるんだなぁぐらいで覚えておいてください。TimeCurrent();MessageBox(TimeToStr(now));■uint型0~4294967295(0~約40億)までの正の整数値のみが代入可能な特殊な型です。負の値をとりたくない場合に使用します。uint型では、引き算に特徴が表れます。GetTickCount()とuintの引き算とOS再起動http://mt4program.blogspot.jp/2015/10/mt4-gettickcountuintos_8.htmlでも少し書いてありますが、減算しても、-の値になりません。マイナス分が最大値である4294967295から引かれた値に1足した値となります。uY;MessageBox(uZ);//1と表示されます。次の回へブログランキングにご協力よろしくお願いします。★相互リンク募集中★トレードステーションと株・FX自動売買で暮らす茶トラがFX検証中。人気の投稿[MT4プログラミング]MT4のチャート上に矢印を表示する。本格的にインジケータを作ってみよう。セパレート型インジケータ作...[雑記]思えばたくさん作ったものです。無料公開中のインジケータ追加[MT4インジケータ]平均足を漸進計算で上位足を表示する。