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

 
fxsaber:

ポイントは、参照渡しができることです。

文字列の 場合と同様に、開発者は、実際に変数をコピーすることなく、すべてを参照渡しする機会があります(まだ実行されていない場合)。

void f()
{
        MqlTick tick;
        SymbolInfoTick( NULL, tick );
        g( tick );
}
inline void SymbolInfoTick( string symbol, MqlTick& tick )
{
      tick = _LastTick; //л енивое программирование: а не будем ничего копировать,
                        //пока _LastTick не изменится
}


そしてそれは、ある特定のMqlTick 構造ではなく、あらゆる場面での解決策になるはずです

 
A100:

このことから、_Digits,_Point , _Period, _LastErrorなどを直接 使う意味がないことが改めて確認できます(_SymbolもNULLで置き換えることができますし)。実際には、const volatileとして宣言する必要があります。

そして、あなたは逆に、この範囲を拡大することを提案しています。

ただし、IsStoppedフラグは100%揮発 性です。つまり、IsStoppedの読み取りは100%メモリの読み取りです。
その他の場合、almostvollatylеは、コンパイラが最初の呼び出し時に変数の値をレジスタにキャッシュして、次にその変数にアクセスするときにキャッシュされた値を使用してもよい(MAY)ことを意味します。ただし、1つの関数内または呼び出しの分岐(1関数内にインライン化されている場合)でのみです。
これは、定義済みの変数(IsStoppedを除く)の変更がMQLエントリポイント(OnXXX関数)の内部で発生しないため、可能(かつ必要)です。

VARIABLE MODIFICATORについてですが 仮にコンストプログラマーが プログラマーのために使っているとします。
ご存知のように、変換によって変数の定数を変更することができるので、コンパイラはconst 修飾子を信用することができないのです。


コンパイラは、その変数が値を変えずに定数として初期化されていると判断すると、const 修飾子がなくても、その変数を即時値(ImmediateValue)にします。 _LastTickについては、議論中ですが...。
これは単純なアトミック型ではなく構造体であり、値の取得時を含め、MQLプログラムのどの時点でも突然変更される可能性があります。
この構造に対応するためには、シンクロナイザーを導入する必要があることがわかった。

特に、このようにビルドのリリース速度が速いため、常にパフォーマンスの向上に努めています。
MQLのコードを高速化するために多くの作業を行う予定です

Документация по MQL5: Предопределенные переменные
Документация по MQL5: Предопределенные переменные
  • www.mql5.com
Для каждой выполняющейся mql5-программы поддерживается ряд предопределенных переменных, которые отражают состояние текущего ценового графика на момент запуска программы - эксперта, скрипта или пользовательского индикатора. Значение предопределенным переменным устанавливает клиентский терминал перед запуском mql5-программы на выполнение...
 
Ilyas:

LastTickについては、議論中ですが...。

これは単純なアトミック型ではなく構造体であり、値の取得時を含め、MQLプログラムのどの時点でも突然変更される可能性があります。
この構造に対応するためには、シンクロナイザーを導入する必要があることがわかった。

しかし、テスターでは、_LastTickはMQLプログラムのどの時点でも変更できないのですか?

もしそうなら、計算速度が最も重要なテスターにのみ、そのようなソリューションを提供する。

 
Igor Makanu:

しかし、テスターでは、_LastTickはMQLプログラムのどの時点でも変更できないのですか?

もしそうなら、計算速度が最も重要なテスターにのみ、そのようなソリューションを提供してください。

では、OnTickハンドラでこのティックを一度リクエストし、その後、得られたデータで作業することを妨げるものは何でしょうか? 実質的には何のコストもかかりません。 なぜ(上記のテストのように)100回もリクエストして、人為的に偶数箇所にブレーキをかけなければならないのでしょうか? つまり、EAコードが曲がった問題は、MTの内部作業を複雑にすることで解決しようと提案されているのです。それとも、何か正常な測定値があるのでしょうか?
 
Alexey Navoykov:
では、このティックをOnTickハンドラで一度リクエストし、受信したデータで動作させることを妨げるものは何でしょうか?

