2013年3月31日日曜日

プログラム訂正 & RANGEツールの呼び出し方法

昨日公開しましたツールの一部不具合を修正しました。
更新版はこちらになります。

ダウンロード: Nonlag_hMA_with_Signal_DontUSE_0331.lzh

お手数おかけします!。


RANGEツールはex4のみの公開なので、これを使うとなるとそのまま利用するしかないので、他のプログラムからRANGEツールの値を利用する方法を説明します。

今回はプログラムの解説なので興味のある方のみとなりそうですが

MT4にiCUSTOMという関数があります。

これは他のインジケータの値を利用するケースで用いることができます。

iCUSTOMを使うのは

1.公開されているインジケータを簡単に利用する
2.MT4のデバッグ機能があまりにも貧弱なので、プログラムを小分けにして開発し、小分けの単位で動作確認を行い、最終的に1本にまとめる

という利点があるのではないかと考えています。

更に詳細事項になりますが、インジケータプログラムのバッファー変数が最大で8。という制限があり、昨日書いたように、エントリー関連のサインだけでも4つ取られてしまい、残り4つでどうするの?

というなにか非本質的な課題を解決することも役に立ちます。

欠点としては

1.パソコンの負荷が高くなる(まあこれは環境しだいで最近ではあまり気にする必要もないかも)
2.終値の利用に一工夫がいる
3.iCUSTOMで呼び出すインジケータがたくさんになると、何がなんだかわからなくなることがある(笑)

終値の判定ですが、インジケーターに限らず(EAも含むという意味で)プログラムが呼び出されるのは値動きがあった時ですので、呼び出された時がバーの終値かどうかは分かりません。

解決策は

A.呼び出すバーを1本前とする。 これだと確実に1本前の終値で計算された値が返ってきます。
ただし、これだとリアルタイムな値は取れません。

1本前を呼び出す処理と、現在のバー(リアルタイム)を呼び出す処理を2つ併記すれば両方を知ることができるわけですが、プログラム的にはあまりスマートではありません(こんな考え方を持っている人は意外と多いのではないかと思いますがどうなのでしょうか)。

B.バーの時間を見て新しいバーが形成されたのかを判定する

こちらはEAを作成するときにより神経質に考えることになる(はずの)ことなのですが

以前の記述が間違っておりましたので削除しております(すみません)。


さて本日の本題です

RANGEツールを呼び出すiCUSTOMの書式


double Range.Value=iCustom(NULL,0,"Nonlag_RANGE_MTF_2Signal",RANGE_MTF.T1,MTF,true,0,off);

double Range.AV =iCustom(NULL,0,"Nonlag_RANGE_MTF_2Signal",RANGE_MTF.T1,MTF,true,1,off);

double Range.MTF=iCustom(NULL,0,"Nonlag_RANGE_MTF_2Signal",RANGE_MTF.T1,MTF,true,2,off);

double Range.MTF.AV=iCustom(NULL,0,"Nonlag_RANGE_MTF_2Signal",RANGE_MTF.T1,MTF,true,3,off);


プログラムは4行なのですが、折り返し表示で4行以上に見えているかもしれません。途中改行はありませんのでご注意ください。

ここで説明が必要となるのは、呼び出しの変数として

RANGE_MTF.T1
MTF
true

の3つ(最後は定数ですが) と その後に 0,1,2,3という数字があります。

まず最初の3つは、RANGEツール側のextern 宣言されている変数を指定しています。

RANGE_MTF.T1は呼び出し側プログラムの変数なので名前はなんても良いですし、直接 20 というふうに整数を入れても大丈夫です。

これは RANGEツールの解説で書いている





















この順番に従っています。
従って、呼び出しは ”バー数”、”マルチタイムフレーム”、”マルチタイムを表示するか否か”ということを指定しています。

プログラム中ではこれを変数にしているのでわかりにくいですが、値としては

20,240,true と書いても同じです。(値は例ですので必要な値を指定してください)。


次の 0,1,2,3は

0:メインライン
1:同 平均
2.マルチタイムライン
3:同 平均

の値を指しています。これはRANGEツールの中での定義がそうなっているので、正しく指定する必要あります。
この数字は Setindexbuffer(0,RANGE.Value)のような定義文の最初の数字です。

double Range.Value=iCustom(NULL,0,"Nonlag_RANGE_MTF_2Signal",RANGE_MTF.T1,MTF,true,0,off);

という処理は
NULL : チャート上の通貨
0:時間軸も変更せず
"Nonlag_RANGE_MTF_2Signal.ex4"というプログラムに
パラメータ RANGE_MTF,MTF,trueで
indexbuffer 0 の
off足
の値を

Range.Valueというダブル型変数に入れる。

という意味です。 この処理を実行するときにはRANGE_MTF,MTF変数に必要な値を入れておくことが必要です。


長くなりました。

こんだけ長いとGoogle Bloggerだと読み辛いですね

いろいろと考えなければいけません。 勢いで始めたのでBloggerのことをなにも理解せず試行錯誤しています

しかし また寒い一日です。 桜が見るまもなく散ってしまいました。



0 件のコメント:

コメントを投稿

コメントありがとうございます。

すぐに返信できないことが多いかもしれませんが、よろしくお願いいたします。