メタトレーダー5でのシンボルとデータフィード - ページ 11

 

最大値の2つの偶数プラトーを含む別のテスト関数を追加します。

z = abs(tanh(x) + tanh(y))

z = abs(tanh(x) + tanh(y))

X,Yを-20から+20までステップ0.1で変更した場合、完全な反復には160801回の反復が必要です。

テストでは、両方のプラトーが1400回の反復で見られ、これは完全な探索の1%未満である。

これをGAで動かす人はいるのでしょうか?比べてみると面白い。

 
event:

最大値の2つの偶数プラトーを含む別のテスト関数を追加します。

z = abs(tanh(x) + tanh(y))

X,Yを-20から+20までステップ0.1で変更した場合、完全な反復には160801回の反復が必要です。

テストでは、両方のプラトーが1400回の反復で見られ、これは完全な探索の1%未満である。

これをGAで動かす人はいるのでしょうか?比べてみると面白い。

GAで見ていないのですか?

最適化された関数の2つの引数で作業しても、全く指標になりません。探索空間が小さいだけでなく、探索アルゴリズム自体の「悪い」性質が現れることがあるからだ。

数式を少なくとも10個の引数を持つ形式に変換すると、アルゴリズムの正負の特性がすべて表示されます。

 
joo:

GAで見るのではないのですか?

最適化された関数の2つの引数で作業しても、全く指標になりません。探索空間が小さいだけでなく、探索アルゴリズム自体の「悪い」性質が現れることがあるからだ。

数式を少なくとも10個の引数になるような形に変換する - アルゴリズムの正負の特性がすべて一度に表示されるようになる。

これはGAではなく、スレッド内に記事へのリンクがあります。

上記では、6つのパラメータを持つ例を掲載しました。パラメータをたくさん表示することの難しさ全体。

もし、もっと多くのパラメータを持つ関数を提案されたら、私はテストを行います。

 
event:

もし、もっと多くのパラメータを持つ関数を提案されたら - テストをしてみます。

Y=a+bです。

のところです。

a=Skin(x1, y1)+Skin(x2, y2)+Skin(x3, y3)+Skin(x4, y4)+Skin(x5, y5)となる。

b=Skin(x6, y6)+Skin(x7, y7)+Skin(x8, y8)+Skin(x9, y9)+Skin(x10, y10)となる。

スキン機能がどこにあるかは、もうお分かりですね。

つまり、20個の変数があり、Y関数は非常に視覚化しやすいのです。この原理を使えば、引数の数が無限にある関数を作っても、可視化することができるのです。

そしてそれに従って、最終結果は極限の既知の値に対してY*2/nとしてチェックされる(ここでnは引数の総数)。

 
Laryx:

また、「アンダーステア」では数十時間、「MT」では数ヶ月で完全なオーバーステアになるようなアルゴリズムの例を教えてください。

また、最適化ヒューリスティックよりも高速に完全探索を行うことも現実的である。MTにおける完全なブルートフォース攻撃は、独立した実行の集合として表現される。実際、最適化を1つの計算問題として考え、アルゴリズムによる最適化を適用することは常に可能です。

この方法では、ほとんどすべての計算がキャッシュされるため、パスの順序が非常に重要である。TCのほとんどすべての(すべて独立した)入力パラメータに対して、オプティマイザには常にグローバルバッファがあり、以前のパスの値を保存しています。

例えば、MA MAやPriceChannelを使用します。これらの指標は、それぞれ独立した入力パラメータを持っています。このため、各インジケータに対して、グローバルバッファを満たすための関数を規定します(実際には数行ですが、OOPではさらに美しくなるはずです)。そして、各指標の資源強度を比較します(PriceChannelはMAより重い)。重い指標の入力パラメータは外部ループ(最初のfor)で、単純な指標は内部ループ(ネストしたfor)で列挙され始める。

ここで大きな収穫を得ることができました。さらに、C++や整数計算、無駄なチェックをしない独自のオーダーシステムもあります。そうやって、結果を出していくのです。その結果、シングルランはMTに比べて少なくとも1桁以上高速化された。そして、その最適化は桁違いに速いのです。

MT-optimizerに欠けているのは、得られた最適化結果の 行列に完全にアクセスするためのOnOptimization機能である。そこで、得られたマトリックスに対して、フィルタリング、取引時間によって重複しない注文のパスの結合など、さまざまな分析を行います。しかし、さらに有用なのは、適切なポートフォリオの形でメタTSを構成するための、各パスに対する重み係数の計算である。これを実現するために、OnOptimizationは「絶望的」ではない各パスに対してvector-Equityを持っています。

しかし、アンダーテスターは、動作するTSを探す段階で発明されるのではなく、残念ながら既に見つかってしまった段階で発明される。検索そのものは、説明文なしという全く別のステージになります。
 
event:

誰かGAで動かしてくれないかな?比べてみると面白い。

 
joo:

Y=a+bです。

のところです。

a=Skin(x1, y1)+Skin(x2, y2)+Skin(x3, y3)+Skin(x4, y4)+Skin(x5, y5) となる。

b=Skin(x6, y6)+Skin(x7, y7)+Skin(x8, y8)+Skin(x9, y9)+Skin(x10, y10)となる。

