事前計算された - ページ 3

 
Alexey Viktorov:

誤答する驚異の能力...。

では、もしもの時のために説明してください。

1.100本のバーを再計算し、0から99までのバッファに入力(方向を時系列で考えてみる)値1.03

2.突然、履歴が読み込まれ、prev_calculatedが0になりました。

インジケータのどのバーから1.03になるのか?

  1. 時系列と同じようにインデックスを計算するには、インジケータバッファの OnInit()でAS_SERIESフラグを設定する必要があります - だから私は「右端のバー」という概念を使うのが好きです - こうすれば誰も間違って情報を得ることはありません。
  2. これがその答えです。
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    prev_calculated=0 "の場合、インジケータ・バッファの全要素を "1.01 "で再初期化し、"return(rates_total); "で即終了します。つまり、インジケーターバッファに以前の「1.03」の値の痕跡が残らない。
 
Alexey Viktorov:

インジケーターが起動 したFIRST 時にゴミの捨て方を説明した方が良い

単純なことです。prev_calculatedのことは忘れて、「横の穴」のない複製を自分で作るのです。以前に計算したバーを追跡したい場合 - 例ではfxsaberの ように。
fxsaber
全く松葉づえではありません。それが私の やり方です。
単純なfirst run / no longer first runフラグで十分な場合は、prev_calculatedをstatic bool b_First_Runに置き換えます。または、バッファの初期化をOnInintに置くことができます。
 
Karputov Vladimir:
  1. 時系列のインデックスを考慮するには、インジケータバッファの OnInit()でAS_SERIESフラグを設定する必要があります - 私が「右端のバー」の使用を好む理由はそれです - 誰も間違って通知されないように。
  2. これがその答えです。
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    prev_calculated=0 "の場合、インジケータ・バッファの全要素を "1.01 "で再初期化し、"return(rates_total); "で即終了します。つまり、インジケーターバッファに以前の「1.03」の値の痕跡が残らない。

だから、これは解決すべき問題なのです。ゴミはいらないが(本当はいらないが、表示の邪魔になる)、インジケータの過去の計算を保存しておきたい。インジケータを初めて起動したとき、バッファがゴミのようになり、履歴を読み込むときにバッファに挿入されたすべてのものが保存されるはずです...。で、できればファイルやGVに保存しないでください。


を追加しました。

これは、1分ごとにリアルタイムでドローダウンを推定することを目的としています。Expert Advisorは1週間停止することなく動作し、週単位の表示の代わりに、インジケータがなくても見える最後の値だけが表示されます。

 
Alexander Puzanov:
単純な first run / no longer first run フラグで十分な場合は、prev_calculated を static b_First_Run に置き換えます。そして、バッファの初期化をOnInintに置くことができます。
いや、そこでの目的はそれほど原始的なものではありません。
 
fxsaber:
いや、そこでの目標は、それほど原始的なものではありません。
これはあなたの提案ではないのですが、Alexey Viktorovは、最初の起動時にバッファをゼロにするだけで、ページングの間は何も触れないと理解しています。
 
Alexey Viktorov:

だから、これは解決すべき問題なのです。ゴミはいらない(いらないけど表示の邪魔になる)けど、インジケーターの前の計算を保存しておきたいんです。インジケータを初めて起動したとき、バッファがゴミのようになり、履歴を読み込むときにバッファに挿入されたすべてのものが保存されるはずです...。で、できればファイルやGVに保存しないでください。


を追加しました。

これは、1分ごとのドローダウンをリアルタイムに推定することを目的としています。Expert Advisorは1週間停止せずに動作し、週単位の表示の代わりに最後の値だけが表示され、それはインジケータがなくても表示されます...。

О!今なら、もっと意味がある。夕方には返信します。
 
Alexander Puzanov:
これはあなたの提案ではない、Alexey Viktorov、私が理解するところでは、あなたが必要とするのは、最初の起動時にバッファをゼロにして、すべての種類のページングの間にそれらの中に何も触れないようにすること、これだけです。
もちろん、OnInit()でバッファを初期化することから始めたのですが、何かが間違っていました。 何を覚えているわけでもなく、OnCalculateでprev_calculated == 0で初期化しました。
 

OnInit()でバッファ配列が初期化 された場合の動作を再確認しました。

インジケータをチャートから 取り外し、新たに設定しても、すべてのバッファではなく、一部のバッファには古い値が残っています。以前と全く同じというわけでもないのですが、そのうちの1つの値が数本の小節にまたがっているのです。

 
Karputov Vladimir:
ああ!それなら納得です。今夜中に連絡します。
返信が遅くなり申し訳ございません。この時間軸の計算値は、ファイルに保存するしかありません。そのためには、同期が必要です。ファイルから読み込むときに、データをそのバー上に分散させる必要があります。最も論理的な方法は、バーのオープン 時間と同期させることですが、ニュアンスが異なる場合があります。例えば、バーのオープン時間(ファイルに保存)は2016.09.05. 25:02 でしたが、現在チャートには2016.09.05. 25:01 と同じ時間のバーが表示されています。
 
Karputov Vladimir:
返信が遅くなり申し訳ございません。ある時間枠の計算値を保存する唯一の方法は、ファイルに保存することです。ファイルから読み込むときに、データがそれぞれのバーに配置されるように、同期を取る必要があります。例えば、バーのオープン時間(ファイルに保存)が2016.09.05. 25:02 だった場合、チャート上に2016.09.05. 25:01と 同じ時間のバーが表示されます

あるいは、インジケータ・バッファの初期化の問題に開発者の注意を喚起した方が良いのでは?なぜMT4ではそのような問題がないのですか?もしかしたら、またもや完全な理解ではないのでしょうか?問題は、EACHでチャートからインジケータを取った後にバッファの初期化を必須にしても、全てのバッファにゴミが入っているわけではなく、そこからアンロードすることができないことです...。

個人的には、松葉杖は嫌いではありませんが、この松葉杖があまり複雑でなく、プラスの効果がある場合に限ります。しかし、ファイルに書き込んでから読むというのは、粗末な松葉づえだ。