アルゴリズムの最適化 - ページ 7

 
komposter:

なぜ、そう言い切れるのですか?

私のチェックでは、そうではありません。

mq4スクリプトは添付ファイルにあります。

ループ分割の方が本当に速く動作するようです。でも、パスが2回になるから、わけがわからない。
 
しかし、それでも最速の選択肢とは言えません。でも、これは私の方で、速攻で書かないので「ぼちぼち」です。
 
hrenfx:
しかし、それでも最速の選択肢とは言えません。でも、速攻で書くことはないので、私の方では「ぼちぼち」です。
私もそうです。でも、もっと早くてもいいと思います。
 
hrenfx:
しかし、それでも最速の選択肢とは言えません。でも、速攻で書かないので、私の方では「ぼちぼち」です。
MetaDriver
私もしません。でも、もっと速くてもいいと思う。

やめてくれ!ボロボロ:(

このアルゴリズムは、私が自分で書きますよ。ただ、今は体調が悪いので、1週間は先延ばしにしなければなりません。

 
TheXpert:
C.T.D.さんは、最初の投稿でまさにそのことを書いています。
プライオリティを主張するわけではなく、提案にちょっとだけ賛同したのです。"本当は 2サイクルに分けた方が良い")
 
C-4:
サイクルスプリッティングは、より高速に動作するようです。でも、パスが二つになると、わけがわからなくなる。
なぜなら、各パスは2倍のチェックがあり、パス自体が短くなる(早々に中断される)ことが多いからです。
 
MetaDriver:
そして、私はそうしない。でも、もっと早くてもいいと思います。

私もそうですが、もっと速くなることは間違いなく可能です ;)

今気づいたのですが、ブレイクが1つ足りないので、今更深追いできないですね。

 

以下は最終的なコードです。最大探索関数を提示する。極小値を求める機能も同様である。

private BitArray Up()
        {
            BitArray bits = new BitArray(MyQuotes.Count);
            double max = double.MinValue;
            int pperiod = (Period - 1) / 2;
            int bar = pperiod;
            int count = MyQuotes.Count - pperiod;
            //последняя позиция второго перебора.
            int pos = bar;
            bool rev = false;
            int rpos = bar;
            bool FirstEnter = false;
            while (bar < count - 1)
            {
                for (int i = 1; i <= pperiod; i++)
                {
                    max = MyQuotes.High[bar - i] > MyQuotes.High[bar + i]
                              ? MyQuotes.High[bar - i]
                              : MyQuotes.High[bar + i];
                    pos = bar + i;
                    if (max > MyQuotes.High[bar])
                    {
                        bar = pos;
                        break;
                    }
                    if (MyQuotes.High[bar + i] == MyQuotes.High[bar] && FirstEnter == false)
                    {
                        rev = true;
                        rpos = bar + i;
                        FirstEnter = true;
                    }
                    if (i == pperiod)
                    {
                        bits[bar] = true;
                        bar = rev ? rpos : pos;
                        rev = false;
                        FirstEnter = false;
                    }
                }
            }
            return bits;
        }

ここでは、その性能テストを紹介します。

