新しいタイムフレームのチャートに変更すると、インジケータが消えてしまう。 - ページ 3

 

SDCさん、こんにちは。

私はそれを得た。ありがとうございます。

100barの場合、トータルレートは0から99までです。

最初は、pre_cal =0 --> limit=100 bar - 0 =100です。

for(int=1 to limit=100; I++)

で、I=100(インデックス値)となり、100というバーは存在しない。

そこで、最大値I=99にするために、limit-1 を入れています。

何か良い方法はないでしょうか。

また、他の多くのインジケーターでも同じ方法で、このような範囲外の 問題は発生しないので、混乱しています。

また、Expertタブをありがとうございました。

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

また、他の多くのインジケーターでも同じ方法で、このような範囲外の問題が発生しないので、混乱しています。



B600が範囲 外になる前は、 重大なエラー ではありませんでした
 
scfx:.

そのため、最大I=99にするために、limit -1を入れています。

何か良い方法はないでしょうか。

あなたのコードは、1本目からのチャート履歴をエラーなく描画しますが、新しいバーを描画しません。何をさせたいかによって、いろいろなコードの書き方があります。Metaeditorに含まれるインジケータを見て、MQコーダーがどのようにそれを行うかを見てください。彼らのコードを読み、各行の理由を理解することができれば、インジケータを作成する のに問題はないでしょう。

 

SDCになったよ。

個人的に言えば、ドキュメントを読んでも想像しにくいのですが。それでもなぜprev_calculated=Total_rates -1なのかがよくわからない。

ということで、ここに数値例を作ってみました。私のような初心者の助けになれば幸いです。

通常、我々は見ることができます。

Limit= rates_total- prev_calculated; //(no-1)となります。

または

for(i=1;i<limit;i++) or for(i=1;i<=limit;i++)

重要な のは、LIMIT >=1 にすることです。私の場合、LIMIT=0なので、新しいティックが入ってきてもインジケータはリフレシュされません。

なぜか、見てみましょう。(少なくとも私の場合はprev_calculatedが原因だと思います。)

チャート上に100本のバーがあるときにインジケータを取り付けたと仮定します。以下は変数の値です。

値の最初のテーブル
変数
Total_rates 100
バーのインデックス 0-99
prev_calculated 0
Limit 100
Loop i value 1-99

すべて順調です。値が最初に表示されるのは、バー1からチャートの最初までです。何小節目から計算されるのでしょうか? これは、私のミスにつながる重要なポイントであり、私は100%明確ではありません。

新しいバーが始まると、チャート上には現在101本のバーが表示されます。インジケータは既に終了したバー、つまりバー1には更新されません。

値の 2 番目のテーブル
変数
Total_rates 101
バーのインデックス 0-100
prev_calculated 99 OR 100 (下記参照)
Limit2 OR 1
ループ i 値 1to1 OR 1to0

1つ目の表から、インジケータは99バーを計算します(1から99までループするため)。
しかし、ドキュメントによると、「ただし、start()の最初の呼び出しでない場合は、Bars-1に等しい値が返されます)」と書かれています。
この1本の棒が違うだけで、トラブルが発生します。もしシステムがprev_calculatedとして100を返すとしたら。
prev_calculated=99であれば、ループは動作することがわかると思います。
しかし、prev_calculated = 100のように見えるので、ループはリミット=0または-1に依存するため動作しないでしょう。
この場合、prev_calculated= Bars-1の背後にあるロジックを見るのを助けることができる人はいますか?

だから解決策は非常に明確である:メイクfor(i=1; ___ここ1つは、1より大きいfor(<)または1より大きいか等しいfor(<=) ___; i +)をする必要があります。前回のコードでは、0に等しくなっています。

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

お役に立てれば幸いです。

SCFX

 

prev_calculated == rates_total

scfx:

SDCはもうわかったよ。

個人的には、ドキュメントを読んでもなかなか想像がつかないのですが。それでもなぜprev_calculated=Total_rates -1なのかはよくわかりません。

SCFX

新しいインディケータを作成し、start関数に このコードを入れて、1分足チャートに貼り付けて、ティックが到着したときのアラートを見ます。

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

rate_total は現在のバーの量です。

prev_calculatedは、前のティックにあったバーの量です。

 
SDC:

prev_calculated == rates_total

新しいインディケータを作成し、このコードをstart関数に入れ、1分足チャートに貼り付けて、ティックが到着したときのアラートを見ます。

rates_total は現在のバーの量です。

prev_calculatedは、前のティックにあったバーの量です。


wow それは奇妙だ。

以前貼ったリンクでは、もし:BUTがstart()の最初の呼び出しでなければ、Bars-1に等しい値が返されるとのことです。

どうしてBars(Rate_totals)が返されるのでしょうか。

 

そう言われているのは知っていますが、それは完全には正確ではありません。

実際に起こることは、次のとおりです。

rates_total == 現在のティックが到着したときのバーの総量 prev_calculated == 前のティックが到着したときのバーの総量。

チャート内のバー インジケーターの状態 レート-トータル 事前計算済み レートトータル-プレブカルキュレーテッド
1000 ロード時の初回実行 1000 0 1000
1000 次回の動作 1000 1000 0
1000 次のティック 1000 1000 0
1001 新しいバーの最初のティック 1001 1000 1
1001 次のティック 1001 1001 0
1001 次のティック 1001 1001 0

したがって、prev-calculatedとrates_totalの3つの主な状態があります。 インジケータがロードされ、バーの中間ティック、新しいバーの最初のティックです。

初回実行時は、インジケータがロードされてから前のティックがないため、prev_calculated == 0となります。

また、チャートが変更されたり、ヒストリーが追加されると、prev_calculatedは0にリセットされます。

OnCalculateの戻り値は使用しませんが、万が一修正された場合に備えて、デフォルトのreturn(rates_total)を使用するのがベストです。

 
チャートのバー インジケータ 状態 レート-トータル 事前計算済み レートトータル(事前計算値
1000 ロード時の初回実行 1000 0 1000
そして、バー1000は存在しません。

新しいドキュメントに書いて あることは知っています。もし彼らの方法でやるなら、prev_calculatedが 0でないかテストして、rates_total - prev_calculatedを 1つ下に調整する必要があります。これは、indicator_countedのデクリメントに 戻る混乱です。
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
See Seeインジケーターの進行状況を表示する - MQL4フォーラム
 

return( rates_total - 1 ) とする意味はなく、prev_calculated の値は、何を返すように言ったかにかかわらず、あたかも return(rates_total) であったかのようになります。

 
SDC: return( rates_total - 1 ) をする意味がない prev_calculated の値は、何を返すように言ったかに関係なく return(rates_total) であるかのようです。
サービスデスクに問題を 報告しましたか?