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

 
voix_kas:

一般的には、どう転ぶかわからないのが面白いところです。
直感的に、OnDenit関数は一種のデストラクタで、OnInit関数はEAのコンストラクタだと思ったのです。

実は、OnInitは複数回(Expert Advisorのライフタイム内)のイベントであることが判明しています。では、EAが動作を終了しないことが分かっているのに、なぜOnDenitイベントを明示的に生成する必要があるのでしょうか(例えば、チャートの期間を変更した場合など)。

シンボルが変わると、Expert Advisorはクイックスタートと前世の情報基盤を保存するために、ホットロードされます。

例えば、Expert Advisorがチャート上にあり、統計やロジックを蓄積していたのに、タイムフレームが変更され、コールドリスタートでゼロから動作させなければならない場合です。

そして、もうひとつ質問があります。
REASON_CHARTCHANGE の非初期化の理由- シンボルまたはチャート期間が変更されました。
チャート上のEAを削除することなく、チャートシンボルを変更する方法を教えてください。

ホットリスタートモードでは
 

イェデルキン、興味深い、レナット
分かりやすい説明ありがとうございました。

また、ドキュメントに「ホット」「コールド」リスタートの明示的なリストを含めることも意味があると思います。

OnInit毎に再初期化を行わない場合、マルチキャストEAについては、グローバルフラグという松葉杖を使うことになります。:(
もう少ししたら、コードを掲載します。

 
Interesting:

Expert Advisor は通常の初期化では削除されず、特定のターミナル設定の 下で取引できるようになるだけです(ただし、そのためにはシンボルが変更されたことを Expert Advisor が理解する必要があります...)。

ところで、それで思い出したのですがその設定について、開発者に聞いてみようと思っていたんです。

レナートさん、タイムフレームとシンボルを変更したときに取引を無効にするチェックボックスを2種類作って ください。 この2つは根本的に異なる変更です。

時間枠を変更したときにEAが取引を停止するのは、絶対に必要ありません。

しかし、このシンボルの変更は、根本的に重要なことです。このままロックしておきたいのですが...。が、今はこの2つの調整がなぜか同期して、一緒に規制されています。

私はこの問題をプログラム的に解決しています(元のシンボルを静的変数に格納し、initeで変化を制御する)。しかし、これを端末レベルでブロックできるようになれば、もっといい。

さらに良いのは、Expert Advisorを実行したまま、時間枠やシンボルを切り替えられることです。なぜ、愚直なまでに忘却の彼方で取引を止めるのか?

例えば、Expert Advisor がチャート上に存在する場合、タイムフレームやシンボルの切り替えを禁止するように設定されている場合、(別々に)ブロックする方がはるかに 良い。

// それを行おうとすると、それに対応するメッセージが表示されます。

実はこれもプログラム的に解決できるのですが(強制的にシンボルやタイムフレームを元に戻す)、あなた自身は端末レベルでの本当に使いやすい 設定に興味があるのだと思います。

 

MetaDriver:

レナートさん、タイムフレーム変更時とシンボル変更時の取引遮断のチェックボックスを2種類作って ください。 この2つは根本的に異なる変更です。

EAがタイムフレームを変更したときに取引を停止するのは、絶対に必要ありません。


アイデアを支持します、初期化解除の理由 コードに2刻みと区切りを作ってください(その方が便利です)。

しかし、タイムフレームを変更する可能性をブロックすることは、私はどのように(シンボルについて)知らない、私の好みのためにあまりにも多くのです。

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

それで思い出した。この設定については、以前から開発者に聞いてみたかったんです。

レナートさん、タイムフレームの変更とシンボルの変更で取引をブロックするチェックボックスを2種類作って ください。 この2つは根本的に異なる変更です。

そう、シンボルとタイムフレームを変えるという条件が無駄に組み合わされていたようです。

また、2つの条件に分けることにも賛成です。チケットはすでにサービスデスクに置かれています。

 

実は、マルチツールの作業ツールを定義するためのコードを添付しています。批評は歓迎します。:)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

Expert Advisor は、1ティックごとに、動作中の機器のリストを取得しようとします。
作業機リストの更新は、1)OnInitがトリガーされた後、2)EAの入力パラメータで 設定された時間経過後、の2つの条件で行われます。
このように、グローバル変数(bool Initialize)という形で、次の初期化を検出するための松葉杖が使われています。スタティックの初期化があれば、必要ないのですが。

私はグローバル変数を悪と考え、その時代の無条件goto演算子も悪と考えます。

 
voix_kas:

OnInit毎に再初期化を行わない場合、マルチラテラルではグローバルフラグの形で「松葉杖」を使用する必要があります。:(

中間的な静的変数 という松葉杖を残さず、最初から丁寧にコードを書いた方が良いのです。

解決策としては、そのようなデータをクラス内に隠します。クラスが死ねば、環境も死ぬ。

また、グローバルレベルでは、最小限のスタティック変数を残すこと。

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas:

実は、マルチツールの作業ツールを定義するためのコードを添付しています。批評は歓迎します。:)

ヒントとして、Symbolを グローバルレベルに置き、OnInitでゼロにします。配列が空であれば、初期化することになります。

そして、追加のフラグもありません。

 
Renat:

ヒントとして、Symbolをグローバルレベルにして、OnInitでゼロにします。配列が空であれば、初期化することになります。

そして、追加のフラグもありません。

被害妄想なんでしょうね。私はパブリック(グローバル)変数が好きではありません。私はムベトンだと思っています。
OnTickの内部でOnInitのトリガーを指定することは可能でしょうか?
例えば、OnTickの内部で、EAの初期化回数を格納するスタティック変数を宣言できますか(MQL5でそのような、または同様のプロパティがあれば)。

 
voix_kas:

グローバル 変数は悪であり、かつての無条件goto演算子もそうであった。

私は被害妄想に陥っているのでしょう。私はパブリック(グローバル)変数が好きではありません。マブダチだと思うんです。

1.なぜ?有害な症状を断固として排除する必要があるのです。

2.変数や配列などの名前に子音やそれに近い言語のキーワードを使わない(ただし、「Symbol」という配列は非常に印象的で、コード上では配列なのか何なのか分からなくなる)。

レナート

解決策は、そのようなデータをクラス内に隠すことです。クラスが死ねば、環境も死ぬ。

そして、グローバルレベルでは、最小限のスタティック変数を残すことです。

良い提案ですね。もうOOPに切り替える時期か...。:)