エラー、バグ、質問 - ページ 570

 

プログラムプロパティ(#property)を参照してください。

tester_indicator

string

Имя пользовательского индикатора в формате "имя_индикатора.ex5". Необходимые для тестирования индикаторы определяются автоматически из вызова функций iCustom(), если соответствующий параметр задан константной строкой. Для остальных случаев (использование функции IndicatorCreate() или использование неконстантной строки в параметре, задающем имя индикатора) необходимо данное свойство

tester_file

string

Имя файла для тестера с указанием расширения, заключенное в двойные кавычки (как константная строка). Указанный файл будет передан тестеру в работу. Входные файлы для тестирования, если необходимы, должны указываться всегда

tester_library

string

Имя библиотеки с расширением, заключенное в двойные кавычки. Библиотека может быть как с расширением dll, так и с расширением ex5. Необходимые для тестирования библиотеки определяются автоматически. Однако, если какая-либо библиотека используется пользовательским индикатором, то необходимо использовать данное свойство

 
Rosh:

プログラムプロパティ(#property)を参照してください。


ありがとうございます。
 

XAUUSDデモ 口座のティックチャート(市場概要)には、常にリセットがかかっています。

また

詳細 "を開き、空欄にマウスを合わせる

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 
gumgum:

XAUUSDデモ 口座のティックチャート(市場概要)には、常にリセットがかかっています。

また

詳細 "を開き、空欄にマウスを合わせる

永久リセットの意味がよくわからないのですが。

どのようなOSで、どのような端末容量なのか?

 
Rosh:

学ぶ、それはドキュメントの書き込みで 言うために -テクニカル指標

これは、インディケータの最初の 起動時(初めて 新しいタイムフレームに切り替えた 時)には、インディケータ値はまだ計算されていないため、prev_calculated=0となることを意味します。このタイムフレームに戻ると 、ハンドルが生きているため、インジケータは再び作成されません。したがって、prev_calculated!=0となります。

お言葉に甘えようと思ったのですが、気が変わりました。外見上はほぼ「すべてが順調にいくとは限らない、例外もある」という結果でしたが......。しかし、このような例外がハンドルに関係しているのか、それとも他のヒケツなのか、まだ理解できていないのです。

"注意: OnCalculate関数がNULL値を返した場合、クライアント端末のDataWindowにインジケータ値は表示さ れません。「もし、私の頭の中にある結果をドキュメントと正しく関連付け、その結果を自分で解釈することができたなら、それはもっと悪いことです。インジケータの値が表示されないだけでなく、インジケータ全体が動作しなくなり、コマンドキューがフリーズして次のコマンドの処理を待つことができなくなります。実は、これまでの記事の中にも、このようなことが垣間見えるのです。

すでに述べたように、このコードには多くのCopy......ハンドルを伴わないもの(つまりCopyBufferを 除くすべて)。コピー結果≦0の場合、return(0)を取得し、その後「インジケータが動作しなく なった」と、インジケータが完全にマヒしてしまうのです。

最初の非描画とそれに伴う麻痺は、ターミナルのウィンドウレスモード(つまり週末かオフライン)で発生することを忘れないでほしい。誰も週末にインジケーターをデバッグしたり、不要なジェスチャーをしたり、タイムフレームを走ったり、最初の描画を人為的に(手動で)開始したりしたくないので、それを重要でないと考えてはいけません。また、デバッグだけではありません。

正直なところ、ご親切に提供していただいたリンクをドキュメントの例とリンクさせるほどの気概はありませんでしたが、そこにはすでにあるハンドルへの参照カウンターを増やすことについて書かれています(他の回答も同様です)。そこからはまったく伸びていないように思います。

コード内のプリセットタイムフレームがD1、端末内のカレントタイムフレームがD1、端末がオフラインモードという条件で、添付のコードを再現してみてください。指定したカレントタイムフレームのチャートにインジケータを装着すると、ロギング結果が即座に「エキスパート」タブに表示されます。

ここで端末を完全にアンロードして再起動し、D1 以外の時間軸に切り替えてください。インジケータを置く - 他の(必ずしもD1 ではない)タイムフレームに切り替えるまで、それは変更されません。

この不快な機能のために、良いアイデアは、アンダーライティングの指標と一緒に消えてしまう。

しかし、TFのマスターフレームで定義されたデータは、そのタイムフレームにいるときは完璧に表示されるが、別のタイムフレームにいるときは、不必要な動きをしなければならないのは不公平である。外部指標のハンドル使用時のタイムフレームの平等性には賛成、他のTFには罪はない。

追伸:では・・・。待ってください。もう一度確認したところ、CopyHighは この麻痺にさえ影響を与えないことが判明しました。今は全く理解できない。私の疑惑は、突然OnInitの ハンドルに向けられた...。

追伸:2つ目のコード例を追加しました - これでも反応しません。

ファイル:
paralich.mq5  3 kb
paralich2.mq5  2 kb
 

問題の境界を発見した。

コメントする

   SetIndexBuffer(0,FractalUpBuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ArrowShift);

- を実行すれば問題は解決しますが、その場合、SetIndexBufferによる バッファバインディングが時折不正確になることが明らかになります。そしてそれはすでに SetIndexBufferの 使用を断念 し、監視するバッファーのサイズを手動で操作 する必要 性を指し示しています。

さらに、添付された例は、明らかに、BarsCalculated(handle )が、 あらかじめ設定されたものと一致しない限り、 現在のTFで呼び出された指標の値を時間内に計算 できない こと、 または、原則として、最初の時点で何も計算しようとしない こと (おそらくこの変形版)を示して います。 この場合、値は<0となり、return(0)して結果的に停止します。

ファイル:
 
alexvd:

パーマネントリセットの意味がよくわからない。

どのOSで、どの端末ビット?

W7とMT5 64bit。

の例です。

XAUUSDは常に最初にリセットされます(XAGUSDは比較です)

 
x100intraday:

問題の境界を求める。

コメントする

- を実行すれば問題はなくなりますが、その場合、SetIndexBufferによる バッファバインディングが時折正しく行われないことが明らかになります。そしてそれはすでに SetIndexBufferの 使用を断念 し、監視するバッファーのサイズを手動で操作 する必要 性を指し示しています。

さらに、添付の例は、BarsCalculated(handle)が、あらかじめ設定されたものと一致しない限り、現在のTFで呼び出された指標の値を時間内に計算することができないことを明らかに示しています。この場合、値は<0となり、return(0)して結果的に停止します。

最初の例では(2番目は見ていない)、パラリッチ・インディケーターは、関数

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &up_arrows[],datetime &up_times[],int ind_handle,int amount)
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_D1,0,amount,up_times);

   return(true);
  }

