MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下桁数を取得 - ページ 21 1...141516171819202122 新しいコメント fxsaber 2018.12.09 01:28 #201 Nikolai Semko: とりあえず外出先で。自分で試すことができます。10、100、1000、10000...といった異なるサイズの構造体の配列でユニオンを使用することである。これにより、ループが桁違いに短くなり、ArrayCopyの呼び出し 回数も桁違いに少なくなります。これはmemcopyのバリアントに近いはずです。このアイデアが活かされました。この場合 トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下の桁数を取得する方法 fxsaber さん 2018.12.08 16:25 もちろん、さまざまなサイズを試しました。なぜか結果に影響しない。 ソースコードで全てを見ることができます。 Nikolai Semko 2018.12.09 01:30 #202 fxsaber:このアイデアが活かされました。そうすることで ソースブックで全て見ることができます。 ええ、調べましたよ。効果がないのが不思議。 fxsaber 2018.12.09 01:37 #203 Nikolai Semko: はい、調べました。効果がないのが不思議。ソースにサイズを制御する行がある #define CONVERT_AMOUNT 128この値を変更し、結果を見ることができます。値が100より大きい場合、速度は上がりません。全部で同じ数の要素がコピーされるので、実は簡単に説明できる。また、コピー部分が小さいことに起因する速度低下も解消されます。 Nikolai Semko 2018.12.09 06:41 #204 fxsaber:すでに 最高性能にロック オンされているのではと思うのですが。はい、そうですね。 試してみたところ、TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4と同じ結果になりました。 Ilya Malev 2018.12.09 13:36 #205 Andrey Khatimlianskii:ソースコードがあるんだから、自分で測ればいいんだよ。だから測ってください。私はそうではないと確信しているので、記事にも測定にも無駄な時間を費やす意味はないと思います。 Nikolai Semko 2018.12.09 18:03 #206 fxsaber:すでに 性能の限界にきているのでは?正直なところ、よくここまでmemcpyに迫ったものだと思います。そんなはずはないのです。何かがおかしい。 Nikolai Semko 2018.12.09 18:20 #207 fxsaber:もう 最高性能にこだわっているようです。あなたの大変な誤算がわかったような気がします。 あなたのBANCHは、最低50本の全く同じランを選択します。 しかし、コンパイラは大賢者で怠け者だ。同じ仕事を50回することはなく、コードを最適化することができます。そのため、少なくとも1回実行するごとにアレイを変更する必要があります。あるいは、50を1に置き換えて、テスト回数を増やしてもよい。そうすれば、結果はまったく違ったものになり、より客観的なものになるはずです。 2018.12.09 13:55:43.048 StructToArray__2 https://www.mql5.com/ru/forum/287618/page18#comment_9813963 2018.12.09 13:55:43.048 StructToArray__2 TicksToIntArray_thexpert 2018.12.09 13:55:43.296 StructToArray__2 Time[TicksToIntArray(TicksIn,Array)] = 247579 2018.12.09 13:55:43.296 StructToArray__2 IntArrayToTicks_thexpert 2018.12.09 13:55:43.544 StructToArray__2 Time[IntArrayToTicks(Array,TicksOut)] = 247840 2018.12.09 13:55:43.634 StructToArray__2 true 2018.12.09 13:55:43.766 StructToArray__2 2018.12.09 13:55:43.766 StructToArray__2 https://www.mql5.com/ru/forum/287618/page18#comment_9814108 2018.12.09 13:55:43.766 StructToArray__2 TicksToIntArray_fxsaber4 2018.12.09 13:55:44.118 StructToArray__2 Time[TicksToIntArray(TicksIn,Array)] = 351847 2018.12.09 13:55:44.118 StructToArray__2 IntArrayToTicks_fxsaber4 2018.12.09 13:55:44.452 StructToArray__2 Time[IntArrayToTicks(Array,TicksOut)] = 334011 2018.12.09 13:55:44.548 StructToArray__2 true 2018.12.09 13:55:44.692 StructToArray__2 2018.12.09 13:55:44.692 StructToArray__2 https://www.mql5.com/ru/forum/287618/page18#comment_9814108 2018.12.09 13:55:44.692 StructToArray__2 TicksToIntArray_semko 2018.12.09 13:55:45.037 StructToArray__2 Time[TicksToIntArray(TicksIn,Array)] = 344707 2018.12.09 13:55:45.037 StructToArray__2 IntArrayToTicks_semko 2018.12.09 13:55:45.373 StructToArray__2 Time[IntArrayToTicks(Array,TicksOut)] = 336193 2018.12.09 13:55:45.462 StructToArray__2 true memcpyとの差が40%であれば、より妥当なところでしょう。 配列を圧縮することで効果があるのかなと思います。刻み目の配列は10-12倍に圧縮することができます。ただ、これで結果的にリソースを介した送受信の時間が短縮されるかどうかが問題です。 ファイル: StructToArray.mq5 24 kb fxsaber 2018.12.09 20:15 #208 Nikolai Semko: あなたのBANCHは、絶対に同一の50本のランのうち最小のものを選択します。 しかし、コンパイラは大賢者で怠惰なのです。同じ仕事を50回するのではなく、コードを最適化するのです。コードは、やるべきことを正確に実行するように書かれています。コンパイラはmemcpyの 速度に影響を与えることはできませんが、パスの結果は以下のようになります。 1パスのループ https://www.mql5.com/ru/forum/287618/page18#comment_9813963 TicksToIntArray_thexpert Time[TicksToIntArray(TicksIn,Array)] = 235285 IntArrayToTicks_thexpert Time[IntArrayToTicks(Array,TicksOut)] = 192509 true 50点満点中 https://www.mql5.com/ru/forum/287618/page18#comment_9813963 TicksToIntArray_thexpert Time[TicksToIntArray(TicksIn,Array)] = 80970 IntArrayToTicks_thexpert Time[IntArrayToTicks(Array,TicksOut)] = 81103 true Nikolai Semko 2018.12.09 20:31 #209 fxsaber:このコードは、あなたがやりたいことをそのまま実現するように書かれています。コンパイラはmemcpyの速度に影響を与えることはできないが、パスの結果は1パスのループ50点満点中 しかし、では、なぜこのようなことが起こるのでしょうか。もちろん、コンパイラはmemcpyの 実行過程に影響を与えることはできないが、ループ中に計算されたパラメータがどれも変化しないことを理解すれば、最初の計算であらかじめ格納された結果を引き出して、実行を拒否することができる。プログラムのアロゴリズムを修正するために、私自身はこのようにコンパイラを構成しています。 Andrey Khatimlianskii 2018.12.10 09:42 #210 Ilya Malev:だから測ってください。私はそうではないと確信しているので、記事にも測定にも無駄な時間を費やす意味はないと思います。その必要はない 1...141516171819202122 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
とりあえず外出先で。自分で試すことができます。10、100、1000、10000...といった異なるサイズの構造体の配列でユニオンを使用することである。
このアイデアが活かされました。この場合
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下の桁数を取得する方法
fxsaber さん 2018.12.08 16:25
もちろん、さまざまなサイズを試しました。なぜか結果に影響しない。
このアイデアが活かされました。そうすることで
ソースブックで全て見ることができます。はい、調べました。効果がないのが不思議。
ソースにサイズを制御する行がある
この値を変更し、結果を見ることができます。値が100より大きい場合、速度は上がりません。全部で同じ数の要素がコピーされるので、実は簡単に説明できる。また、コピー部分が小さいことに起因する速度低下も解消されます。
すでに 最高性能にロック オンされているのではと思うのですが。
はい、そうですね。
試してみたところ、TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4と同じ結果になりました。
ソースコードがあるんだから、自分で測ればいいんだよ。
だから測ってください。私はそうではないと確信しているので、記事にも測定にも無駄な時間を費やす意味はないと思います。
すでに 性能の限界にきているのでは?
正直なところ、よくここまでmemcpyに迫ったものだと思います。そんなはずはないのです。何かがおかしい。
もう 最高性能にこだわっているようです。
あなたの大変な誤算がわかったような気がします。
あなたのBANCHは、最低50本の全く同じランを選択します。
しかし、コンパイラは大賢者で怠け者だ。同じ仕事を50回することはなく、コードを最適化することができます。そのため、少なくとも1回実行するごとにアレイを変更する必要があります。あるいは、50を1に置き換えて、テスト回数を増やしてもよい。そうすれば、結果はまったく違ったものになり、より客観的なものになるはずです。
memcpyとの差が40%であれば、より妥当なところでしょう。
配列を圧縮することで効果があるのかなと思います。刻み目の配列は10-12倍に圧縮することができます。ただ、これで結果的にリソースを介した送受信の時間が短縮されるかどうかが問題です。
あなたのBANCHは、絶対に同一の50本のランのうち最小のものを選択します。
しかし、コンパイラは大賢者で怠惰なのです。同じ仕事を50回するのではなく、コードを最適化するのです。
コードは、やるべきことを正確に実行するように書かれています。コンパイラはmemcpyの 速度に影響を与えることはできませんが、パスの結果は以下のようになります。
1パスのループ
50点満点中
このコードは、あなたがやりたいことをそのまま実現するように書かれています。コンパイラはmemcpyの速度に影響を与えることはできないが、パスの結果は
1パスのループ
50点満点中
だから測ってください。私はそうではないと確信しているので、記事にも測定にも無駄な時間を費やす意味はないと思います。
その必要はない