MT5 インディケータの作り方 その1

indicator

簡単 な 文法

必要 最低限 知っ て おく べき こと 本書 は プログラム の 経験 の ない 方 でも、 サンプル の プログラム を 見 ながら インディケータ を 書ける よう に なれ ます が、
プログラム を 書く 前 に 最低限 知っ て おく べき 知識 が あり ます。 既に プログラム の 経験 の ある 方 は 本章 を 飛ばし ても 構い ませ ん。

プリプロセッサ
プリプロセッサ は プログラム の 準備 の ため に いろいろ な 決め 事 を 書く 部分 です その 中 に property という もの が あり ます。
property は プリプロセッサ の 一部 です が 本書 では property 部分 と 記載 し ます。 property 部分 で 書か れる もの を 説明 し ます。

プログラム の property
使用 さ れる インディケータ の 配列 は いくつ か、 描画 さ れる ライン は 何 本 か、 LINE の 太 さは、 形状 は? などと、
プログラム で 書か れる もの を 指定 し ます。

property

の 形 で 宣言 し ます。

定数 プログラム の 中 で 使わ れる 定数 を 定義 し ます。

define

の 形 で 宣言 し ます。
たとえば #define TENKAN_ period 9 と 宣言 し たら、 TENKAN_ period という のは 数字 の 9 を 表す という こと になり ます。
プログラム の 中 で 何 箇所 か TENKAN_ period という 数値 を つかう ところ が あっ たら、 直接 9 と 入れ ない で、 TENKAN_ period と いれる よう に し ます。
将来 TENKAN_ period の 数値 が 9 以外 の 値 に なっ た 場合、 変更 が 簡単 になり ます し、 変更 漏れ が なくなり ます。

外部 変数

プログラム 全体 の 中 で 使わ れる 変数 を 宣言 し ます。

int hMA;
double MABuffer[];
color DaClor = clrGreen;
string obj =” object”;

変数 の 宣言 方法 には 決まり が あり ます。
変数 の 型 変数 名(= 初期 値); 変数 には 型 という のが あり ます。
int は 整数、 double は 小数、 color は 色、 string は 文字列 です。
本書 では この 4 つ で ほとんど 記述 でき ます。 また 変数 の 中 で 特別 な もの が あり ます。
input 変数 の 前 に input を つけ て input int InpMaPeriod = 20; などと 宣言 する こと が あり ます。
これ は ユーザー が 変更 できる 変数 です。 input を つける こと で

この 画面 で ユーザー が 変更 する こと が できる よう になり ます。
主 に input でで 使わ れる のに

input ENUM_ MA_ METHOD
InpMAMethod = MODE_ SMA;
input ENUM_ APPLIED_ PRICE InpMAApply = PRICE_ CLOSE;

が あり ます。 これ は ENUM_ MA_ METHOD 型 で ある 変数 InpMAMethod に 初期 値 MODE_ SMA が 設定 さ れ て いる、
また ENUM_ APPLIED_ PRICE 型 で ある 変数 InpMAApply に 初期 値 PRICE_ CLOSE が 適用 さ れ て いる という 意味 です。
ENUM ● ● という のは いくつ かの 要素 が 集まっ て、 その 中 の 一つ を 選ぶ という こと が でき ます。
input で 宣言 できる 上 の 2 つ は、 プルダウンメニュー で 選ぶ こと が でき ます。
なお、 変数 の 後 には「;」 セミコロン を 忘れ ない よう に し ましょ う。
配列 という のも 極めて 重要 です。

double MABuffer[];

配列 という のは、 データ が 入る 箱 が 並ん だ もの と イメージ し て ください。

箱 1 つ に 1 個 ずつ データ が 入っ て いく イメージ です。
double 型 で 宣言 し て いる ので、 箱 の 中 には 小数 の データ が 入り ます。
また、 宣言 の とき に Buffer[] と[] を 空欄 に し て おく と、 必要 な 大き さは プログラム が 自動的 に 決め て くれ ます。
たとえば、 移動平均線 の データ は ロー ソク 足 の 本数 が わから ない と 決め られ ませ ん。
ロー ソク 足 の 本数 は 事前 に わかり ませ ん ので、 プログラム に 自動 で 決め て もらわ なけれ ば なら ない の です。 一方、
あらかじめ データ の 個数 が わかっ て いる とき は Buffer[ 4] という よう に、 明示 的 に し て い ます。
ここ で 重要 なのは、 プログラム は 0 から 始まる という こと です。
Buffer[ 4] で 宣言 さ れ て いる ので、 各 要素 は Buffer[ 0] Buffer[ 1] Buffer[ 2] Buffer[ 3] となり ます。
Buffer[ 4] と いう と 5 個 目 の 要素 となり ます ので、 これ を 指定 する エラー になり ます。
最初 の うち は 間違え やすい ので 注意 し て ください。
なお Buffer[] と 宣言 し ても、 後 から 配列 の サイズ を 修正、 変更 する よう な 処理 も できる の です が、使い ませ ん。

