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

 

MQ5プログラムでは、実行終了後、作成したすべてのハンドルのIndicatorReleaseを必ず自動で行うのでしょうか?

それとも、スクリプトでIndicatorCreateを介してインジケータを実行し、そのハンドルをグローバル変数に渡して、さらにインジケータで作業することは可能でしょうか?

 

https://www.mql5.com/ru/docs/basis/preprosessor/compilation

定数

タイプ

商品説明

テスターインジケータ

indicator_name.ex5 " 形式のカスタムインディケータ名テストに必要なインディケータは、対応するパラメータに定数文字列が指定 されていれば、iCustom() 関数呼び出しから自動的に決定されます。その他の場合(IndicatorCreate() 関数の使用、または指標名を指定するパラメータに定数でない文字列を使用)、このプロパティは

IndicatorCreate - ほぼ(入力パラメータ数に制限なし)初歩?

Документация по MQL5: Основы языка / Препроцессор / Свойства программ (#property)
Документация по MQL5: Основы языка / Препроцессор / Свойства программ (#property)
  • www.mql5.com
Основы языка / Препроцессор / Свойства программ (#property) - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
iCustom+ChartIndicatorAddの後にIndicatrorReleaseが呼び出された場合、誤ってtrueを返してしまう。正解です。
 
fxsaber:
メーターは?
昨日、1687ページで説明しました。:)でも、1686ページのこの投稿から読んだ方がいいです。https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 ちなみに、この人はあなたと同じ質問に答えていました。ただ、このような図式になっていることがわかりました。インジケーターの呼び出し要求は、端末に行きます。つまり、Expert Advisorやスクリプトが直接インジケータを呼び出すのではなく、端末が仲介役となるのです。端末は、このインジケータが指定されたパラメータで既に存在するかどうかを確認します。その場合、インジケータを呼び出したプログラムに、既に存在するインジケータへのハンドル(リンク)を返します。そして、その末端の下層土には、このインジケータの別の呼び出しがあったことをカウンターでマークしています。つまり、このインジケーターに対して、いくつのハンドルが返されたかを記録しています。誰かがIndicatorReleaseを行ったところで、同じパラメータで同じインディケータを呼び出した他の人が、このインディケータを必要としなくなるわけではありません。そのため、Terminalはカウンターを1つ減らしますが、他の誰かが使用するため、インジケーターはアクティブなままです。これは、カウンタがゼロになるまで続けられます。カウンタがゼロになると、TerminalはRAMからインジケータを永久に削除します。
IndicatorReleaseを含むが、インジケータ自体を呼び出さないコードを作ろうとすると、コンパイルできない。なぜなら、IndicatorReleaseにハンドルを渡す必要があるが、プログラムからインジケータを呼び出さない場合は、ハンドルを取得できないからである。
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • レビュー: 8
  • www.mql5.com
Форум трейдеров MQL5.community
 

BlackTomcat:
Вчера обсуждали, страница 1687. :) Но читать лучше вот с этого сообщения на 1686-й странице: https://www.mql5.com/ru/forum/1111/page1686#comment_2790746 Кстати, человек на Ваш же вопрос отвечал. Просто получается, что схема такая. Запрос на вызов индикатора попадает в Терминал. Т.е. советник или скрипт не вызывают индикатор напрямую, терминал выступает посредником. В терминале происходит проверка, существует ли уже такой индикатор с указанными параметрами. Если да, то он возвращает программе, вызвавшей индикатор, хэндл (ссылку) на уже существующий индикатор. А в своих терминальных недрах помечает в счётчике, что был ещё один вызов на данный индикатор. Т.е. он ведёт учёт, сколько хэндлов на данный индикатор вернул. Когда кто-то делает IndicatorRelease, это не значит, что остальным, кто вызвал этот же индикатор с такими же параметрами, этот индикатор больше не нужен. Поэтому Терминал уменьшает счётчик на единицу, но оставляет индикатор активным, потому-что им ещё кто-то пользуется.

ありがとうございました。これは大きな節約になることがわかりました。

IndicatorReleaseを含むが、インジケータの呼び出しを含まないコードを作成しようとすると、IndicatorReleaseにハンドルを渡す必要があり、プログラムからインジケータが呼び出されていない場合、ハンドルを取得できないため、コンパイルできないのではないかと思います。

ハンドルはグローバル変数で渡すことができる。そのため、使用することが可能です。
 
fxsaber:


グローバル変数でハンドルを渡すことができるしたがって、使用することは十分に可能です。
合格する必要はない。:)少なくとも、この方法で取得したハンドルに対してIndicatorRelease()を呼び出さない ようにする。そうすれば、それは言語のバグではなく、あなたのエラーになりますよね?
 
Sergei Vladimirov:
そして、あなたはそうしない。:)少なくとも、この方法で取得したハンドルに対してIndicatorRelease()を呼び出さない ようにしてください。そうすれば、それはあなたのミスであって、言語のバグではないと、あなたは同意するのですか?

そして、私は自由市場用の悪いタブを書きます。それは、ある時点で、すべての正のintの範囲を通過し、それぞれについてIndicatorReleaseを試すだけです。

このスクリプトは、ChartIndicatorAddを 使わずにiCustomを使用していた端末のExpert Advisorとインジケータをすべてカバーします。

 

繰り返しになりますが、それはあなたの意図的な行動であって、言語のバグではありません。なぜ、そんなことを書いたのですか?

ところで、この話の発端は、「インジケーターハンドルを使う前に、どのように確認すればいいのか」というご質問でした。まあ、確認することはできませんが、クローズドインジケータのハンドルを使用しようとすると、エラー4807が発生します。まあ、CopyBuffer()を呼び出す たびに、-1を返すなら、それを確認する必要があります。

 
fxsaber:
グローバル変数でハンドルを渡すことができるだから、使うことは十分に可能なんです。
あの...何のためのグローバル 変数?端末かEAか?私はTerminalの変数を扱ったことがないので、論外です。また、EAのグローバル変数については、それが主な方法です。OnInitでインジケータを初期化し、OnDeinitでIndicatorReleaseを行う場合、グローバル変数(EA)のみでハンドルを渡すことになります。
 
A100:
実行エラー: '無効なポインタへのアクセス' (*)
A::aは何を指しているのですか?