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

 
Mihail Matkovskij:

アレクセイ、このフォーラムで私の投稿をねじ曲げて、私の代わりに開発者にクレームをつけたように見せる以外にやることがないのか...?そんな妙な「意気込み」の理由は何だったんでしょうね。こんなところでくだらないことをするくらいなら、適切なスレッドで初心者の疑問を解決してあげてください......!(笑)。

それにしても、はっきりと「バグ」と書いていますね。これは、プラットフォームの欠陥が報告されていることを意味し、ドキュメントを論理的な結論まで読んでいないことを意味するものではありません。

 
Artyom Trishkin:

それにしても、はっきりと「バグ」と書いていますね。これは、プラットフォームの欠陥が報告されていることを意味し、ドキュメントを論理的に読んでいないことを意味するものではありません。

まあ、そうなんですけどね。ObjectDelete関数の 説明にある注意書きを読みましたが、それが問題だとは思いませんでした...。誰だってそうでしょう...

でも、堂々巡りなんですよね。正確には、書き間違えたとか、混ざったとか、ぐるぐる回っているのですが......。しかし、なぜか誰もこのバグの解決方法について一言も言わない...。もちろん、提案されたObjectsDeleteAll関数以外は、プロジェクト全体をやり直さなければなりませんが、これは一番避けたい ことです。

 
Mihail Matkovskij:

はい、混乱しました。ObjectDelete関 数の説明で注意書きを読みましたが、まさかそれが問題とは...。そうでない人は?

そんなこともあるんだ...。

 

Mihail Matkovskij:

...このバグの解決方法については、なぜか誰も一言も言ってくれない...。もちろん、提案されたObjectsDeleteAll関数を除けば、プロジェクト全体をやり直す 必要があり、それは最も避けたい ことです。

グラフィカルなオブジェクトの名前には接頭語を使うようにしてください。オブジェクトを識別するための通常の習慣です。プレフィックスを使ってゴミの有無を確認すると同時に、ゴミを取り除くことができます。

オブジェクト名にプレフィックスを追加すると プロジェクト 全体をやり直す必要があるのでは?

プロシージャルのスタイルで書かれているのですか?まあ、そこでオブジェクト名を作る機能を変えるのも、そう難しいことではないんですけどね。

 
Artyom Trishkin:

グラフィカルなオブジェクトの名前には接頭辞を付けるようにしましょう。オブジェクトを識別するのは普通のことです。プレフィックスを使ってゴミの有無を確認すると同時に、ゴミを取り除くことができます。

オブジェクト名にプレフィックスを追加すると、プロジェクト全体をやり直す必要があるのでは?

よし、他に選択肢がないならやってみるか。

アルチョム・トリシキン

プロシージャルのスタイルで書かれているのですか?オブジェクト名を作成する機能を変更するのは、それほど難しいことではありません。

シスプリ的な仕事?:)


Rashid Umarov 氏には、私のインジケーターのバグの原因を探っていただき、ありがとうございました。
 
Mihail Matkovskij:

アレクセイ、このフォーラムで私の投稿をねじ曲げて、私の代わりに開発者にクレームをつけたように見せる以外にやることはないのか...?このような奇妙な "熱意 "を持ったきっかけは何だったのでしょうか?こんなところでくだらないことをするくらいなら、しかるべきスレッドで初心者の質問を助けてあげてください......!

それが、私がお手伝いしたいことです。私はあなたを助け、あなたが間違っていることを説明しようとしているのです。グラフィカルオブジェクトを削除 する別のオプションを試してみると、すべてがうまくいくでしょう。そして、あなたが言っていたバグはすべて消えます。言葉を捻じ曲げる必要はないので、引用します。

 
Alexey Viktorov:

それが、私がお手伝いしたいことです。あなたが間違っていることを説明しているのです。グラフィックオブジェクトを削除する 別の方法を試してみると、すべてがうまくいくでしょう。そして、あなたが言っていたバグはすべて消えます。あなたの言葉を捻じ曲げる必要はありません、あなたが言ったのです、私はそれを引用しました。

あなたを助けようとすると同時に、根拠のない非難をする、付け加えることを忘れてはいけない。そんなマニアックな熱狂の原因は何かと聞いたのですが、なぜか答えてくれませんね~。なぜ答えから逃げるんだ、アレクセイ?

 
Mihail Matkovskij:

私はあなたを助けようとすると同時に、堂々とあなたを非難しているのです、付け加えることを忘れないでください。その熱狂ぶりは何なのか、と聞いたのですが、なぜか答えてくれませんね(笑)。なぜ答えないんだ、アレクセイ?

もっと前に黙っていれば、私は続けなかったのに。

ここでは、非難されることを覚悟で、私の率直な意見を述べたいと思います。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラムです。

間違い、バグ、質問

アレクセイ・ヴィクトロフ, 2020.07.11 17:12

ループがOnDeinitの実行に必要な時間より長く続くのはなぜですか?

結局のところ、あなたの例のすべてのオブジェクトは "トレンド "の接頭辞を持っている、なぜそれを使用し、ループを拒否しないのですか?

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );

その答えは?回答を読む
 
Alexey Viktorov:

あなたはずっと前に黙っていただろうし、私は続けなかっただろう。

А...それが、私への非難の理由なのだ!なるほど...。:)

Alexey Viktorov:
反応はどうでしょうか?回答を読む

すべては、そこにある。ただ、当初はこの機能を使うことを拒んでいたんです。そして、それはあなたを困らせたに違いない。じゃあ、ごめんね...。:)

 

例題のObjectDeleteAll関 数を最初に代入してください。

//+------------------------------------------------------------------+
//|                                           DeleteChartObjects.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"
#property indicator_chart_window

#property indicator_plots 0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#include <ChartObjects\ChartObjectsLines.mqh>
#include <Arrays\ArrayObj.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- input parameters
input int      nBars = 100000;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int customN_Bars = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CArrayObj listOfTrendLines;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  int totalBars = iBars(NULL, PERIOD_CURRENT);
  customN_Bars = (nBars < totalBars) ? nBars : totalBars;
//---
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[]
) {
  CChartObjectTrend * trend;
  int delta = rates_total - customN_Bars;
  int shift;
  int i;
  for(i = 0; i < customN_Bars; i++) {
    shift = delta + customN_Bars - i - 1;
    trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
    else
      delete trend;
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  
  ObjectsDeleteAll(0, "trend", 0, OBJ_TREND);
  
  CChartObjectTrend * trend;
  
  int i = listOfTrendLines.Total() - 1;
  for(; i >= 0; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
    if(CheckPointer(trend) == POINTER_INVALID)
      continue;
    
    delete trend;
  }
}
//+------------------------------------------------------------------+

そしてインジケーターへ。

Artyom Trishkin:

オブジェクト名にプレフィックスを追加すると、プロジェクト全体をやり直す必要があるのでは?

私のプロジェクトで ObjectDeleteAllを使うのは簡単であることがわかりました。すべてのオブジェクトを削除するには、プレフィックスを3回変更し、ObjectDeleteAllを 3回呼び出せばよいのです。その結果、チャートはクリアなものになりました。MQL5言語は微妙なところが多いんです。しかし同時に、非常によく考えられた言語であるとも言えます。

この問題を解決するために協力してくれた皆さん、ありがとうございました。