そこで、あなたのインジケータがD1にあり、H1タイムフレームからそのインジケータバッファにデータをコピーしようとすると想像してください。要素数は一致しません。データをコピーする前のチェックがない、ここが問題なのだと思います。

他の時間軸からデータを取得する指標の例は、各テクニカル指標のヘルプに記載されています。例えば、https://www.mql5.com/ru/docs/indicators/iama。

//--- узнаем количество рассчитанных значений в индикаторе
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",calculated,GetLastError());
      return(0);
     }
//--- если это первый запуск вычислений нашего индикатора или изменилось количество значений в индикаторе iAMA
//--- или если необходимо рассчитать индикатор для двух или более баров (значит что-то изменилось в истории)
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- если массив iAMABuffer больше, чем значений в индикаторе iAMA на паре symbol/period, то копируем не все 
      //--- в противном случае копировать будем меньше, чем размер индикаторных буферов
      if(calculated>rates_total) values_to_copy=rates_total;
      else                       values_to_copy=calculated;
     }
   else
     {
      //--- значит наш индикатор рассчитывается не в первый раз и с момента последнего вызова OnCalculate())
      //--- для расчета добавилось не более одного бара
      values_to_copy=(rates_total-prev_calculated)+1;
     }
Документация по MQL5: Технические индикаторы / iAMA
Документация по MQL5: Технические индикаторы / iAMA
  • www.mql5.com
