トレンドラインを書いてみる3

トレンドラインを書いてみる3

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

にほんブログ村 為替ブログ FX システムトレード派へ

さて、前回と前々回で、トレンドラインを書くプログラムの基本とプログラムを書くときに気をつけたほうがいいことを書きました。

 

今回は、トレンドラインの総仕上げとして、ループ回数を最小にして、好きな本数のトレンドラインを書くインジケータを作成します。

少々、難易度が上がりますが、がんばってついてきてください。

 

トレンドラインを書いてみるを参考にインジケータのスケルトンを作成してください。

前回のソースにそのまま上書きでもかまいません。

 

まず、前半の定義部分です。

#property indicator_chart_window
extern int nPeriod=9;
extern int Limit=350;
extern int nLine=3;

nLineを追加しました。

これは、トレンドラインの数です。

デフォルトでは、3本ずつ書きます。

 

初期化部分です。

int init()
{
    int i;
    for(i=0;i<nLine;i++)
    {
        ObjectCreate(”Trend DN-”+i,OBJ_TREND,0,0,0,0,0);
        ObjectSet(”Trend DN-”+i,OBJPROP_COLOR,Maroon);
        ObjectSet(”Trend DN-”+i,OBJPROP_WIDTH,3);

        ObjectCreate(”Trend UP-”+i,OBJ_TREND,0,0,0,0,0);
        ObjectSet(”Trend UP-”+i,OBJPROP_COLOR,Green);
        ObjectSet(”Trend UP-”+i,OBJPROP_WIDTH,3);
    }

   return(0);
}

 

オブジェクトの作成ですが、前回と違って指定した数だけ作る必要があるため、ループをまわして指定した数のトレンドラインを書くためのオブジェクトを作成します。

名前が、「Trend UP-0″」など固定でしたが、数にあわせて名前を変更したいので、「Trend UP-”+i」としてループの値を名前に追加するように変更しました。

また、線が細くて見にくかったので、今回は少し太く描画させて見ます。

ObjectSet(”Trend DN-”+i,OBJPROP_WIDTH,3);

の部分で、線の幅をデフォルトの1ポイントから3ポイントに広げます。

 

次は、終了処理です。

int deinit()
{
    int i;
    for(i=0;i<nLine;i++)
    {
        ObjectDelete(”Trend UP-”+i);
        ObjectDelete(”Trend DN-”+i);
    }
   return(0);
}

初期処理と同じく、指定された数分だけ削除するようにループしています。

 

次は、本題のメイン処理です。

