BlackTomcat: Вчера обсуждали, страница 1687. :) Но читать лучше вот с этого сообщения на 1686-й странице: https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 Кстати, человек на Ваш же вопрос отвечал. Просто получается, что схема такая. Запрос на вызов индикатора попадает в Терминал. Т.е. советник или скрипт не вызывают индикатор напрямую, терминал выступает посредником. В терминале происходит проверка, существует ли уже такой индикатор с указанными параметрами. Если да, то он возвращает программе, вызвавшей индикатор, хэндл (ссылку) на уже существующий индикатор. А в своих терминальных недрах помечает в счётчике, что был ещё один вызов на данный индикатор. Т.е. он ведёт учёт, сколько хэндлов на данный индикатор вернул. Когда кто-то делает IndicatorRelease, это не значит, что остальным, кто вызвал этот же индикатор с такими же параметрами, этот индикатор больше не нужен. Поэтому Терминал уменьшает счётчик на единицу, но оставляет индикатор активным, потому-что им ещё кто-то пользуется.
MQ5プログラムでは、実行終了後、作成したすべてのハンドルのIndicatorReleaseを必ず自動で行うのでしょうか?
それとも、スクリプトでIndicatorCreateを介してインジケータを実行し、そのハンドルをグローバル変数に渡して、さらにインジケータで作業することは可能でしょうか?
https://www.mql5.com/ru/docs/basis/preprosessor/compilation
定数
タイプ
商品説明
テスターインジケータ
列
indicator_name.ex5 " 形式のカスタムインディケータ名。テストに必要なインディケータは、対応するパラメータに定数文字列が指定 されていれば、iCustom() 関数呼び出しから自動的に決定されます。その他の場合(IndicatorCreate() 関数の使用、または指標名を指定するパラメータに定数でない文字列を使用)、このプロパティは
IndicatorCreate - ほぼ(入力パラメータ数に制限なし)初歩?
メーターは?
IndicatorReleaseを含むが、インジケータ自体を呼び出さないコードを作ろうとすると、コンパイルできない。なぜなら、IndicatorReleaseにハンドルを渡す必要があるが、プログラムからインジケータを呼び出さない場合は、ハンドルを取得できないからである。
BlackTomcat:
Вчера обсуждали, страница 1687. :) Но читать лучше вот с этого сообщения на 1686-й странице: https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 Кстати, человек на Ваш же вопрос отвечал. Просто получается, что схема такая. Запрос на вызов индикатора попадает в Терминал. Т.е. советник или скрипт не вызывают индикатор напрямую, терминал выступает посредником. В терминале происходит проверка, существует ли уже такой индикатор с указанными параметрами. Если да, то он возвращает программе, вызвавшей индикатор, хэндл (ссылку) на уже существующий индикатор. А в своих терминальных недрах помечает в счётчике, что был ещё один вызов на данный индикатор. Т.е. он ведёт учёт, сколько хэндлов на данный индикатор вернул. Когда кто-то делает IndicatorRelease, это не значит, что остальным, кто вызвал этот же индикатор с такими же параметрами, этот индикатор больше не нужен. Поэтому Терминал уменьшает счётчик на единицу, но оставляет индикатор активным, потому-что им ещё кто-то пользуется.
ありがとうございました。これは大きな節約になることがわかりました。
IndicatorReleaseを含むが、インジケータの呼び出しを含まないコードを作成しようとすると、IndicatorReleaseにハンドルを渡す必要があり、プログラムからインジケータが呼び出されていない場合、ハンドルを取得できないため、コンパイルできないのではないかと思います。
グローバル変数でハンドルを渡すことができるしたがって、使用することは十分に可能です。そして、あなたはそうしない。:)少なくとも、この方法で取得したハンドルに対してIndicatorRelease()を呼び出さない ようにしてください。そうすれば、それはあなたのミスであって、言語のバグではないと、あなたは同意するのですか?
そして、私は自由市場用の悪いタブを書きます。それは、ある時点で、すべての正のintの範囲を通過し、それぞれについてIndicatorReleaseを試すだけです。
このスクリプトは、ChartIndicatorAddを 使わずにiCustomを使用していた端末のExpert Advisorとインジケータをすべてカバーします。
繰り返しになりますが、それはあなたの意図的な行動であって、言語のバグではありません。なぜ、そんなことを書いたのですか?
ところで、この話の発端は、「インジケーターハンドルを使う前に、どのように確認すればいいのか」というご質問でした。まあ、確認することはできませんが、クローズドインジケータのハンドルを使用しようとすると、エラー4807が発生します。まあ、CopyBuffer()を呼び出す たびに、-1を返すなら、それを確認する必要があります。
グローバル変数でハンドルを渡すことができるだから、使うことは十分に可能なんです。
実行エラー: '無効なポインタへのアクセス' (*)