ネイティブのMQL5を考慮した性能比較は以下の通り:
ExpresSParserS (EURUSD,D1) Evaluation: 105109 ExpresSParserS (EURUSD,D1) Compilation: 26090 ExpresSParserS (EURUSD,D1) Pratt bytecode: 24030 ExpresSParserS (EURUSD,D1) Pratt: 26567 ExpresSParserS (EURUSD,D1) ShuntingYard: 23884 ExpresSParserS (EURUSD,D1) MQL5: 12901
MQL5は提示された最速パーサーより約2倍速い。
テストコードを追加しました:
class FuncCalc { private: double a; double b; double c; public: void setup(double _a, double _b, double _c) { a = _a; b = _b; c = _c; } double execute() { return (a + b) * (c > 10000 ? c / 4 : c * 4); } }; ulong testMQL5(const int n) { ulong ul = 0, total = 0; double r; FuncCalc f; for(int i = 0; i < n; i++) { f.setup(rand(), rand(), rand()); ul = GetMicrosecondCount(); r = f.execute(); total += GetMicrosecondCount() - ul; } return total; }
これは概算である。まだまだ研究の余地(例えば、異なるタイプの式など)やパーサーの最適化の余地があります。
今、私はただ称賛することしかできない。
もちろん、私はダイクストラについて言及すべきだった。歴史的に見れば、シューティング・ヤードは彼との結びつきが強いからだ。
私は同じような記事を作るアイデアを持っていて、自分のために資料をタイプしていたんだ。
しかし、私は何でも砦やスタックマシンに巻き込んでしまう癖があった!
ケーキの上のチェリーはYコンビネーターだろう。
PS.しかし、バイトコードは "広い "ことが判明し、クラスに殺された。口笛吹いて、64ビットを許容することができます。まあ、ボスはボスだ :-)
今はただ褒めることしかできない。
もちろん、ダイクストラについて言及する価値はあるだろう。歴史的に見れば、シューティングヤードは彼と関係が深いのだから。
私は同じような記事を作るアイデアを持っていた、私は自分自身のために材料をタイプしていた、あなたはそれを私に先んじた(パート2について)、しかし、私はすべての通常のものが砦とスタックマシンにロールバックされていた
でも、私はいつものように砦とスタックマシンの中にすべてのものを転がしていた!
ケーキの上のチェリーはYコンビネーターだろう。
PS.しかし、あなたのバイトコードは "広すぎる "ように見えるし、クラスによって殺される。口笛を吹いて64ビットを許容することができます。まあ、ボスはボスだ :-)
バイトコードの縮小、高速化、新しいタイプのパーサーなどの続編を書くことができる。本当は1つの記事を書くつもりだったのだが、いつものように収まらなかった。
バイトコードの縮小、高速化、新しいタイプのパーサーなど、続編を書くことができる。すべてをカバーすることはできなかった。実際、1つの記事を書くつもりだったが、いつものように収まらなかった。
バイトコードは仮想マシンに 依存する。一方では、「2つの数字の加算」というオペコードに128ビット以上を与えたくなる.
新しいタイプのパーサーはまだ発明されていないし、それらはすべて何年も前のものだ。
PS 端末ユーザーのニーズに応えるソート・ステーションは、もう限界だ。

- www.mql5.com
"(EURUSD^2) / (GBPUSD * AUDUSD)"
難しいのは、どのような場合に、どこでbid/askを置き換えるかを自動的に判断する必要があることです。
上の例では次のようになります。
Value_Bid = (EURUSD_Bid * EURUSD_Bid / (GBPUSD_Ask * AUDUSD__Ask); Value_Ask = (EURUSD_Ask * EURUSD_Ask / (GBPUSD_Bid * AUDUSD__Bid);
Bid/Askを決定するアルゴリズムは次のようになる。同じ例を使って
F(EURUSD, GBPUSD, AUDUSD) = (EURUSD^2) / (GBPUSD * AUDUSD); bool EURUSD_flag = (F(1, 1, 1) < F(2, 1, 1)); bool GBPUSD_flag = (F(1, 1, 1) < F(1, 2, 1)); bool AUDUSD_flag = (F(1, 1, 1) < F(1, 1, 2)); Value_Bid = F(EURUSD_flag ? EURUSD_Bid : EURUSD_Ask, GBPUSD_flag ? GBPUSD_Bid : GBPUSD_Ask, AUDUSD_flag ? AUDUSD_Bid : AUDUSD_Ask); Value_Ask = F(EURUSD_flag ? EURUSD_Ask : EURUSD_Bid, GBPUSD_flag ? GBPUSD_Ask : GBPUSD_Bid, AUDUSD_flag ? AUDUSD_Ask : AUDUSD_Bid);
このような文字列に対するパーサーの使い方を教えてください。
主な難点は、式の中のすべての変数名を決定することです。似たようなことが書けるように。
TestSuiteEvaluator evaluator("EURUSD=1.5;GBPUSD=2.5;AUDUSD=5");

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「数式の計算(第2部)Prattパーサーおよび操車場パーサー」はパブリッシュされました:
この記事では、演算子の優先順位に基づいたパーサーを使用した数式の解析と評価の原則について検討します。Prattパーサーと操車場パーサー、バイトコードの生成とこのコードによる計算を実装し、式の関数として指標を使用する方法と、これらの指標に基づいてエキスパートアドバイザーで取引シグナルを設定する方法を確認します。
ストラテジーテスターでEAを起動した場合、結果はあまり良くない可能性があります。ただし、重要なのは、EAの取引と取引はパーサーによって管理されるということです。既製の収益性の高いシステムを提供するものではありませんが、戦略を見つけるための追加のツールを提供します。
式で計算されたシグナルを使用した取引の例
作者: Stanislav Korotky