EAラボラトリーフォーラム::FXシステムトレード情報満載のコミュニティサイト

ユーザー登録    ログイン    フォーラム    検索    FAQ

掲示板トップ » Engineer


フォーラムルール


営利目的の書き込みは禁止です。ツールやEAなどの添付はここでは禁止です。(専用のフォーラムを用意してあります) あくまでも交流を目的としたフォーラムであることを忘れずに。



新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
 記事の件名: 配列へ代入する
 投稿記事 Posted: 2010年12月28日(火) 12:34 
オフライン

登録日時: 2010年12月27日(月) 21:36
記事: 4
初めて投稿します。よろしくお願いします。

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]とするとコンパイルエラーとなります。

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

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


ページトップ 
 プロフィール  
 
 記事の件名: Re: 配列へ代入する
 投稿記事 Posted: 2011年1月12日(水) 00:51 
オフライン
Hランク
Hランク

登録日時: 2010年5月28日(金) 01:17
記事: 72
tractor様

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

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

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

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

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


ページトップ 
 プロフィール  
 
 記事の件名: Re: 配列へ代入する
 投稿記事 Posted: 2011年1月14日(金) 18:38 
オフライン

登録日時: 2010年12月27日(月) 21:36
記事: 4
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);
}
//+------------------------------------------------------------------+



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


ページトップ 
 プロフィール  
 
 記事の件名: Re: 配列へ代入する
 投稿記事 Posted: 2011年1月14日(金) 23:38 
オフライン
Hランク
Hランク

登録日時: 2010年5月28日(金) 01:17
記事: 72
tractor様

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

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

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


ページトップ 
 プロフィール  
 
 記事の件名: Re: 配列へ代入する
 投稿記事 Posted: 2011年1月16日(日) 12:42 
オフライン

登録日時: 2010年12月27日(月) 21:36
記事: 4
Brian 様

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


ページトップ 
 プロフィール  
 
期間内表示:  ソート  
 
新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 

掲示板トップ » Engineer


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]

 
 

 
トピック投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  

Protected by Anti-Spam ACP
cron
Japanese translation principally by ocean