スキン機能がどこにあるかは、もうお分かりですね。

つまり、20個の変数があり、Y関数は非常に視覚化しやすいのです。この原理を使えば、引数の数が無限にある関数を作っても、可視化することができるのです。

そしてそれに従って、最終結果は極限の既知の値に対してY*2/nとしてチェックされる(ここでnは引数の総数)。

こわいものみたさ)また、「機能Yが非常に可視化 しやすい」ことを説明できますか?
 
Serj_Che:
何回パスして、どの程度の可変ピッチで計算するのでしょうか?
 
event:
何パスで、何ステップの変数で計算するのですか?

絵が嫌いな人は気にしない?

MT5の64bitGAは非常に優秀で、あらゆる問題を解決してくれます。

このスレでGAについて語ってるのがどこのオタクかわからん。

GAに問題があるのではなく、テスター自体が使い物にならないのだと思います。特に取引所では、間違った相場履歴の保存や自分の履歴の保存が不可能なため、使い物になりません。

この問題が解決されればいいのですが、3~5年待たないといけないようです。

 
zaskok:

例えば、MAやPriceChannelを使用します。これらの指標は、それぞれ独立した入力パラメータを持っています。したがって、各インジケータには、対応するグローバルバッファを埋める関数が書かれています(実際には数行ですが、OOPではさらに美しくなるはずです)。そして、各指標の資源強度を比較します(PriceChannelはMAより重い)。重い指標の入力パラメータは、外部ループ(最初のfor)で列挙され、単純な指標は内部ループ(ネストされたfor)で列挙され始める。

何か、このやり方はGAでも簡単にできそうな気がします。作業量もほぼ同じです。インナーループ」は、どのパスでも通過している...。

しかし、最も重要なことは、それがどれほどの需要になるのか、ということです。おそらく、誰もが単純なカスタムOnTester() 関数を 使用するわけではありません。しかし、これは非常に強力な最適化ツールなのです。

例えば、私の実装の一つを紹介します。

double CDoublePeakBottomAdvisorPartsFactory::MyOnTester(CMyExpertT* pmeExpert)
{
   ulong ulTickedTime = pmeExpert.GetTickedTime();
   uint  uiTotalNumberOfSL = pmeExpert.GetNumOfLosePositions();

   double dDDPercent = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   double dStartBalance = TesterStatistics(STAT_INITIAL_DEPOSIT);
   double dProfit = TesterStatistics(STAT_PROFIT);
   double dNumOfTrades = TesterStatistics(STAT_TRADES);
   double dNumOfProfitTrades = TesterStatistics(STAT_PROFIT_TRADES);
   double dMaxNumOfSL = TesterStatistics(STAT_MAX_CONLOSS_TRADES);
   double dRecoveryFactor = TesterStatistics(STAT_RECOVERY_FACTOR);
   double dProfitTradesPerWeek = dNumOfProfitTrades/ulTickedTime*SECS_IN_WEEK;
   double dProfitPerDay = dProfit/ulTickedTime*SECS_IN_DAY;
  

   Print("Ticked time (days): ",DoubleToString(ulTickedTime/SECS_IN_DAY,2));

   Print("Number Of Trades: ",DoubleToString(dNumOfTrades,1));

   if(dNumOfTrades == 0)
      {
      Print("Ни одного трейда !");
      return(-100000);
      };


   if(dMaxNumOfSL > uiIMaxNumOfSeqSL)
      return(-10000 - dMaxNumOfSL*100 + dProfit/1000);
  
   
   double dBarsPerTrade = ((double)ulTickedTime/PeriodSeconds(m_didData.m_etTimeFrame))/dNumOfTrades;

   if((bILongAllow == false) || (bIShortAllow == false))
      dBarsPerTrade /= 2;
   
   if(dBarsPerTrade < MIN_BARS_PER_TRADE)
      return(dBarsPerTrade-MIN_BARS_PER_TRADE + dRecoveryFactor);

   Print("Max number Of SL: ",DoubleToString(dMaxNumOfSL,1));

   if(iIMaxNumOfSeqSLForQualify > 0 && dMaxNumOfSL > iIMaxNumOfSeqSLForQualify)
      {
      Print("Слишком много СЛ подряд !");
      return(dRecoveryFactor - (dMaxNumOfSL-iIMaxNumOfSeqSLForQualify)*1000)-10000;
      };

   Print("Bars Per Trade (half): ",DoubleToString(dBarsPerTrade,1));
        
   if(dBarsPerTrade > MAX_BARS_PER_TRADE)
      {
      Print("Слишком редкие трейды !");
      return(dRecoveryFactor - dBarsPerTrade/100);
      };
     

   Print("Profit: ",DoubleToString(dProfit,3));
   Print("Profit per day: ",DoubleToString(dProfitPerDay,3));
   Print("Число СЛ: ",IntegerToString(uiTotalNumberOfSL));


   Print("Приемлемая торговля.");
   
   return(dRecoveryFactor + (1-(uiTotalNumberOfSL/dNumOfTrades))*100);
};

ここではリカバリーファクターに基づいていますが、最小限の連続したSLと、かなり頻繁なトレードで実行されることを強調しています。

しかし、私が思うに、ほとんどの場合、標準的なオプションを使用しているのです。