何らかの形でトレードに関連する脳トレタスクを実施。理論家、ゲーム理論など - ページ 22

 
new-rena:
大丈夫です。すでにコードを 掲載しました。正解に揺さぶりをかけて、それで終わり。

結果は教えていただけますか...?:-)
 
new-rena:
不思議ですね~、正弦波でない幾何学的な進行のような感じでしょうか?
 
avtomat:

とてもまっとうなことです。I.e.私たちは、その後pipsで1ロットずつ開くごとにトレンドの反転に近づいているので、注文サイズは大きくしないが、何かあったときのために開いておくと言います)))。
 

レナート、では方程式を解いたり、何か他のことが必要なのでしょうか?

もし方程式が

MiniLot^(x^0)+MiniLot^(x^1)+MiniLot^(x^2) ... + MiniLot^(x^(N-1))=VolMax

がxに関して解かれるのであれば、ニュートン法 かセカント法で 簡単に解けます。ただし、MiniLot、VolMax、Nを指定する必要があります。

 
new-rena:
それはかなりまともだ。すなわち、その後のロットオープンのステップがpipsで進むごとにトレンドの反転に近づいているので、注文サイズは大きくしないが、何かあったときのためにオープンしておくと言うことです)))

それはどうでしょう...。ただ問題を解いていただけなんです...反転とかトレンドとか、そういうことではないんです。

それについても、私なりに考えてはいるんです。

 
Mathemat:
レナート、では方程式を解いたり、何か他のことが必要なのでしょうか?

今度はその解を式の形で書いてみたい。もう、計算式を導き出す。

ありがとうございました。

 
new-rena: 今度はその解を式の形で書いてみたい。もう、計算式は出来上がっているんです。
数式を導き出しても、脳ががんがんしちゃうよ。しかし、それを近似的に解く関数を書くことは可能である。しかし、それはもちろんxに関して解かなければならない場合です。
 
Mathemat:
数式を導き出しても、脳にガンができるぞ。しかし、それを近似的に解く関数を書くことができる。しかし、それはもちろんxに関して解かなければならない場合です。
したのですが、本当に機能
 
new-rena: 完了、確かに関数

見せてください。

P.S. 私の脳は、このような奇妙で異質な問題を解くことを拒否しています。一次導関数の単調性は尊重されない。そして、このことが、xに関する方程式を、セカント/ニュートン法で簡単に、単純に解くことを妨げている。ダム検索(強く最適化)すると割とすぐに解決しますが。

しかし、2倍ではなく、単純な掛け算であれば、すべてが簡単でわかりやすいのですが。

ここで、最も間抜けなアルゴリズムを紹介します。早いんですけどね。10^(-8)の精度を得るためには、約50回の反復が必要です。

手始めに前ページのavtomat さんの写真です。

そして今度は私のです(同じパラメータ)。

そして、コード。

#property show_inputs

extern double _MiniLot = 0.01;
extern double _N = 77;
extern double _VolMax = 5.96;
extern double _err = 0.0000000001;
extern double _parts = 7;


double resolve( double err, int& count )
{
   double currErr = 10;
   double xLeft = 0.00000001;
   double xRight;
   double valLeft, valRight;
   double step = _VolMax / _parts;
   count = 0;
   while( step > err )
   {
      count ++;
      xRight = xLeft + step;
      valLeft = funct( xLeft );
      valRight = funct( xRight );
      if( valLeft * valRight > 0 )     
      { 
         xLeft += step; 
         continue; 
      }
      else                             step /= _parts;
   }
   return( xLeft );
}//+------------------------------------------------------------------+


      double funct( double x )
      {
         double sum = 0;
         for( int i = 0; i < _N; i ++ )
         {
            double xPowered = MathPow( x, i );
            sum += MathPow( _MiniLot, xPowered );
         }   
         return( sum - _VolMax );
      }//+------------------------------------------------------------------+




int start( )
{
   int st = GetTickCount( );
   int count;
   double x = resolve( _err, count );
   double gone = ( GetTickCount( ) - st ) / 1000.;
   Print( "Root is x = " + x + "; funct is f = " + funct( x ) + "; gone " + gone + " sec.; count = " + count  + " steps");
   return( 0 );
}//+------------------------------------------------------------------+

追伸:このアルゴリズムは、この関数に対してのみ有効であることを念頭に置いておくとよいでしょう。単調であるため、ルートは1つである。残念ながら、一次導関数が非単調であるため、タンジェント法を適用することはできません。True, 損失は全く感じられない -GetTickCount()を使った計算時間はカウントされない。

 

解決策にはもう一工夫

を完成させてください;))