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

 
Aleksey Mavrin:

何が悪いのか、どうすればチャートの更新を早くできるのか、教えてください。 Expert Advisor から ChartRedraw 関数が呼び出されますが、まだ数分の遅れがあります。

ChartRedrawはグラフィックオブジェクトの描画(更新)にのみ必要で、インジケータバッファで 描画する通常のインジケータには必要ありません。

多分、バッファの計算が毎ティック正しくないと思います。

ZZY: 確認はできませんが、もしかしたらChartRedrawはチャート全体の履歴を同期して更新しているかもしれません、もしそうなら、実際には毎回履歴全体を計算しながらインジケータを再起動します。

UPD:チャート上の履歴をより少ないバーの数に制限してみてください 10 000で十分です、MT4で重い指標は、すべてのメモリを "ゴブルアップ "とし、EAが正しく動作しない理由を検索した場合(それが動作していない)であった。MT5では、すべてのメモリを使用したとは考えにくいのですが......。

 
Igor Makanu:

ChartRedrawはグラフィックオブジェクトの描画(更新)にのみ必要で、インジケータバッファで 描画する通常のインジケータには必要ありません。

多分、バッファの計算が毎ティック正しくないと思います。

ZZY: 確認はできませんが、もしかしたらChartRedrawはチャート全体の履歴を同期して更新しているかもしれません。

UPD:チャート上の履歴をより少ないバーの数に制限してみてください 10 000で十分です、MT4で重い指標は、すべてのメモリを "ゴブルアップ "とし、EAが正しく動作しない理由を検索した場合(それが動作していない)であった。MT5では、すべてのメモリを使用することはまずないのですが......そういうこともあるかもしれません。

計算の最適化を図り、前バージョンのインジケータをテストしました。以前は1000本ごとに計算していましたが、今は新しいバーが開くのを待っています。

もしこれが理由なら、やはり大いに驚かなければならない。1kバーのあまり強くない計算で、2分間チャート描画が遅くなる?

 
Aleksey Mavrin:

それが理由なら、やはりビックリするほどの価値があります。1バールのあまり強くない計算で2分ほどチャート描画が遅くなる?

というメッセージとともにアンロードされます。

MTのランタイム(4/5)は非常に速く、もちろん同じデータを何度も計算することができますが、イマイチ、頑張る必要があります。

インジケーターの作者は、インジケーターバッファの経済的な計算を熟知しておらず、最後のバーを正しく計算することを忘れているようです...QBに行ってインジケーターの書き方を勉強しましょう ;)

 
Slava :

この2つのプログラムは同じ端末にあるのですか、それとも2つの異なる端末にあるのですか?

この問題を再現するためのコードを掲載します。https://www.mql5.com/en/forum/332849

再現するためには、最低2回コードを実行する必要があります。

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...
削除済み  
Alexey Navoykov:

全く必要ない。なぜCなのか、C#はどうなのか。- 意味合いとしてはC#に近いですね。

おそらく、µl c++が似ていて、構造体がcから来たからでしょう。

パッシブ構造の話は、すべて古臭い概念だと思います。

コンストラクタが必要な場合は、クラスを使うか、シャープに行く。なぜ、このような意味合いを持つ構造を奪わなければならないのか。そうすることで、プログラムの表現力がより豊かになるのです。誰かのコードを読んで、その人がクラスではなく構造体を持っていることを知り、たった一語から多くの情報を得ることができるかもしれないのです。何も得られない、同じ結果を得るためにソースコードを熱心に研究する、それは私が瞬く間に手に入れたものです。私の経験では、この構造の慣習は尊重されます。まあ、ある種の虚無的なマージナリズムを巻き起こすかもしれません。

私は、最低限、すべての型にコンストラクタが必要だと考えています。未初期化のフィールドは悪なので、避けるべきです。

そこに悪はない、と思われる。Vaughnは、標準に引きずられて、初期化されていないunsigned charやstd::byteの読み込みは、undefindedな動作ではない、とまで言っています。PODにアグリゲート初期化を使用することも可能です。そして忘れてはならないのは、この初期化はすべて無料ではなく、実際のリソース消費(CPU、メモリ、実行ファイルのサイズ)であるということです。マイコンの場合は重要かもしれませんね。結局、C/C++はシャープのようにWindowsのシャッフルだけではないのです。

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5 d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5 d                      pop    %rbp
    1129:       c3                      retq
1つの変数の初期化だけで、命令サイズが30%増加した。
 
Stanislav Korotky:

一つの端末でエキスパートがデータを書き込み、インジケータがデータを読み込む。異なるチャートにぶら下がっているが、明らかに同じチャートである可能性がある(それが重要なら)。ビルド2380。

ファイルを読み込んだExpert Advisorは、このファイルを閉じておく必要があります。

MQL5におけるファイルの実装の特殊性は、ファイルからのデータを自身のバッファに最大限保持することである。もし、情報量が多くてバッファに収まらない場合は、ポインタをファイルの先頭から末尾に移動させるというトリックが有効です。

そこで、この時点でファイルを開き、内容を確認し、再度閉じます

 
Slava :

ファイルを読み込むExpert Advisorは、このファイルを閉じておく必要があります。

MQL5でのファイル実装の特徴は、ファイルからのデータをできるだけ自分のバッファに保持することです。もし、情報量が多くてバッファに収まらない場合は、ポインタをファイルの先頭に移動してから末尾に移動させるという方法が有効かもしれません。

そこで、この時点でファイルを開き、内容を確認し、再度閉じます

では、FileFlush()は無駄なのか?
 
Alain Verleyen:
では、FileFlush()は無駄なのか?

FileFlushは、変更したファイルを他の人が読めるようにするために行う必要があります。

問題は、MQL5プログラムがファイルを開くときに、自分のバッファに読み込むことです。再度読み込むまで、ファイルの変更については何もわからない。ファイルを閉じてから開くことで、再び読み込むことができます

 
Slava:
FileFlushは、変更したファイルを他の人が読めるようにするために行う必要があります。

ファイルを閉じても

 
Andrey Barinov:

ファイルを閉じても

まさにその通りです。一度閉じて、再度開く

それとも、ファイルを閉じる前にFileFlushすることでしょうか?