int start()
{

//今回は、線の数が分からないので、配列を使います。
//まず、空の配列を用意します。
//固定で指定する場合は、double r[10];の様に数字を指定します。
    double r[];
    int rt[];
    double s[];
    int st[];

//配列に必要な入れ物を指定した数だけ用意します。
//はじめと終わりの入れ物が必要なので、実際の線の数より1つ多い数を指定します。
    ArrayResize(r,nLine+1);
    ArrayResize(rt,nLine+1);
    ArrayResize(s,nLine+1);
    ArrayResize(st,nLine+1);

    int nCurBar;
    int ChkRLine=0;
    int ChkSLine=0;

    if(Bars<Limit) Limit=Bars-nPeriod;

//前回とは逆に最新のものから指定本数までループをまわします。
    for(nCurBar=0; nCurBar<Limit; nCurBar++)
    {

//一番低い谷を見つけます。
        if(Low[nCurBar+(nPeriod-1)/2] == Low[iLowest(NULL,0,MODE_LOW,nPeriod,nCurBar)])
        {
//値が1つだけでは線を引けないので、配列に代入だけします。
            if(ChkSLine==0)
            {
                s[ChkSLine]=Low[nCurBar+(nPeriod-1)/2];
                st[ChkSLine]=nCurBar+(nPeriod-1)/2;
                ChkSLine++;
            }
//2本目の値で、1つ目の値より小さい場合描画します。
            else if(s[ChkSLine-1] < Low[nCurBar+(nPeriod-1)/2] && ChkSLine <= nLine)
            {
//値の代入を行い
                s[ChkSLine]=Low[nCurBar+(nPeriod-1)/2];
                st[ChkSLine]=nCurBar+(nPeriod-1)/2;
//描画させます。
                ObjectMove(”Trend DN-”+(ChkSLine-1),1,Time[st[ChkSLine-1]],s[ChkSLine-1]);
                ObjectMove(”Trend DN-”+(ChkSLine-1),0,Time[st[ChkSLine]],s[ChkSLine]);
//ラインを1つ進めます。
                ChkSLine++;
            }
//もし、1つ前より小さい値が見つかったときに値を入れ替えます。
            else if(s[ChkSLine-1] > Low[nCurBar+(nPeriod-1)/2] && ChkSLine <= nLine)
            {
                s[ChkSLine-1]=Low[nCurBar+(nPeriod-1)/2];
                st[ChkSLine-1]=nCurBar+(nPeriod-1)/2;
            }
        }


//谷と同様に山を見つけます。
        if(High[nCurBar+(nPeriod-1)/2] == High[iHighest(NULL,0,MODE_HIGH,nPeriod,nCurBar)])
        {
            if(ChkRLine==0)
            {
                r[ChkRLine]=High[nCurBar+(nPeriod-1)/2];
                rt[ChkRLine]=nCurBar+(nPeriod-1)/2;
                ChkRLine++;
            }
            else if(r[ChkRLine-1] > High[nCurBar+(nPeriod-1)/2] && ChkRLine <= nLine)
            {
                r[ChkRLine]=High[nCurBar+(nPeriod-1)/2];
                rt[ChkRLine]=nCurBar+(nPeriod-1)/2;
                ObjectMove(”Trend UP-”+(ChkRLine-1),1,Time[rt[ChkRLine-1]],r[ChkRLine-1]);
                ObjectMove(”Trend UP-”+(ChkRLine-1),0,Time[rt[ChkRLine]],r[ChkRLine]);
                ChkRLine++;
            }
            else if(r[ChkRLine-1] < High[nCurBar+(nPeriod-1)/2] && ChkRLine <= nLine)
            {
                r[ChkRLine-1]=High[nCurBar+(nPeriod-1)/2];
                rt[ChkRLine-1]=nCurBar+(nPeriod-1)/2;
            }
        }

//上昇・下降ともに指定本数見つかった場合、ループを抜けます。
        if(ChkSLine > nLine && ChkRLine > nLine)break;
    }

   return(0);
}

 

メイン処理は、ループの中に納まっていて、必要な本数が見つかった後、breakで抜けいていることが分かると思います。

必要な数だけ、ループをまわすようにして負荷を抑えています。

値は、配列に格納しています。

本当は、配列に代入しなくても描画だけなら可能です。

ですが、今後の拡張のために値を残しておくようにしました。

値を残しておくことで、いろいろ拡張できると思います。

 

値の格納も1つ目の変数への格納と、条件を満たした場合に次の配列へ格納すること、一度格納した配列より大きい・小さい値の場合入れ替える処理を追加してあります。

 

少々複雑になりましたが、コンパクトにまとまっていると思います。

 

今回のプログラムは、以下からダウンロードできます。

 

インジケータは、

インストールパス\MetaTrader\experts\indicators

に入れてください。

にほんブログ村 為替ブログ FX システムトレード派へ 人気ブログランキングへ

タグ

トラックバック&コメント

この記事のトラックバックURL:

トラックバック

  1. [...] めたぷろで紹介した「トレンドラインを書いてみる3」で作成したインジケーター。 [...]

    ピングバック投稿者: TrendLine_v2 複数のトレンドラインを自動的に引きます | MT4 めたぷろ ダウンロードセンター — 2009年05月16日


コメント

  1. [...] めたぷろで紹介した「トレンドラインを書いてみる3」で作成したインジケーター。 [...]


コメントを投稿する



この記事のコメントだけのRSSフィードを取得

Spam Protection by WP-SpamFree


かるく文法(省略記号編) »
« EAを作ってみる