Технические индикаторы / iAMA - Документация по MQL5
 
x100intraday:

コード内のプリセットタイムフレームがD1、端末内のカレントタイムフレームがD1、端末がオフラインモードという条件で添付コードを再現してみてください。指定したカレントタイムフレームのチャートにインジケータを装着すると、ロギング 結果が即座に「エキスパート」タブに表示されます。

また、一般的に、大量のメッセージを受け取らないようにするために、ログの代わりにデバッグを使用してみましたか?MetaEditorのヘルププログラム開発デバッグ
 
Rosh:

そこで、あなたのインジケータがD1にあり、H1タイムフレームからそのインジケータバッファに データをコピーしようとしていることを想像してみてください。要素数は一致しません。データをコピーする前のチェックがない、ここが問題なのだと思います。

まず最初にはっきりさせておきたいのは、Copy...-関数で 値をコピーしたときに配列がオーバーフローするケースは、クライアント端末のExpertsで「Array out of range」という オーバーフローエラーが発生しないのでしょうか?このようなメッセージは、コンパイルに成功した後、インジケータが動作しているときに発生することがあると記憶していますが、正確なことはわかりません。Copy...-関数 上ではなく、存在しないインデックスへの参照とか、そういうことだと思います。

次に、「チェックがない」という仮説は、かなり間違っていることをお断りしておきます。これは、if-else-filterが正しく生成されていないことのみを示し、完全に生成されていないことについては示しません。十数回、躓いたことがある。最近、ここや "Dummies "で、現在とは異なるタイムフレームのrates_totalの アナログについて質問したのですが、どなたからも回答がありません。なぜなら、私は多くの他のタイムフレームを扱っており、もしプリセットのタイムフレームを使うことがあれば、rates_totalの 代わりにuniversalcalculated=BarsCalculated(handle)を使って計算を行うからです。もしかしたら大きな勘違いをしているのかもしれませんが、この作業にrates_totalの 有用性は見出せません。

3つ目は、高いTFにいると、低いTFの値をうまくコピーして再分配 できる、またその逆もできるということを昔から実現できていることです。数日前にあげた例は、最小限のものですが、網羅的に、すべてあります。異なる2つのTFの数量の差は、不足と供給過多の2つのタイプに分けられる。最初のケースはひどくはないのですが、2番目のケースはオーバーフローをチェックして、何かあれば制限するようにします。しかし、他の時間枠からコピーしたバーが現在の時間枠のバーの数よりも小さい場合にも失速してしまいます。

第四に、このインディケータはすでに一週間ほど焼き付けられ検証されていますが、(コンパイル時、運用時ともに)明らかなエラーは見られず、いくつかの暗黙の問題があるのみです。その一つは、特定のTFで最初にバーが描かれないこと、M 1に切り替えると計算時間が急激に長くなる(初回はすべて2~3秒以内に計算される)ことです。インジケータが計算で詰まるようです(雪崩式メモリリーク?CopyBuffer- を使ってコピーする要素の数を履歴全体ではなく200に制限しましたが、状況は変わりません。M1や 他の場所では、オフラインでは常に計算が速いのですが、オンラインでは初めて状況が劇的に変化しました(おそらく、問題はまさにそのフィルターにあり、毎ティックで何かをスキップします。)小さな、しかし不快な問題:マウスホイールでチャートをスクロールしようとすると、すべてのフラクタルが非物質化され、それらが再計算されて描画されるまで待たなければなりません(新しいバーは届いていないため、再計算するものはないようです)。