MT4開発者、プログラマーからのヘルプが欲しい - ページ 7

 

なんてくだらないことを・・・。

また、EAをループさせるのはモウレツなトンだと思います。スタートサイクルの終了後にパラメータを変更するのは、完全に論理的です。話題提供者は、アマチュアではない彼の無限ループに問題があることを理解せずにはいられなかった。しかし、最初の投稿ではExpert Advisorの無限ループについて何も書いていない。私自身はこのようなシステムをEAに実装したことはありませんが、私の投稿から判断すると、以前はこのような ことはなかった、つまりループするEAのパラメータウィンドウが開かれなかっただけだと理解しています。つまり、TCの「既存のEAとMT4の新しいビルドとの根本的な非互換性につながる」という記述は真実ではなく、MT4の古いビルドでは、そのようなEAもパラメータを変更することができず、サイクルの最後までウィンドウを開くことが不可能だったのです。

EventSetMillisecondTimerは問題を解決します。しかし、この機能はいつから登場したのでしょうか?以前はEventSetTimerだけだったのでは?最小通話間隔が1秒のこのようなイベントは,1秒間に各シンボルのティックが何十回とあるような実際の取引用のシステムを書くときには全く役に立ちません

タイマーのヘルプ には、まだこの機能についての言及がありませんEventSetを入力する際のヒントとして、偶然発見した次第です。

 
しかし、変数の初期化に関しては、新しいMQL 4/5には1つの問題点と矛盾点があると私は考えています。つまり、動的に生成されるオブジェクトのコンストラクタでEAのパラメータをグローバル変数に読み込んでEAが動作し続けた場合、パラメータが変更されると、パラメータが変更されていないかのようにEAが動作し続けるのである。私見では、これは論理的ではなく、EAを非初期化した後にグローバル変数を非初期化し、その後EAを初期化する前に再初期化する必要があります。現在、このような変数の初期化および削除をOnInitおよびOnDeinitに置くことで解決しています。
 
AntFX:
しかし、新しいMQL 4/5には、1つの問題と矛盾があると私は考えています。
これはいい指摘だ...。しかし、どうやら開発者は、プログラムの「誕生」と「死」だけがグローバル変数の初期値に影響を与えることができると判断したようです...したがって、初期化ブロックでは、グローバル変数の値をゼロにリセットするか、初期値に代入しなければなりません...。
 
AntFX:
しかし、私の意見では、新しいMQL 4/5には1つの問題と矛盾があります:非初期化と初期化は、グローバル 変数の動的オブジェクトを削除して再作成しません。つまり、動的に生成されるオブジェクトのコンストラクタでEAのパラメータをグローバル変数に読み込んでEAが動作し続けた場合、パラメータが変更されると、パラメータが変更されていないかのようにEAが動作し続けるのである。私見では、これは論理的ではなく、EAを非初期化した後にグローバル変数を非初期化し、その後EAを初期化する前に再初期化する必要があります。現在、このような変数の初期化および削除をOnInitおよびOnDeinitに置くことで解決しています。

特に、ドキュメント(ここでもここでも)には、ロードが初期化イベントと1対1でリンクしていないことが強調されていないことを考えると、これは本当に厄介なことです。こんな言葉もあります。

グローバル変数は、プログラムがクライアント端末のメモリに読み込まれた直後に一度だけ初期化されます。

は、その後のパラメータの変更が非初期化および初期化され、対応するアンロードおよびロードが行われないことを開発者に指摘するには、明らかに不十分です。

 
marketeer:

特に、ドキュメント(ここでもここでも)には、ロードが初期化イベントと1対1でリンクしていないことが強調されていないことを考えると、これは本当に厄介なことです。こんな言葉もあります。

グローバル変数は、プログラムがクライアント端末のメモリに読み込まれた直後に一度だけ初期化されます。

は、その後のパラメータ変更で非初期化と初期化が行われるが、対応するアンロードとロードは行われないという事実に開発者の注意を引くには明らかに不十分である。

変数のロード/アンロードや再初期化は必要ありません。変数の初期化はプログラマーが行う必要があります。

 
Contender:

変数のロード/アンロードや再初期化が不要です。変数の初期化はプログラマーが行う必要があります。

まさにこの初期化がいつ行われるのかが明確に語られていない、ということなのです。グローバル変数を 使用したコード。

int x = 0;

これも初期化です。しかし、これはMCから見て初期化 されていないだけであることは、ドキュメントに明確に書かれていないのです。

 
厳密には、プログラムがロードされたときに実行される初期化と、OnInitが呼び出されたときに「環境」が変更される初期化の2種類が、MTに存在することになります。これが発掘されるのはまずい。
 
marketeer:
厳密には、MTでは、プログラム起動時に行われる初期化と、OnInit呼び出しの瞬間に「環境」を変更する際に行われる初期化の2種類が存在することになりました。悪いのは、これが発掘されないといけないことです。

プログラム起動時にコールドスタートとなります。メモリは変数に割り当てられ、初期値が設定される。

走行時-ウォームスタートここで、プログラマーは変数の初期化の 面倒を見なければならず、これは良いことです。

 
Contender:

プログラム起動時にコールドスタートとなります。メモリは変数に割り当てられ、初期値が設定される。

走行時-ウォームスタートこの場合、プログラマは変数の初期 化を行う必要があり、これは良いことです。

良いか悪いか、それは哲学的な問題だ...。しかし、Documentationにそれに関する情報が0.0であることは良くないと思います...。
 
denkir:
それが良いか悪いかは哲学的な問題ですが...。しかし、Documentationにそれに関する情報が0.0であることは良くないと思います...。

つまり、大げさに言えば、プログラマの「利便性」のために特別に追加された「機能」であり、既存のコード(以前の初期化ルールのために書かれた)の不変性を侵しているのです。したがって、可能な限り新しいバージョンのソフトウェアと古いコードの互換性を維持するという不変の原則は守られない。

新機能や最適化に反対する人はいません。しかし、古いコードを壊さないような方法でやってみてはどうでしょう。特に、このような新しい初期化には、#property strictと同様のプリプロセッサーコマンドを追加で割り当てることができます。例えば、#property lazyinit のようなもので、開発者が明示的に指定していれば(つまり、開発者が mql の新しい初期化について認識していれば)、最適化されたと喜ぶことができる。そして、もしそれが指定されていないのであれば、以前のコードが一貫して動作し、グローバル変数が 残せる場所を掘ったり探したりすることなく、今では宣言するだけでなくOnInitで別途初期化しなければならないことを嬉しく思います。このような変数1つに対して、1行ではなく2行のコードが存在することになります。