スポンサーサイト





上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

タグ :

Return to page top

  • Comments (Close): -
  • TrackBack (Close): -

移動平均線の描画 (2)





移動平均線の描画 (1) の続きです。


init()関数における処理


init()関数は、プログラムの始まりだけに呼び出される特殊関数(初期化関数)です。これまではinit()関数における処理はありませんでしたが、移動平均線を描画するプログラムで初めて勉強します。

int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
//----
return(0);
}


ここでの処理は、SetIndexStyle()関数とSetIndexBuffer()関数の2つです。

SetIndexStyle()関数


SetIndexStyle()関数の書式 :

void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)

引数は5つありますが、実際のコードでは後ろの3つは省略されています。

この関数は、インジケータのスタイルを細かく指定することができます。

int index : 項目番号、つまり何本目の移動平均線か指定します。0から7の整数が入ります(1から8ではありません)。今回は2本描画しているので、0と1が指定されています。

int type : 図形のタイプを指定します。

タイプ説明
DRAW_LINE線を描画
DRAW_SECTIONセクションを描画
DRAW_HISTOGRAMヒストグラム(棒グラフ)を描画
DRAW_ARROW矢印(記号)を描画
DRAW_ZIGZAG奇数と偶数のインディケーター バッファ間のセクションを描画
DRAW_NONE描画しない


それぞれのスタイルが具体的に気になる方は、実際にコードを書き換えて試してみましょう。ただし、移動平均線になじまないスタイルはうまく描画されません。

初期設定値は、DRAW_LINEになります。つまり、今回の場合は、SetIndexStyle()関数は書いても書かなくても同じです。

int style=EMPTY : 線のスタイルを指定します。

スタイル説明
STYLE_SOLID実線
STYLE_DASHダッシュ
STYLE_DOTドット(点線)
STYLE_DASHDOTダッシュとドットの繰り返し
STYLE_DASHDOTDOTダッシュと 2つのドットの繰り返し


初期設定値はSTYLE_SOLIDになり、線の太さが1のときのみ設定できます。

EMPTY 値は、すでに設定済みの値を変更しないことを意味します。

int width=EMPTY : 線の太さです。1から5までの範囲で指定します。初期設定値は1です。

color clr=CLR_NONE : 色です。初期設定値は黒になります。


SetIndexBuffer()関数


SetIndexBuffer()関数の書式:

bool SetIndexBuffer(int index, double array[ ])

引数は2つです。

この関数は、どのインジケータにどの配列を割り当てるか指定します。

int index : 項目番号。SetIndexStyle()関数の第1引数と同じです。

double array[ ] : 配列名。

プリプロセッサ命令部分では、
  #property indicator_buffers 2
で移動平均の値を格納する配列を2つ作ることを宣言し、
  double ExtMapBuffer1[];
  double ExtMapBuffer2[];
でそれらの配列をdouble型としました。

init()関数においては、1つ目の移動平均線(0)に配列 ExtMapBuffer1 を割り当て、2つ目の移動平均線(1)に配列 ExtMapBuffer2 を割り当てる処理をしています。


SetIndexStyle()関数やSetIndexBuffer()関数における処理はプログラム開始時に行えば足り、ティックごとに処理する必要はありません。なのでこれらの処理はstart()関数ではなくinit()関数で行うのです。


start()関数における処理


if(counted_bars<0) return(-1);

if文です。

counted_bars (計算済みのバー)は0以上の整数でなければおかしいはずです。これが負の数であるということはエラーが発生していることを示していて、これ以上処理を続行しても有害無益なのでプログラムを終了しますということです。

return に0以外の数値が入るとエラーとみなされプログラムが終了します。

int limit=Bars-counted_bars;
for(int i=limit-1; i>=0; i--) {
ExtMapBuffer1[i]=iMA(NULL,0,ExtParam1,0,MODE_SMA,PRICE_CLOSE,i);
ExtMapBuffer2[i]=iMA(NULL,0,ExtParam2,0,MODE_SMA,PRICE_CLOSE,i);

変数limitは、未計算のバーの数です。未計算のバーに対して、for文で繰り返し処理を行います。

未計算のバーすべてについて、iMA()関数で計算した移動平均の値を配列に格納します。

int i=limit-1; i>=0; i--

の部分ですが、整数型の変数 i の繰り返しのしかたを書いています。

int i=limit-1 : 未計算のバーが10本あるとすると、i は9から始まります。

i>=0 : i はi が0になるまで繰り返します。0とは最新のバーを意味します。

i-- : i の値は、9,8,7,…と、1ずつ減っていきます。

この部分については、

int i=0; i<limit; i++

という書き方も可能です。

int i=0 : i は0(最新のバー)から始まります。

i<limit : 未計算のバーが10本あるとすると、i はi が9になるまで繰り返します(0から始まるため)。

i++ : i の値は、0,1,2,…と、1ずつ増えていきます。

基本的に、書き方は違えど、やっていることは同じです。「基本的に」ともったいぶったのは、違いが出てくる場合もあるからです。



以上まとめると、
  1. プリプロセッサ命令で基本設定、外部変数の導入、配列の宣言を行う。
  2. init()関数で初期設定と配列の割り当てを行う。
  3. start()関数で移動平均の計算結果を配列に格納する。
となります。

スポンサーサイト

タグ :

Return to page top

Comments:

Comment Form
Only inform the site author.

Trackback+Pingback:

TrackBack URL for this entry
http://metatradermania.blog24.fc2.com/tb.php/32-53f31f93
Listed below are links to weblogs that reference
from ど素人のMetaTrader入門
Bookmark
検索フォーム
RSSリンクの表示
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。