3       00:00:00.5070290
4       00:00:00.3920224
5       00:00:00.3960227
6       00:00:00.3620207
7       00:00:00.3570204
8       00:00:00.3230185
9       00:00:00.3350192
10      00:00:00.2820161
11      00:00:00.2910166
12      00:00:00.2730157
13      00:00:00.2990171
14      00:00:00.2450140
15      00:00:00.2770158
16      00:00:00.2890165
17      00:00:00.2480142
18      00:00:00.2400138
19      00:00:00.2530144
20      00:00:00.2410138
21      00:00:00.2660152
22      00:00:00.2310132
23      00:00:00.2350135
24      00:00:00.2290131
25      00:00:00.2300131
26      00:00:00.2390137
27      00:00:00.2290131
28      00:00:00.2350135
29      00:00:00.2290131
30      00:00:00.2530144
31      00:00:00.2200126
32      00:00:00.2680153
33      00:00:00.2250129
34      00:00:00.2260129
35      00:00:00.2360135
36      00:00:00.2240128
37      00:00:00.2240128
38      00:00:00.2260129
39      00:00:00.2160124
40      00:00:00.2390137
41      00:00:00.2190125
42      00:00:00.2270130
43      00:00:00.2210126
44      00:00:00.2090120
45      00:00:00.2360135
46      00:00:00.2210126
47      00:00:00.2550146
48      00:00:00.2170124
49      00:00:00.2220127
50      00:00:00.2180124
51      00:00:00.2090120
52      00:00:00.2180125
53      00:00:00.2380136
54      00:00:00.2170124
55      00:00:00.2270130
56      00:00:00.2070118
57      00:00:00.2200126
58      00:00:00.2230128
59      00:00:00.2080119
60      00:00:00.2400137
61      00:00:00.2160123
62      00:00:00.2100120
63      00:00:00.2240128
64      00:00:00.2220127
65      00:00:00.2170124
66      00:00:00.2100120
67      00:00:00.2100121
68      00:00:00.2260129
69      00:00:00.2160123
70      00:00:00.2240128
71      00:00:00.2110121
72      00:00:00.2190125
73      00:00:00.2140123
74      00:00:00.2110121
75      00:00:00.2260129
76      00:00:00.2090119
77      00:00:00.2230128
78      00:00:00.2080119
79      00:00:00.2070118
80      00:00:00.2510144
81      00:00:00.2180125
82      00:00:00.2080119
83      00:00:00.2070118
84      00:00:00.2060118
85      00:00:00.2060118
86      00:00:00.2070118
87      00:00:00.2100120
88      00:00:00.2060118
89      00:00:00.2080119
90      00:00:00.2710155
91      00:00:00.2180125
92      00:00:00.2110120
93      00:00:00.2080119
94      00:00:00.2060118
95      00:00:00.2060118
96      00:00:00.2020116
97      00:00:00.2080119
98      00:00:00.2100120
99      00:00:00.2090119

処理速度が質的に向上し、極値の周期に依存しなくなったことがわかる。確かにNが小さいと、特に期間3ではさらに遅くなるが、Nが大きくなると急激に速度が上がり、2倍近い速さになる。

これは、ブレイクジャンプやインデキシングトランジションに時間がかかり、長い距離で効果を発揮するためと思われます。小さなNでは、真っ向からブルートフォースする方が速いことが判明した。

追伸:Up()とDown()の両関数の実行を非同期実行モードにしてみました。つまり、両方のコアで同時に実行することができるのです。しかし、性能は上がりませんでした。どうやら、パスそのものはリソースを消費せず、ほとんどの時間は データの準備と解析に費やされ、反復処理そのものには使われていないようです。

 
hrenfx:
しかし、それでも最速の選択肢とは言えません。でも、これは速攻で書かないので、私の方では「ぼちぼち」です。

まだ関連性がある。

追伸

C-4:

処理速度が質的に向上し、極値期間に依存しなく なったことがわかる。

次第で、悪くもない。あなたの場合、そのようなソースコード(CVR)があるだけで、最小のNで終わっていますね。一般に、実行速度の周期依存性のグラフは、あなたのものとは著しく異なる場合があります。
 
hrenfx:

まだ関連性がある。

追伸

次第で、悪くもない。あ なたの場合、最小Nで終了するソース(TSS)だけです。一般に、実行速度の周期依存性のグラフは、あなたのものとは大きく異なる場合があります。

賛否両論ある発言。アルゴリズムはシングルパスであり、反復回数、ひいては速度はNにほとんど依存しない。ただ、アルゴリズムの特性として、BPの価格の極値が互いに等しいと、パフォーマンスが大きく低下してしまうことがあります。それ以外の場合は、依存関係を維持する必要があると思います。この場合、古典的な正規分布のランダムウォークをBPとした。