投稿2弾目
インディケータ プログラム の 構造
基本 的 に インディケータ プログラム の 中身 は

・property 部分
・OnInit 関数 ・OnCalculate 関数
・OnDeinit 関数( 必要 に 応じ て)

と なっ て い ます。
property 部分
property 部分 は いま 説明 し た とおり なので 省略 し ます。

OnInit 関数
OnInit 関数 など On ● ● という 関数 は イベント ハンドラ という 特別 な 関数 で、 OnInit、 OnCalculate、
OnDeinit の 他 にも いくつ か あり ます が、 本書 では この 3 つ だけを 使い ます。
OnInit 関数 では インディケータ の 初期設定 を 行い ます。
テクニカル 指標 を 描画 する 配列 の インデックスを つけ たり 性質 を 設定 し たり、
また インディケータ の 表示 名 など インディケータ が チャート に 適用 さ れ た とき に 必要 な 処理 を 書き ます。

OnCalculate 関数 インディケータ の 動き の メイン 部分 です。 OnCalculate 関数 は 価格 が 動く たび に 呼び出さ れる 関数 です。

チャート には 無数 の バー( ロウソク 足) が 表示 さ れ て い ます。
インディケータ が 適用 さ れ た 直後 は 全て の バー に対して 計算 を し なけれ ば なり ませ ん が、
過去 の バー は 価格 が 変化 し ない ので、 一度 だけ 計算 すれ ば いい の です。
逆 に、 最新 の バー は 刻一刻 変化 し ます ので、 その 度 に 計算 が 必要 となり ます。
その 区別 など 細かい 配慮 が 必要 となり ます。

OnDeinit 関数 インディケータ が チャート から 削除 さ れ たり、
時間 足 を 変更 し た とき に 呼び出さ れる 関数 です。
MT 5 では ハンドル という もの を 使い ます が、 用 が 済ん だら 開放 し て メモリ から 除去 する 必要 が あり ます。
また、オブジェクト という もの を 作っ たら、 それ も 削除 を する 必要 が あり ます。
そういった 後始末 を 書く 関数 です。 OnDeinit が ない( 必要 ない) インディケータ も あり ます。

関数
イベント ハンドラ 以外 にも 関数 が いろいろ あり ます。
関数 という のは 型 関数( パラメータ); という 形 で 書か れ、 ある パラメータ を 入れる と ある 値 を 返す、
パラメータ の 中身 を 変更 する など 色々 な 働き がり ます。
システム が 標準 で 用意 し て くれ て いる 関数 の 他 に、 自分 で 関数 を 作る こと も でき ます。
自分 で 関数 を つくる こと なく、 用意 さ れ た 関数 を 使う に とどめ ます。
インディケータ なら ば それでも 十分 です。
自動 売買 プログラム で ある、 エキスパートアドバイザ を 作る とき は、 関数 を 自作 する よう になり ます ので、
その とき に 改めて 説明 し ます。

演算子 と 式 演算子 について は
https:// www. mql 5. com/ ja/ docs/ basis/ operations に 詳しく 説明 さ れ て い ます が、
使う のは その 中 の 一部 です。
算術 演算子 加減乗除 を 行う 演算子 です。
サイト から 引用 し ます。

変数 の 加算 i = j + 2;
変数 の 減算 i = j – 3;
符号 の 反転 x = – x;
変数 の 乗算 z = 3 * x;
除算 i = j / 5;
剰余 minutes = time % 60;
変数 に 1 を 加算 する i ++;
変数 に 1 を 加算 する ++ i;
変数 から 1 を 減算 する k–;
変数 から 1 を 減算 する –k;

特に 最後 の i ++、 k–などは 重要 です。
なお i ++、++ i は 厳密 には 違い ます が、 本書 では i ++ だけを 使う よう に 心がけ て い ます。

代入 演算子 これ も 引用 し ます。
y 変数 に x 値 を 代入 y = x;
y 変数 に x を 加算 y += x;
y 変数 から x を 減算 y -= x;
y 変数 に x を 乗算 y *= x;
y 変数 を x で 除算 y /= x;
y 変数 を x で 除算 し た 残り y %= x;

