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

 
Alexey Volchanskiy:

質問に関係なく、どんな関数を呼んでも、スタック上の変数(この場合はnType)にアクセスするよりも常に遅くなるのです。

この自明性はともかく、質問はインライン関数に関するものでした。すなわち、OrderType()は、コンパイル時にorder.typeのようなものに置き換えられないのでしょうか。

個人的には、このようなMQLの関数呼び出しは、2番目のケースのように常にキャッシュしています。

測定結果が示すように、それは不要なものです。

 
Sergei Vladimirov:

この自明性はともかく、質問はインライン関数に関するものでした。つまり、コンパイル時にOrderType()がorder.typeのようなものに置き換わっていないでしょうか。

計測の結果、これは不要であることがわかりました。

配列の内部実装から 判断して、同じArraySizeをインラインで使用する必要があります。でも、いつもこんな感じで使っています(計ってません)。

の代わりに

for (int i = 0; i < ArraySize(Array); i++)

を使用しています。

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
性能面では、最近この事実に驚かされました。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

エニュメレーションを一貫して行うにはどうしたらいいですか?

fxsaber さん 2016.08.22 09:13

配列にstaticを追加しました。スイッチの約3倍の速さ!?そんなスイッチをゴミ箱に。ご指摘ありがとうございます。
つまり、コンパイラの最適化に頼らず、最小限の関数呼び出しで常に「手助け」し、可能な限り論理的にconstとstaticを使い分けるのが良いようです。
 
Sergei Vladimirov:

この自明性はともかく、質問はインライン関数に関するものでした。つまり、コンパイル時にOrderType()がorder.typeのようなものに置き換わっていないでしょうか。

測定の結果、不要であることがわかりました。

自分で書いたんでしょ?

Sergei Vladimirov2016.09.01 02:53 RU

自分で確認した。2番目のコードは、4倍速く動作します。すべてクリア、質問はお預けです。

 
Sergei Vladimirov:
自分でテストしてみた。2番目のコードは、4倍速く動作します。すべてが明らかになり、疑問が取り除かれる。
プロファイリング/デバッグモードのみでの 測定はしないでください。そこにはインラインが全くない。Release-versionだけが存在するはずです。
 
Inv Андрей Иващенко:

こんにちは。

将校諸君、どこから虫を捕まえればいいのか、教えてくれないか?

マルチカレンシー・エキスパート・アドバイザー。最初の取引の後、テスターは停止します。

エラーが表示され、コードが見つかりません。

はい、テスターは開始日2016.05.01から正常に動作しています。

助けてください

自分への返信

これはテスターのバグです。とりあえず、Expert Advisorが動作するすべてのシンボルに、OnInitで任意のテクニカルインジケータの ハンドルを追加する必要があります。

 
Alexey Volchanskiy:

自分で書いたんでしょ?

Sergei Vladimirov2016.09.01 02:53 RU

自分で確認した。2番目のコードは、4倍速く動作します。すべてクリア、質問はお預けです。

次のコメントで、1回の操作で得られるゲインを1ナノ秒と数字で書きました。2年かけて数千回走らせ、刻みで戦略を最適化する場合、1nsを節約することは理にかなっているかもしれません。しかし、実際の取引では...。
 
A100:

ビルド1398では、「EX5の読み込みに失敗しました」というエラーはまだ残っています(その例とは関係ないようです)。

修正ビルドでは、同様のケースでの1400エラーは、「純粋な仮想関数 呼び出し」として再現されるようになりました。そして、コメントなしでも問題なし

//Script1.mq5
typedef void (*fn)();
#import "Script2.ex5"
        void g( fn );
#import
void h() /*export*/ {} //если export без комментария - нормально
void OnStart() { g( h ); }
//Script2.mq5
#property library
typedef void (*fn)();
void g( fn f ) export { f(); }
 

適用できない :: あいまいさを解消するため


#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void g();
#import
typedef void (*fn)();
void OnStart()
{
        Script1::g(); //нормально
        Script2::g(); //нормально
        fn f = Script1::g; //Error
}
 
Inv Андрей Иващенко:

自分自身への答え。

これはテスターのバグです。とりあえず、Expert Advisorが動作するすべてのシンボルに、OnInitで任意のテクニカルインジケータの ハンドルを追加する必要があります。

そして、新しいバーの最初のティックだけを取得するときに問題が発生するようです、テスターは "立ち往生 "と1バー遅れているようです、つまり、EAはバーが存在しないと思い、視覚化では本当にそうではありませんが、数秒後にバーが現れます、M1のテストの場合には、正しい値は、2番目のティックで来る(私が正しく理解していれば)、私は開発者ができるだけ早くこの迷惑な瞬間を修正してくれることを願っています...

を追加しました。

この点を回避するために、新しいバーの最初のティックを人為的にスキップしなければならないことがわかりました...。

 
RTS-9.16 BCS-MetaTrader5で、CTRL+F5でEAのデバッグが できない。テスターは次のように書いています。
Tester  Leverage 1:1 set error