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

 

コンポーザー
おっしゃるとおりです。間違えました。
ご返信ありがとうございました。

 
Silent:

MQL5リファレンスマニュアル -標準ライブラリ- データを整理するためのクラス - CArrayObj(ウェブサイトとヘルプに記載)。

2.メモリ管理機構は無効です。

この場合、CArrayObj はメモリ解放の責任を 負いません。

修正しました、ありがとうございます。
 

ドキュメンテーション静的変数の セクション。

"...静的変数はプログラム実行の瞬間から存在し、専用関数OnInit()を呼び出す前に 一度 初期化 される...。"

Expert Advisor のコードを確認する。

void OnInit() {
  Print("OnInit() begin!");

  static bool init = true;
  if (init) {
    Print("Static initialized!");
    init = false;
  } 

  Print("OnInit() end!");
}

チャート上にEAを "配置 "する。

2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() begin!
2011.06.27 20:10:56     Тест (EURUSD,H1)        Static initialized!
2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() end!

EAをチャートから外さずに、チャートの期間を変更します。

2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() begin!
2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() end!

このような仕組みになっているのでしょうか?

実は、ドキュメントからの情報では、リコンパイルやシンボルの変更などによるものであろうと、関数OnInit()の呼び出しがあれば、スタティック変数を強制的に初期化すると解釈していたのですが...。

それは、私の勘違いだったことがわかりました。ご教示ください:このルールの例外は何ですか?

 

入力パラメータが変わっても、同じように「ごちゃごちゃ」している。

しかし、アカウントが変更されると、静的変数が再初期化され、正しく処理される。

エキスパート(REASON_CHARTCHANGE)を削除せずにチャートシンボルを変更するにはどうしたらいいのでしょうか?

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

ドキュメンテーション静的変数の セクション。

"...静的変数はプログラム実行の瞬間から存在し、専用関数OnInit()を呼び出す前に 一度 初期化 される...。"

Expert Advisor のコードを確認する。

チャート上にEAを "配置 "する。

EAをチャートから外さずに、チャートの期間を変更します。

このような仕組みになっているのでしょうか?

はい、うまくいくはずです。

プログラム(そのコード)はすでに一度ロードされており、ホット再初期化(コードのアンロードを伴わないDeinit/Init)のみを実行します。この場合、開発者自身が環境を適切に初期化する必要があります。

 
Renat:

はい、そのように動作するはずです。

プログラム(そのコード)はすでに一度ロードされており、ホット再初期化(コードのアンロードを伴わないDeinit/Init)を行うだけです。この場合、開発者は環境の適切な初期化に気を配らなければなりません。

まず、あなたのコメントは、ドキュメントにある「OnInit()を呼ぶ前に一度 初期化する」という定義と明らかに矛盾しています。その場合は、ドキュメントに「...OnInit()を呼ぶ前に一度 初期化する」と明確に定義しておく必要があります。 第一 call OnInit()」と呼びます。
次に、アカウント変更の場合、MTがExpert Advisorを強制終了し、再度復元することが明らかであるため、コメントと矛盾しています。

OnInit()の呼び出しのたびに(最初の呼び出しだけでなく)スタティック変数を 強制的に再初期化すべきかどうかという根本的な問題を検討/投票に持ち込むことは可能でしょうか?

 

一般的に、物事の仕組みは面白いものです。
一見、OnDenit関数はデストラクタの一種であり、OnInitはExpert Advisorのコンストラクタであるように思いました。
実は、OnInitは複数回(エキスパートの寿命内)のイベントであることが判明しました。では、EAが動作を終了しないことが分かっているのに、なぜOnDenitイベントを明示的に発生させる必要があるのかが不明です(例えば、チャートの期間を変更した場合など)。

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

 
voix_kas:

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

ChartSetSymbolPeriod()
 
voix_kas:

実は、面白いんです。
直感的に、OnDenit 関数は一種のデストラクタで、OnInit 関数は Expert Advisor のコンストラクタだと思ったのです。
実際には、OnInitは複数回(Expert Advisorのライフタイム内)のイベントであるようです。では、EAが動作を終了しないことが分かっている場合(例えば、チャートの期間が変わった場合)、なぜOnDenitイベントを明示的に生成する必要があるのかが不明です。

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

MT4ですべてが同じように呼び出されました。そして、エキスパートがその作業を終了したかどうかはわかりません(OnDeinitのパラメータはこの目的のために落ちていますが、OnInitのトリガーとなりうる理由も簡単に知ることができます)。

2.方法はとても簡単で、端末の設定でExpert Advisorがシンボルと期間が変更されたときに取引するように設定します。

次に、マーケット概観で別のシンボルを選択し、マウスでチャート上に「ドロップ」します。

いずれにせよ、シンボル/期間の変更後の正常な初期化でEAは「削除されない」(下記のRenatさんの言うように「ホットリスタート」する) のです。単純に考えれば、Expert Advisorは特定の端末設定のもとで取引できるようになる。

イェデルキン
ChartSetSymbolPeriod()
もう一つの選択肢ですが、プログラム式です。:)
 
voix_kas:

まず、あなたのコメントは、ドキュメントにある定義と明らかに矛盾しています:それらはOnInit()を呼び出す前に一度 初期化されます。その場合は、ドキュメントに「...OnInit()を呼ぶ前に一度 初期化する」と明確に定義を明記する必要があります。 第一 OnInit()呼び出し」。

はい、これはドキュメントでより正確に定義されるべきです。


次に、アカウント変更の場合、MTがEAを強制終了し、再度復元することが明らかであるため、コメントが矛盾しています。

はい、アカウントを変更すると、Expert Advisor は明らかにメモリから自身をアンロードし、コールドリスタートを実行します。わざとやったんです。


OnInit()の呼び出しのたびに(最初だけでなく)静的変数を 強制的に再初期化する必要性についての基本的な質問を紹介/投票することは可能でしょうか?

残念ながら、そうではありません。Expert Advisor をコールドスタートさせることで、解決することができます。