縦線。 - ページ 4

 

インジケーターの複雑な仕組みはまだ勉強中で、質問もあります。OnInit()でインジケータバッファをリセットして いますが、なぜかインジケータコンパイル時にバッファがリセットされません。ロジックの場合、コンパイル後の各バッファにはフルセルが1つ ずつあるはずですが、写真ではたくさんあるのがわかります(これは前のバッファのセルだと思います)。どこでミスをするのか?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
ファイル:
 
Nauris Zukas:

インジケーターの複雑な仕組みはまだ勉強中で、質問もあります。OnInit()でインジケータバッファをリセットして いますが、なぜかインジケータコンパイル時にバッファがリセットされません。ロジックの場合、コンパイル後の各バッファにはフルセルが1つ ずつあるはずですが、写真ではたくさんあるのがわかります(これは前のバッファのセルだと思います)。どこでミスをするのか?

OnInitでは、インジケータ・バッファの 長さはゼロである。


だから、好き勝手なことができるのです。彼らにとっては、すべてが死に物狂いの作業に見えるのでしょう。

そして、コードの実行がOnCalculateに切り替わると、すぐにサイズがrates_totalと等しくなる。

であり、配列のすべてのセルに「ゴミ」が存在する。古い指標計算の残骸もあるかもしれません。

 
Alexey Viktorov:

OnInitでは、インジケータ・バッファの 長さは0である。


だからやりたい放題なんだよ、死語なんだよ。

そして、コードの実行がOnCalculateに渡ると、すぐにサイズがrates_totalと等しくなる。

で、配列のすべてのセルに「ゴミ」が入っている。昔のインジケーターの計算が残っているかもしれません。

ありがとうございました!全部取れたし、うまくいきました。こんな感じでやってました。

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

ありがとうございました!すべてうまくいきました。こんな感じでやりました。

なぜ変数に2回値を代入するのか?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

そして、「なぜ、そのすべてが必要なのか?結局のところ、ループ内のすべてのバーを通過することで、配列のすべてのセルがいずれにせよ何かで満たされなければならないのです。インジケータが現在の位置だけを表示するのでなければ、配列は 最初だけでなく、各バーで初期化さ れなければなりませんが......。

 
Alexey Viktorov:

なぜ変数に2回値を代入するのか?

グラフを使ったすべてのアクションがOnInit()で模倣されるのかどうか、例えばtaimfreimsを変更するのかどうか、よく分かりませんでした。taimfreimのリセットを変更(今確認)、でももしかしたら他にもあるかもしれないので、念のためOnInit()に2つ目を入れてみました。でも、そうでないなら、そこには置かない。
 
Alexey Viktorov:

そして、「なぜ、これだけのものが必要なのか?結局のところ,ループ内のすべてのバーを通過することで,配列のすべてのセルが何かで満たされる必要があるのです.インジケータが現在の位置だけを表示するのでなければ、配列は 最初だけでなく、各バーで初期化されなければ なりませんが......。

この例では、バッファをリセットする方法を理解したかっただけなのです。しかし、将来的には(今作っているインジケータでは)、前のセルを残すことと、新しいセルを追加することの両方が必要です。いわば、最初のテストです。

 
Nauris Zukas:
チャートに関するすべてのアクションがOnInit()で模倣されているかどうか、例えばtaimfreimsの変更など、確信が持てませんでした。taimfreimのリセットを変更(今確認)、でももしかしたら他にもあるかもしれないので、念のためOnInit()に2つ目を入れました。でも、そうでないなら、そこには置かない。

あーあ。そうですね、グローバルレベルの変数は、チャートの周期が変わっても 初期化されませんね。?と思うのですが...。は正確に覚えていない。

また、一般的には、余分なbool変数は必要ありません。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

そして、一般的には、この余分なbool変数はなくても大丈夫です。

はい、その通りです、さらに良いですね、ありがとうございます。

 

期間が30分以上の場合、なぜこのような奇妙な数値が返されるのか、教えてください。

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30)PERIOD: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERIOD: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERIOD: 16388
 
Nauris Zukas:

期間が30分以上だと、なぜこんな変な数字が返ってくるのか、教えてください。

MT5では、MT4と同様に期間の値は分数と一致しない