エラー、バグ、質問 - ページ 443

 
voix_kas:

結果

私のやり方が間違っているのか(修正してください)、MetaDriverが(アルゴリズムを設計する際に)理論的に間違えたのか、どちらかです。

:)

アルゴリズムの設計に3分(実装に7分)かかったことを考えると、かなりうまくいったと思います。

MathFloor()関数は、明らかに完全にきれいに実装されているわけではありませんが、開発者はこれを改善する真の機会を得たのです。

結局、いじくり回すことになった。楽しかったです。1時間近く実験してやっと安定した関数(CountSignedDigits(double x)のことです)を得ることができました。

また、現在でもすべての入力値で正しく動作するかどうかはわかりません。 自動ストレステストは開発していませんので、手動で作成しました。 テストをお願いします。

浮動小数点以下10桁までの安定した動作を期待します。

int CountSignedDigits(double x)
{
  for(int i=0; i<1000; i++,x*=10)
  {
    if(x-MathFloor(x+0.000000000005)<double(0.000000000005)) return i;
  }
  return -1;
}
Stress-test attached. // コードからいくつかの中間的な実現を削除していない。試してみたい・考えてみたいと思い、コメントに残しました。開発者も含めて。
ファイル:
 
komposter:
1.ロットに対してdigを定義する必要はなく、適切なステップに正規化すればよい。

2.取引要求 送信時のロット変数にゴミがあっても(小数点以下)、端末自身で破棄すること。

少なくとも、このような構造を数年間使っていて、問題が生じたことはありません。

4.再保険の場合は、小数点以下8桁まで正規化してもよい(積立金あり)-「正しい」正規化後にゴミが出たら、もっと遠くなる。

最初の考え方は正しく、他の考え方は疑わしい。:)

この実装は、 実用上は 問題ないが、"problem-starter"(c)で定義された人工的な条件では、不正確なものとなる。離散的なステップの場合、lot_minに対する相対値ではなく、0に対する相対値を生成します。:)

ただし、気づいたら簡単に直せます。

double komposterNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
   if ( lot < lot_min ) lot = lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}
double metadriverNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}

// これらの真珠のすべてを、あまり真剣に受け止めないでください。明確化というのは、純粋に脳トレのための理論的なもので、実際にはlot_stepが例えば0.0231と同じというのは見たことがないので......。

;)

 
metadriverNormalizeLot

のオプションは正しいです。私のNL()と同様にlot_minで 正しく説明されています。

 

私のバリエーションもあります。一部の商品では、価格変化のステップがポイントより大きいことに注意してください。

//---------------------------------------------------------------------
//  Нормализация цены:
//---------------------------------------------------------------------
double
NormalizePrice( string _symbol, double _org_price )
{
  double  norm_price = _org_price;

  double  min_price_step = NormalizeDouble( current_tick_size / current_point, 0 );

  norm_price = NormalizeDouble( NormalizeDouble(( NormalizeDouble( _org_price / current_point, 0 )) / min_price_step, 0 ) * min_price_step * current_point, current_digits );

  return( norm_price );
}

//---------------------------------------------------------------------
//  Вычисление лота:
//---------------------------------------------------------------------
double
NormalizeLot( double _required_lot )
{
  double        lot, k;

  if( current_min_lot_step > 0 )
  {
    k = 1.0 / current_min_lot_step;
  }
  else
  {
    k = 1.0 / current_min_permitted_lot;
  }

  lot = MathFloor( _required_lot * k ) / k;

  if( lot < current_min_permitted_lot )
  {
   lot = current_min_permitted_lot;
  }

  if( lot > current_max_permitted_lot )
  {
    lot = current_max_permitted_lot;
  }

  lot = NormalizeDouble( lot, 2 );
  return( lot );
}
 

ステップが ゼロからではなく、最小ロットから「行く」ことを公理とすると、正しいアルゴリズムは次のようになります。

double voixkasNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
  if ( lot < lot_min ) lot = lot_min;
  else lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;

  if ( lot > lot_max ) lot = lot_max;
  return NormalizeDouble(Lot, 8);
}

コンポスター版では、ゼロからのステップを「進む」。私には、それが正しいとは思えません。
MetaDriverのバリエーションでは、負の値をスキップするコードになっています。=Р

 
voix_kas:
...

MetaDriverのバリエーションでは、負の値をスキップするコードになっています。=Р

:)) .....そうなんですか!?全く仕事にならない! ;-R ;-b ;-R

double voixkasNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
  if ( lot < lot_min ) lot = lot_min;
  else lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;

  if ( lot > lot_max ) lot = lot_max;
  return NormalizeDouble(L ot, 8);
}

まあ、どちらかというと、最短で、同時に「ある意味正確」なバリエーションは、これでしょう。

double mdNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
  lot = MathMin(lot, lot_min);
  lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;
  return NormalizeDouble(MathMin(lot, lot_max), MathMax(CountSignedDigits(lot_min),CountSignedDigits(lot_step));
}

しかも、lot_steplot_min、 lot_maxの 無効と否定をチェックせずにです!!!!。

:))))

 

えー...神経を逆なでする:))最後の行は掲示板の投稿を手書きで修正したものなので、お許しください。=)
ところで、あなたのコードもコンパイルされませんでした(最後の行に閉じ括弧を入れるのを忘れていました)。:-Р
しかも、2〜3倍遅くなる(今、スクリプトで確認しました)のですが、チェックの質は同じです。:-Р

とにかく、有効な整数を決定する適切なコードがない以上、私はComposterのアドバイスに従って、音量を小数点以下8桁まで正規化することにします。
落とし穴がないことを祈ります。

皆さん、ありがとうございました。

 

あなたたちは面白い......なるほど。

最初の投稿でNL()を与えたのは、その2ページ後です ;)

 

もうひとつ、達人たちに質問があります。多通貨のテストをすると、エラーが発生します(スクリーンショットを添付します)。
取引操作を行おうとしているが、No priceという答えが返ってくる。テスターによると、このペアの相場は 2011.01.0301:00:00 に始まり、一方 EURUSD も 2011.01.0300:00:00 から相場が始まっています。 このエラーを回避するために、相場の開始時刻を調べる方法はあるでしょうか?

エラー発生時の画面

 
voix_kas:

もうひとつ、達人たちに質問があります。多通貨のテストをすると、エラーが発生します(スクリーンショットを添付します)。
取引操作を行おうとしているが、No priceという答えが返ってくる。テスターによると、このペアの相場は 2011.01.0301:00:00 に始まり、一方 EURUSD も 2011.01.0300:00:00 から相場が始まっています。このエラーを避けるために、相場の開始時刻を 知る方法はありますか?

トレーディングセッションとクォートセッションは、問題の解決に役立たないのでしょうか?