なお、今回 使わ ない もの は 省略 し まし た。
ここ で 注意 する のは y = x は y と X が 等しい という こと を 意味 する のでは なく、 y という 変数 に x という 値 を 代入 する という 意味 です。
代入 する ので 結果 同じ 値 に なる の です が。 y += x という のは、 y という 値 に x という 値 を プラス する という 意味 です。
たとえば y が 今 5、 x が 3 だ と する と、 5 という 値 に 3 という 値 を プラス する ので y は 8 に なる という こと です。

関係 の 演算子
これ も 引用 し ます

a と b が 等しけれ ば True a == b;
a と b が 等しく なけれ ば True a != b;
a が b より 小さけれ ば True a < b; a が b より 大きけれ ば True a > b;
a が b 以下 で あれ ば True a <= b; a が b 以上 で あれ ば True a >= b;

等しい という とき は「 ==」 を 使い ます ので 間違え ない よう に し ましょ う。

論理演算 子
&&かつ || または
y > 5 && y < 10 という 場合、 y は 5 より 大きく 10 より 小さい となり ます。
数学 では 5 < y < 10 という こと です が、 プログラム では 5 < y < 10 とは 書け ませ ん。
この よう に 書き ます。

演算子
ドキュメント では 演算子 と なっ て い ます が、 いわゆる for ループ や if 文 の こと です。
https:// www. mql 5. com/ ja/ docs/ basis/ operators
に たくさん の 例 が あり ます が、 3 つ だけ 使い ます。
if –else 文 条件 の 分岐 に つかい ます。
if( x > 20) {処理 A} x が 20 より 大きい 場合 処理 A を 行う。
それ 以外 は 何 も し ない。
if( x > 20) {処理 A} else {処理 B} x が 20 より 大きい 場合 処理 A を 行う。
それ 以外 は. 処理 B を 行う。
if( x > 20) {処理 A} else if (x < 20) {処理 B} else {処理 C} x が 20 より 大きい 場合 処理 A を 行う。
x が 20 より 小さい とい は 処理 B を 行う。 それ 以外 は 処理 C を 行う。 2 番 め と 3 番目 の 違い は わかり ます でしょ う か?
2 番 め は x == 20 の とき は 処理 B が 行わ れ ます。
一方 3 番目 は 処理 C が 行わ れる わけ です。

switch文

switch( x) {
case 1: 処理 A break;
case 2: 処理 B break;
default: 処理 C break; }

x が 1 の とき 処理 A を 行う。
x が 2 の とき は 処理 B を 行う。
それ 以外 の とき は 処理 C を 行う。
break; で 必ず 1 つ の 値 で 1 つ の 処理 を する よう に し て い ます。
もし、 switch 文 が 難しかっ たら if 文 で 書い ても 構い ませ ん。
上 の 処理 は if( x == 1) {処理 A} else if( x == 2) {処理 B} else {処理 C} と 同じ こと です。
for ループ 最後 は 繰り返し の 命令 の for ループ です。
while、 do-while ループ も あり ます が、for ループ だけをだけを 使い ます。

for( int i = 0; i < 20; i ++)
{処理 A}

i が 0 から 19 まで 処理 A を 繰り返す。
最初 に i の 初期 値 として 0 を 代入 し ます。
0 は 20 より 小さい ので 処理 A を 行い ます。
その後、 i ++ なので 1 を 加算 し ます。
すると i は 1 となり ます。
1 は 20 より 小さい ので、 再び 処理 A を 行い ます。
また i ++ なので 今度 は i は 2 となり ます。
以下 処理 A を 繰り返し i が 19 とき に 処理 A を 行っ て i ++ と する と、 i は 20 となり ます。
20 は 20 より 小さく ない ので、 処理 A を 行う 条件 では なくなり ます。
したがって for ループ が 終了 し ます。
for ループ の 中 の i の こと を ローカル 変数 と 言い ます。
ローカル 変数 は for ループ の 中、 あるいは 関数 の 中 など、 限ら れ た 範囲 で 用い られ ます。
たとえば OnCalculate で 宣言 さ れ た ローカル 変数 を OnDeinit で 使お う として も エラー となり ます。

外部 変数 は プログラム 全体 で 使う ので、 どこ にでて き ても いい よう に わかり やすい 名前 を つけ ます。
一方、 ローカル 変数 は この よう な 限定 的 な 使い方 なので、 i や h など 簡単 な 名前 を つける こと が あり ます。
もちろん、 ローカル 変数 にも しっかり と し た 名前 を つけ ても 構い ませ ん。
以上 の 知識 が あれ ば、 インディケータ を 書く には 困り ませ ん。
先 に 進ん で わから ない ところ が あっ たら、投稿や リファレンス を 見 て 確認 し て くださいね。

ブログランキング・にほんブログ村へ

コメント

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