アルゴリズム、解法、性能比較 - ページ 22

 

2269に更新しました。大規模な(非合成)EAのプロファイラ結果。


テスター



バーチャル


おそらく、プロファイラーが間違った計測をしているのでしょう。それ以外の場合、OrderSend 5は平均で912msかかることが判明しました。

 

同じアルゴリズムで正規化されたダブ ルは (NormalizeDouble などで) 直接比較することができる。


この明らかな事実により、多くの場合、実数比較のためのコストのかかる構成を避けることができる。一部のタスクでは、パフォーマンスを大幅に向上させることができます。

その代表的なものが「テスター」ではないでしょうか。例によって分析してみよう。


BuyLimitがあります。各ティックで、BuyLimitとAsk価格を比較する必要があります。現在、標準のテスターではこのような方法になっています。

if (NormalizeDouble(BuyLimit_Price - Ask , Symbol_Digits) >= 0)
  BuyLimit -> Buy;


つまり、どのような取引レベル(保留注文 またはSL/TP)でも、1つのNormalizationをトリガーします。


しかし、事前に(バックテスト前に)価格が正規化されていれば、非常に効果的な比較構成で常にやり過ごすことができます。

if (BuyLimit_Price >= Ask)
  BuyLimit -> Buy;


比較してみよう。このロボットをテスターでVirtualを通して動かしてみました。

#include <MT4Orders.mqh>

#define  VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#include <fxsaber\Virtual\Virtual.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

input int inAmountOrders = 10;
input int inFakeRange = 0;

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    for (int i = 0; i < inAmountOrders; i++)    
      OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask - 10000 * _Point, 0, 0, 0);
      
    FirstRun = false;
  }
}


正規化により価格を比較する。

pass 0 returned result 100000.000000 in 0:00:01.578
pass 1 returned result 100000.000000 in 0:00:00.759
pass 2 returned result 100000.000000 in 0:00:00.894
pass 3 returned result 100000.000000 in 0:00:00.769
pass 4 returned result 100000.000000 in 0:00:00.806
pass 5 returned result 100000.000000 in 0:00:00.772
pass 6 returned result 100000.000000 in 0:00:01.253
pass 7 returned result 100000.000000 in 0:00:01.200
pass 8 returned result 100000.000000 in 0:00:01.089
pass 9 returned result 100000.000000 in 0:00:00.780
pass 10 returned result 100000.000000 in 0:00:01.258
optimization finished, total passes 11
optimization done in 0 minutes 11 seconds
shortest pass 0:00:00.759, longest pass 0:00:01.578, average pass 0:00:01.014


正規化しない場合。

pass 0 returned result 100000.000000 in 0:00:01.743
pass 1 returned result 100000.000000 in 0:00:00.844
pass 2 returned result 100000.000000 in 0:00:00.672
pass 3 returned result 100000.000000 in 0:00:00.817
pass 4 returned result 100000.000000 in 0:00:00.635
pass 5 returned result 100000.000000 in 0:00:00.604
pass 6 returned result 100000.000000 in 0:00:00.867
pass 7 returned result 100000.000000 in 0:00:00.611
pass 8 returned result 100000.000000 in 0:00:00.899
pass 9 returned result 100000.000000 in 0:00:00.649
pass 10 returned result 100000.000000 in 0:00:00.742
optimization finished, total passes 11
optimization done in 0 minutes 09 seconds
shortest pass 0:00:00.604, longest pass 0:00:01.743, average pass 0:00:00.825


価格比較の際に正規化を行わない場合、20%以上の利得があることがわかる。


その結果、社内テスターを正規化価格に切り替え、価格比較の際に内部正規化を行わないようにすれば、大幅な性能向上が期待できる。

 
行列演算を行わない直接代入の後でも
 
TheXpert:
マットなしの直接配属後。 事業も

プリフィクスはもちろん、数値のバイト表現をそのままコピーする。

 

わかりやすくするために、1秒より長くテストをしたほうがいいのでしょうか?

1つのバージョンで、最短パス0:00:00.604、最長パス0:00:01.743と3回の広がりがありますが、何を比較するのでしょうか?

 
Andrey Khatimlianskii:

わかりやすくするために、1秒以上のテストをするとか?

1つのバージョンで、最短パス0:00:00.604、最長パス0:00:01.743と3回の広がりがありますが、何を比較するのでしょうか?

もちろん、最短を比較する。フィルター付きのティックでのレースには慣れているんだ。後日、無濾過のものを用意する予定です。

 
fxsaber:

もちろん、最短を比較しています。

なぜ?最適化は1回で終わるものではありません。平均が大して変わらないのに、1パスがやたらと速いのはどういうことなのか。


fxsaber

フィルター付きのティックでのレースには慣れているんだ。後日、無濾過のものを用意する予定です。

もっと長いインターバルをすればいいんです。テストは30秒以上。

 
Andrey Khatimlianskii:

なぜ?最適化は1回で終わるようなものではありません。平均が大して変わらないのに、1パスがやたらと速いのはどういうことなのか。

このパラメータは最適化されています。

input int inFakeRange = 0;

また、ロジックに影響を与えることはありません。だから、最短なんです。

 
fxsaber:

このパラメータは最適化されています

また、ロジックに影響を与えることはありません。だから、最短なんです。

EAのロジックはどうなっているのでしょうか?テスターの速度を測定しているところです。

 
Andrey Khatimlianskii:

EAのロジックはどうしたんだ?テスターの速度を測定しているところです。

このように1つのエージェントが同じものを連続してカウントしていくのです。ランダム性をすべて取り除けば、正味の性能は最短に近くなる。