プログラム入門 その3

ここでは、「プログラム入門 その3」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
前回、移動平均線をチャート上に表示させるインディケーターを作成しました。
今回は、移動平均線のクロスで売買シグナルを表示させるインディケーターを作成しようと思いますが
その前に、前回作成したのは4日間の単純移動平均線です。
移動平均の種類には単純移動平均(SMA)のほか、指数平滑移動平均(EMA) や加重移動平均(WMA)などあり
中には複雑な計算をするものもあります。これを一から作るのは少々骨の折れる作業です。



そこでメタトレーダーには組み込み関数として様々な指標が用意されています。
当然、移動平均の組み込み関数も用意されています。
今回は、この組み込み関数を使用して移動平均線のクロスで売買シグナルを表示させるインディケーターを作成しようと思います。

移動平均の組み込み関数はiMA()です。
詳しい使い方はiMA()を参照してください。

では、前回のプログラムをiMA()を使用して書き直してみましょう。


前回のプログラム

#property indicator_chart_window
#property indicator_buffers 1

//---- バッファー
double Buf0[];


//初期化
int init()
{
//---- バッファのインディケーターへの割り当て
SetIndexBuffer(0,Buf0);

//---- インディケーターの種類の設定
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, Red);

return(0);
}

//処理
int start()
{
int i, limit = Bars-IndicatorCounted();

for(i=limit-1; i>=0; i--)
{
Buf0[i] = (Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;
}

return(0);
}


書き直す所は、
Buf0[i] =(Close[i]+Close[i+1]+Close[i+2]+Close[i+3])/4;
赤字の部分です。
ここを
iMA(NULL,0,4,0,MODE_SMA,PRICE_CLOSE,i);
に変えるだけです。

上のパラメーター「,」で区切られている所を左から説明すると
表示させている通貨(NULL)表示させている時間枠(0)4本分の足(4)を使って、シフトは行わず(0)単純移動平均(MODE_SMA)終値(PRICE_CLOSE)で計算した時のi本目(i)の数値を取得する。

ということになります。これで、単純移動平均を指数平滑移動平均に変更したい時や10日移動平均に変更したいときはMODE_SMAを変更するだけで出来てしまいます。
しかし、変更する時いちいちプログラムを開いて書き直すのは手間がかかります。

そこで外部変数を使用して簡単に数値を変更できるように書き直してみます。
外部変数とはプログラム全体で使用する変数の事です。
int init(){}やint start(){}等の外で宣言すれば全て外部変数となります。
何処に入力してもいいのですが、プログラム内に変数の宣言が散らばると後で見返した時見づらくなりますので、#property の下辺りに入力します。
また、予約語のexternをつけて宣言すると、インディケータをアタッチする時やアタッチ後に、メタトレーダー のメニューの チャート → 表示中の分析ツール で該当するインディケーターを選択して、編集 ボタンを押すと現れるウインドウ上の Input タブに表示されるようになります。
extern int MA_Period=4;
先ほどのiMAの部分をiMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_CLOSE,i);のように変更します。
以上で、簡単に期間を変更できる移動平均線のインディケーターが出来ました。

では、異なる期間の移動平均線を表示するプログラムを入力していきます。
表示させたい移動平均線の数は2本ですので、必要なバッファーは2つです。
また、簡単に期間を変更できるように変数も2つ宣言します。

期間の異なる移動平均線のプログラム

#property indicator_chart_window
#property indicator_buffers 2

//---- バッファー
double Fa_Buf[];
double Sl_Buf[];

//---- 期間の変数
extern int Fa_Period=10;
extern int Sl_Period=20;

//初期化
int init()
{
//---- バッファのインディケーターへの割り当て
SetIndexBuffer(0,Fa_Buf);
SetIndexBuffer(1,Sl_Buf);

//---- インディケーターの種類の設定
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, Red);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1, Blue);

return(0);
}

//処理
int start()
{
int i, limit = Bars-IndicatorCounted();

for(i=limit-1; i>=0; i--)
{
Fa_Buf[i] = iMA(NULL,0,Fa_Period,0,MODE_SMA,PRICE_CLOSE,i);
Sl_Buf[i] = iMA(NULL,0,Sl_Period,0,MODE_SMA,PRICE_CLOSE,i);
}

return(0);
}


後は、クロスした時に表示させるシグナル用のバッファーを2つと、
クロスしたことを判定する為のプログラムを足せば完成です。
長くなりましたので、その辺りは次回説明いたします。
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://fxsk.blog105.fc2.com/tb.php/76-80671aa0
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。