マーケットとクラウドが積んでいるEAクリエイターの 資質の低さが邪魔をしている。

 
Alexey Navoykov:
では、OnTickハンドラで一度tickをリクエストすれば、それ以降は受信したデータで動作するようになるのでしょうか? 実質的には何のコストもかかりません。 なぜ(上記のテストのように)100回も再リクエストして人為的にブレーキをかけるのでしょうか? つまり、EAコードが曲がったという問題は、MTの内部動作を複雑にすることで解決しようと提案しているのです。それとも、何か正常な測定値があるのでしょうか?

OnTick "で処理されるイベントは、外部から優先順位をつけて何らかのキューに受け取られる。他のハンドラでは、そのような新しいイベントが発生していないことを確認することが有用であり、そうでなければ、前のティックのデータは無効/古いものとなる。

 
Alexey Navoykov:
では、OnTickハンドラでこのtickを一度リクエストして、その結果得られたデータで作業することを妨げるものは何でしょうか? それは実質的に無価値です。 なぜわざわざ100回もリクエストして(上記のテストのように)その場で人為的にブレーキをかけるのでしょう?

これはまさに私がテスターで行っていることです。

Alexey Navoykov:
つまり、曲がったEAコードの問題は、MTの内部構造を複雑にすることで解決するはずなのです。それとも、何か正常な測定値があるのでしょうか?

まあ、コードは一般的なコーディングプラクティスによって決定されます、これらの例でQBとセーフラインの使用を見てください

私はSBを使用していない、私はプロファイラで 測定し、数ヶ月のためのソリューションを探している、スピードテストについてのスレッドがあった、一部代替ソリューションを投入してください。

このような場合、私は自分のEAを最適化するために満足しています、18ヶ月6秒でパスがあった、今2.5秒、私は自分自身に良い仕事をしたイミホ )))

 
の素材による......。という考察が生まれました。
UninitializeReason()はプログラムのどの部分でも、特にOnInit()の中で呼び出すことができることを考えると(そしてそのような呼び出しが意図されていない場合は、スコープが拡張される可能性がある)。
提案されています。

OnDeinit()が呼ばれる前に変数 _UninitReason の値が生成された場合。
また、EA の以前の非初期化の理由が定義できない場合(REASON_PROGRAM、REASON_REMOVE など)。
は、この呼び出しの前では未定義 (-1) であるべきです。これが0になり、つまり実質的にREASON_PROGRAM

EAを完全に再起動した場合(REASON_RECOMPILE、REASON_ACCOUNT、REASON_CLOSEなど)。
プログラムの新しいインスタンスを開始するときに、_UninitReason変数に適切な値(REASON_RECOMPILE、REASON_ACCOUNT、REASON_CLOSEなど)を設定することが可能なようです。

現在のように0ではない、つまり実質的にREASON_PROGRAM

Expert Advisor が部分的に再起動した場合 (REASON_CHARTCHANGE など)、OnInit() の _UninitReason 変数は対応する値 (REASON_CHARTCHANGE など) と等しいままです。
であり、変更の必要はありません
 
MT5 バグ (ビルド 2450) テンプレートクラスのメソッドの前方宣言のコンパイルエラー

template<typename T>
class A{};


class B{
public:
   template<typename T>
   void test(A<T> &a);
};

template<typename T>
void B::test(A<T> &a){}   // 'test' - member function already defined with different parameters 


void OnStart(){ 
   B b;
} 
 

端末を再起動すると、記録ログに連続無停止で書き込みを行う

2020.05.24 03:36:03.342 HistoryBase     'GBPUSD' 1 invalid bars removed

ログのヒストリーバーの時間が常に増えている。GBPUSD 日足チャートを開いてそわそわ - ゼロ、1本目、2本目のバーが削除/作成されます。そうやって、ぐるぐる回っているんです。

ここで私は待っています。このログでSSDが全部埋まるのか、それともついに止まるのか...。

昨日のログは予告編にあります。

ファイル:
20200523.zip  304 kb