記事についてのディスカッション

 

新しい記事「数式の計算(第2部)Prattパーサーおよび操車場パーサー」はパブリッシュされました:

この記事では、演算子の優先順位に基づいたパーサーを使用した数式の解析と評価の原則について検討します。Prattパーサーと操車場パーサー、バイトコードの生成とこのコードによる計算を実装し、式の関数として指標を使用する方法と、これらの指標に基づいてエキスパートアドバイザーで取引シグナルを設定する方法を確認します。

ストラテジーテスターでEAを起動した場合、結果はあまり良くない可能性があります。ただし、重要なのは、EAの取引と取引はパーサーによって管理されるということです。既製の収益性の高いシステムを提供するものではありませんが、戦略を見つけるための追加のツールを提供します。

式で計算されたシグナルを使用した取引の例

式で計算されたシグナルを使用した取引の例

作者: Stanislav Korotky

 
パフォーマンスを比較するときは、純粋なMQLと比較してください。
 

ネイティブの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ビットを許容することができます。まあ、ボスはボスだ :-)

 
Maxim Kuznetsov:

今はただ褒めることしかできない。

もちろん、ダイクストラについて言及する価値はあるだろう。歴史的に見れば、シューティングヤードは彼と関係が深いのだから。

私は同じような記事を作るアイデアを持っていた、私は自分自身のために材料をタイプしていた、あなたはそれを私に先んじた(パート2について)、しかし、私はすべての通常のものが砦とスタックマシンにロールバックされていた

でも、私はいつものように砦とスタックマシンの中にすべてのものを転がしていた!

ケーキの上のチェリーはYコンビネーターだろう。

PS.しかし、あなたのバイトコードは "広すぎる "ように見えるし、クラスによって殺される。口笛を吹いて64ビットを許容することができます。まあ、ボスはボスだ :-)

バイトコードの縮小、高速化、新しいタイプのパーサーなどの続編を書くことができる。本当は1つの記事を書くつもりだったのだが、いつものように収まらなかった。

 
Stanislav Korotky:

バイトコードの縮小、高速化、新しいタイプのパーサーなど、続編を書くことができる。すべてをカバーすることはできなかった。実際、1つの記事を書くつもりだったが、いつものように収まらなかった。

バイトコードは仮想マシンに 依存する。一方では、「2つの数字の加算」というオペコードに128ビット以上を与えたくなる.

新しいタイプのパーサーはまだ発明されていないし、それらはすべて何年も前のものだ。

PS 端末ユーザーのニーズに応えるソート・ステーションは、もう限界だ。

 
他の記事と違って、この2つの記事はとても良い。分かりやすく、詳細で、アクセスしやすい。ありがとう。
 
計算機1.1の更新版が粒子群最適化についての 記事に添付されている。さらに、ディスカッションの中に小さなバグフィックスがあります。
Параллельная оптимизация методом роя частиц (Particle Swarm Optimization)
Параллельная оптимизация методом роя частиц (Particle Swarm Optimization)
  • www.mql5.com
Как известно, MetaTrader 5 позволяет оптимизировать торговые стратегии с помощью встроенного тестера на основе двух алгоритмов: прямого перебора входных параметров и генетики (генетический алгоритм - ГА). Генетическая оптимизация является одной из разновидностей эволюционных алгоритмов, которые предоставляют значительное ускорение процесса...
 
このような文字列のパーサーの使い方を教えてください。
"(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);
 
fxsaber:
このような文字列に対するパーサーの使い方を教えてください。

主な難点は、式の中のすべての変数名を決定することです。似たようなことが書けるように。

TestSuiteEvaluator evaluator("EURUSD=1.5;GBPUSD=2.5;AUDUSD=5");
 
パーサから見て、変数がビッドとアスクの2つの値を持つことはできません。おそらく、コンポーネントを関数でラップすることは可能でしょう(Bid(symbol)、Ask(symbol)関数を導入するか、コンポーネントの数があらかじめ定義されている場合は、「バスケット」関数全体を導入します)。基本的に、元の問題は明確ではありません:3つのシンボルからなる合成/バスケットについて話している場合、その中で各コンポーネントは、方向に応じて、AskまたはBidのいずれかによって一義的に取得されます。また、取引の方向性によって異なる表現を選択することもできます。