プログラム入門その4

ここでは、「プログラム入門その4」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
前回期間の異なる移動平均線を表示するインディケーターを作成しました。
今回は、クロスしたことを判断し、シグナルを出すインディケーターを作成します。


では前回のプログラムです。

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

#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);
}



このプログラムに、シグナルを表示させる為のバッファーを付け足します。
買い(Buy)を表示するシグナル(上矢印)と売り(Sell)を表示するシグナル(下矢印)を入力していきます。

まずは
#property indicator_buffers 2
の部分です。バッファーを2個足す為、全部で4個必要になりますので
#property indicator_buffers 4
にします。

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

の部分に、今回の上下矢印のバッファーを足します。
//---- バッファー
double Fa_Buf[];
double Sl_Buf[];
double Buy_Buf[];
double Sell_Buf[];


最後に、フバッファーを割り当てて、種類を設定します。
//---- バッファのインディケーターへの割り当て
SetIndexBuffer(0,Fa_Buf);
SetIndexBuffer(1,Sl_Buf);

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

ここに
//---- バッファのインディケーターへの割り当て
SetIndexBuffer(0,Fa_Buf);
SetIndexBuffer(1,Sl_Buf);
  SetIndexBuffer(2,Buy_Buf);
  SetIndexBuffer(3,Sell_Buf);

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

SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 1, Blue);
SetIndexArrow(2,233);
SetIndexEmptyValue(2,0);

SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 1, Red);
SetIndexArrow(3,234);
SetIndexEmptyValue(3,0);

前回は、SetIndexStyleでDRAW_LINE(線)を指定しましたが今回はDRAW_ARROWを指定しています。
そしてSetIndexArrow233・234を指定しています。
これはWingdings という絵文字フォントの番号です。
最後にSetIndexEmptyValue(2,0)でバッファーの値をにしています。
これで、表示するシグナルの設定は終わりです。

次に、クロスしたことを判断するプログラムを作ります。
買いシグナルを表示するプログラムです。

買いシグナルを表示する

if(Fa_Buf[i+1] <= Sl_Buf[i+1] && Fa_Buf[i] > Sl_Buf[i])
{
Buy_Buf[i] = Low[i];
}

if()は「もし○○していたら△△を行う」という条件分岐をあらわします。
書き方は
if(○○)
{
△△
}

となり○○の部分に条件を書き△△の部分に条件を満たした時の処理を書きます。
では、今回の条件を整理してみます。
「異なる期間の移動平均線がクロスしたらシグナルを出す」ですが
このままでは、数式に表すことが出来ません。
クロスするとは数式で表すとどうなるでしょうか?
下の図は速い移動平均線(Fa_Buf)が遅い移動平均線(Sl_Buf)を下から上にクロスしている図です。
ICOPY05.gif

いわゆる、ゴールデンクロスを表しています。
○で囲んでいる部分がクロスしたところです。
クロスするということは、速い移動平均線(Fa_Buf)が遅い移動平均線(Sl_Buf)より上にある状態です。
つまりi本目のバーで速い移動平均線(Fa_Buf[i])>=遅い移動平均線(Sl_Buf[i])ということになります。
しかしこのままでは、クロスした後も常にこの状態になってしまいます。
そこで、クロスする前の状態を見てみましょう。
速い移動平均線(Fa_Buf)が遅い移動平均線(Sl_Buf)より下にあります。
つまりi本目の1本前のバーでは速い移動平均線(Fa_Buf[i])<遅い移動平均線(Sl_Buf[i])の状態になっています。
この2つの条件を満たした時にシグナルを表示すればいいのです。
2つの条件を同時に満たす時は「&&」「and」を使用します。
また、どちらかの条件を満たす時は「||」を使用します。これは「or」を表しています。
売りシグナルの時は不等号逆にします。
if(Fa_Buf[i+1] >= Sl_Buf[i+1] && Fa_Buf[i] < Sl_Buf[i])
{
Sell_Buf[i] = Hight[i];
}
また、シグナルを表示する場所に高値と安値を指定しています。

if分は、条件・処理が1行づつで書ける場合、まとめて1行で書くことが出来ます。
if(Fa_Buf[i+1] <= Sl_Buf[i+1] && Fa_Buf[i] > Sl_Buf[i])Buy_Buf[i] = Low[i];
if(Fa_Buf[i+1] >= Sl_Buf[i+1] && Fa_Buf[i] < Sl_Buf[i])Sell_Buf[i] = Hight[i];

今回のプログラムです。

期間の異なる移動平均線ので売買シグナルを表示するプログラム

#property indicator_chart_window
#property indicator_buffers 4

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

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

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

//---- インディケーターの種類の設定
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, Red);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1, Blue);
SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 1, Blue);
SetIndexArrow(2,233);
SetIndexEmptyValue(2,0);
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 1, Red);
SetIndexArrow(3,234);
SetIndexEmptyValue(3,0);
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);

if(Fa_Buf[i+1] <= Sl_Buf[i+1] && Fa_Buf[i] > Sl_Buf[i]) Buy_Buf[i] = Low[i];
if(Fa_Buf[i+1] >= Sl_Buf[i+1] && Fa_Buf[i] < Sl_Buf[i]) Sell_Buf[i] = High[i];
}

return(0);
}


次回はこのシグナルを利用して自動売買を行うプログラムです。
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://fxsk.blog105.fc2.com/tb.php/78-45e0ec15
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。