EAラボラトリーフォーラム::FXシステムトレード情報満載のコミュニティサイト
http://forum.ea-labo.com/

配列へ代入する
http://forum.ea-labo.com/viewtopic.php?f=3&t=1641
ページ 11

作成者:  tractor [ 2010年12月28日(火) 12:34 ]
記事の件名:  配列へ代入する

初めて投稿します。よろしくお願いします。

MACDとその9日EMAの乖離だけを表示させようと考えています。
コードは下のように記述しています。

指標バッファの配列ではない、ただ単の配列vMACD[]にMACDの値を挿入しようとしたのですが、できませんでした。指標バッファに指定すると、できます。

コード:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen

//指標バッファ
double BufJudge[];

//パラメーター
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalEMA = 9;

//+------------------------------------------------------------------+
//| 初期化関数                                                       |
//+------------------------------------------------------------------+
int init()
{
   //指標バッファの割り当て
   SetIndexBuffer(0,BufJudge);

   //指標スタイルの設定
   SetIndexStyle(0,DRAW_HISTOGRAM, STYLE_SOLID, 3);

   return(0);
}

//+------------------------------------------------------------------+
//| 指標処理関数                                                     |
//+------------------------------------------------------------------+
int start()
{
   double vMACD[];
   double vSignal;
   
   int limit = Bars-IndicatorCounted();
   
   for(int i=limit-1; i>=0; i--)
   {
      if(i == Bars-1) {
         vMACD[i] = 0;
      } else {
         vMACD[i] = iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)
                   -iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); //MACDの計算
      }
   }
   
   if(limit == Bars) limit -= SignalEMA-1;
   for(i=limit-1; i>=0; i--)
   {
      vSignal = iMAOnArray(vMACD,0,SignalEMA,0,MODE_EMA,i); //シグナルの計算
      BufJudge[i] = vMACD[i] - vSignal;
   }

   return(0);
}
//+------------------------------------------------------------------+



配列の宣言をするときに、vMACD[100]というように数値を指定するとその数の分はうまくいきます。またvMACD[Bars]とするとコンパイルエラーとなります。

何か間違いか勘違いをしているような気がするのですが、先週からここでストップし頓挫しています。

どこが間違いか指摘していただけると、うれしいです。

作成者:  Brian [ 2011年1月12日(水) 00:51 ]
記事の件名:  Re: 配列へ代入する

tractor様

ざっくり読みですいません。
指標バッファにすると成功すると言うことですし、
見た感じ、特別な処理をしていないので、
時系列配列と、通常の配列の違いに依る物だと思います。

指標の配列は、自動的に時系列配列になります。
また、時系列配列は小さい物ほど新しくなり、
かつ、新しいバーが生成されると、自動的に値がシフトします。

インジケータの計算に用いるならば素直に指標バッファにした方が楽です。
SetIndexStyleにて、(チャートの背景が黒ならば)CLR_NONEに指定して、
表示させない。(正確には背景色と同じにして見えなくする)
という方法が良いかと思います。

詳しくはfai様が良い記事を書いてくださってます。
また、指標バッファにせずに、同じ事を実現させるコードも書いてくださっています。
一度読んでおくと良いと思います。

http://d.hatena.ne.jp/fai_fx/20101125
http://d.hatena.ne.jp/fai_fx/20090825/1251126096

作成者:  tractor [ 2011年1月14日(金) 18:38 ]
記事の件名:  Re: 配列へ代入する

Brian 様

ありがとうございます。おかげ様で解決することができました。
時系列配列と通常の配列の違いということで、その認識がなかったことに原因がありました。
リンク先の記事にも書かれていましたが「初心者が必ず引っ掛かる問題」まさにそうでした。
通常配列を時系列配列に設定して、以下のようなコードにしてみました。

コード:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen

//指標バッファ
double BufJudge[];

//パラメーター
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalEMA = 9;

//+------------------------------------------------------------------+
//| 初期化関数                                                       |
//+------------------------------------------------------------------+
int init()
{
   //指標バッファの割り当て
   SetIndexBuffer(0,BufJudge);

   //指標スタイルの設定
   SetIndexStyle(0,DRAW_HISTOGRAM, STYLE_SOLID, 3);

   return(0);
}

//+------------------------------------------------------------------+
//| 指標処理関数                                                     |
//+------------------------------------------------------------------+
int start()
{
   double vMACD[];
   double vSignal[];
   
   ArrayResize(vMACD,Bars);
   ArrayResize(vSignal,Bars);
   
   ArraySetAsSeries(vMACD,true);
   ArraySetAsSeries(vSignal,true);
   
   int limit = Bars-IndicatorCounted();
   
   for(int i=limit-1; i>=0; i--)
   {
      if(i == Bars-1) {
         vMACD[i] = 0;
      } else {
         vMACD[i] = iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)
                   -iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); //MACDの計算
      }
   }
   
   if(limit == Bars) limit -= SignalEMA-1;
   for(i=limit-1; i>=0; i--)
   {
      vSignal[i] = iMAOnArray(vMACD,0,SignalEMA,0,MODE_EMA,i); //シグナルの計算
      BufJudge[i] = vMACD[i] - vSignal[i];
   }

   return(0);
}
//+------------------------------------------------------------------+



一つ山を越えることができて、ほっとしています。
ありがとうござました。

作成者:  Brian [ 2011年1月14日(金) 23:38 ]
記事の件名:  Re: 配列へ代入する

tractor様

おめでとうございます。
バグとかで悩んでたのが解決した時ってうれしいですよね。

もっと早く書き込めればよかったんですが。。orz
fai様のブログは本当に色々詳しく検証してあって、もはや私の聖典です^^

googleの "site:"検索を活用して、私も相当悩み解決してもらいました。

作成者:  tractor [ 2011年1月16日(日) 12:42 ]
記事の件名:  Re: 配列へ代入する

Brian 様

ありがとうございます。本当にうれしかったです。
こちらこそ、返事が遅くなってしまってすいません。
fai様のブログ、検索、の件も重ねてありがとうございます。
これからも活用させていただきます。m(  )m

ページ 11 All times are UTC + 9 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/