エキスパートアドバイザー - 雑多な質問 - ページ 4

 
  1. そうです、彼らはそれを多用しています。これらはすべて、通貨しかなかったときに書かれたものです。現在では金属もあり、tick size != point は完全に間違っています。
  2. 02:00:00.069- カスタムエキスパートEURUSD,H1:| _lotSize -NormalizeDouble: 0.070000000000001
    OPは2倍を15桁までプリントアウトし続け、なぜそれが0.07ぴったりでないのか理解できないのです。ある数字が正確に表現できないからだ 1/8はできる 1/10はできない
 
honest_knave:
double LotCalculator(double lots)
  {
   ...
   return(NormalizeDouble(lots,2));
  }

このコメントは本当に私に多くのことを助け、これは便利ですが、それは私に多くの小数を与える。
(私はすでにそれについて読んだので(より多くの小数点は正常です)。

私はまだ'NormalizeDouble'を心配し、私は別の方法を探しています。

ありがとうございます!このコメントは本当に私に多くのことを助ける。

 

コメントを書いてくださった方、ありがとうございました。

whroeder1- あなたのコメント(/リンク)を広く研究します大きな感謝。
Marco- LotSize LotStep問題の後に使用することにします。ありがとうございます。

 
Max Enrik:

このコメントは本当に私をたくさん助け、これは便利ですが、それは私に多くの小数点を与える。
(私はすでにそれについて読んだので(より多くの小数は正常です)。

私はまだ'NormalizeDouble'を心配し、私は別の方法を探しています、それは'NormalizeDouble'よりも優れている。

ありがとうございます。

おそらく、あなたが達成しようとしているものを正確に確立するのが最善でしょう。

もし、注文を出すのに有効なロットサイズを返す関数が 欲しいのであれば、NormalizeDouble() を使う必要はないでしょう。私のオリジナルコードやWHRoederのコードで実現できます。両者の間には微妙な違いがあり、それは個人の好みの問題でしょう。

しかし、ロットの値をそのままPrint()すると、0.070000000000001のような「奇妙な」結果が得られるかもしれません。

これはOrderSend()では問題にはなりませんが、あなたが期待するものとは異なるかもしれません。

もし、「普通の」方法で表示される数字を見たいのであれば、2つの選択肢があります。

1.関数内でNormalizeDouble() を使用することができます。標準的なプリントアウトの場合、期待通りの値が表示されます。しかし、(手動で)小数点以下の桁数を十分に印刷すると、やがてその数値が思った通りでないことがわかるでしょう。これがWHRoederの言わんとするところです(と私は思っています)。この解決策は最もエレガントなものではありませんが、最もシンプルなものです。あるいは...

2.ロットサイズをそのままにしておいて (つまりNormalizeDouble を使わないで)、 必要なときに表示用に値を調整することもできます。必要に応じて、DoubleToStr()、StringFormat()、printf()を使用して、これを実現することができます。これは、より柔軟なアプローチです。

実際の値とその表示方法は同じである必要はないことに注意しましょう。正確に0.07を格納することはできないのです。

   double myVal=0.07;
   printf("%.24f",myVal);

Result: 0.070000000000000006661338

しかし、必要であれば0.07を表示することができます。
 
honest_knave:

おそらくそれはあなたが達成しようとしているものを正確に確立することが最善であろう。
...

わー、いいこと書いてますね、あなたのコメントのようにほとんど理解しています。
というわけで、近々、新しいコメントを書きますね。

//--- 2回目の編集

私が述べたように、私はLotSizeとLotStepが表示されているだけで正しい必要はありません、私はLotSizeとLotStepがどこでも同じことを示すことができる 必要があります。
ちょうど私はそれが心配です。

 

まあ、ダイナミックなロットサイズなら、シンプルなギアボックスでもいいんですけどね。

//Gearbox//
double Lots;
Balance=AccountInfoDouble(ACCOUNT_BALANCE);

if(Balance>10000)
{Lots=10;Print(" Gear Two");}
if(Balance>100000)
{Lots=100;Print(" Gear Three");}
if(Balance>1000000)
{Lots=1000;Print(" Gear Four");}
if(Balance>10000000)
{Lots=10000;Print(" Gear Five");}

if(Balance<10000000)
{Lots=1000;Print(" Gear Four");}
if(Balance<1000000)
{Lots=100;Print(" Gear Three");}
if(Balance<100000)
{Lots=10;Print(" Gear Two");}
if(Balance<10000)
{Lots=1;Print(" Gear One");}
if(Balance>1000000000)
{Lots=0;}
 

私はあなたと私のEAの一部を投稿する必要があるので、私はあなたがより明確に私を理解するのに役立つことを願っています。
それで、私はそれが良いコードか何かを知る必要がありますか?

良い(明確な)アドバイスやヘルプをお願いします、よろしくお願いします。

void OnChartEvent(const int      id     , // Event ID
                  const long   & lparam , // Parameter of type long event
                  const double & dparam , // Parameter of type double event
                  const string & sparam   // Parameter of type string events
                  )
{

    _lotCalc();
    //-------Process Button---------------------------------------------------------|
    if ( sparam == _btnLotMinus )
    {
        ObjectSetInteger( 0, _btnLotMinus, OBJPROP_STATE, false );
        _lotSize -= _lotStep;

        if ( NormalizeDouble( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
        _calcUpdade( CALC_CHANGE_LOT );

        Print( " | Lot:   ", _lotSize );
        return;
    }   //---if Close
    //                          ...
}

double _lotCalc()
{
    //---
    _lotMin  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN  );
    _lotMax  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX  );
    _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );

    //---
    return( NormalizeDouble( _lotSize, 2 ) );
}
 
Max Enrik:

私はあなたと私のEAの一部を投稿する必要があるので、私はあなたがより明確に私を理解するのに役立つことを願っています。
だから、私はそれが良いコードか何かを知る必要がありますか?

私に良い(明確に)アドバイスやヘルプを与えてください、事前に感謝します。

夜遅く、コンパイルされていない、テストされていない。

あなたが最初に _lotSize を設定した場所がわかりません... _lotSize が常に _lotStep の倍数であることを確認する必要があることを思い出してください。

OnChartEvent()と_lotCalc()の間で分割するのではなく、すべてのロット計算を一緒にしておくと、より良いものになると思います。min / max / stepをチェックし、インクリメント / デクリメントを行う関数を 1つ用意します。

void OnChartEvent(const int      id     , // Event ID
                  const long   & lparam , // Parameter of type long event
                  const double & dparam , // Parameter of type double event
                  const string & sparam   // Parameter of type string events
                  )
{
    _lotCalc();
    //-------Process Button---------------------------------------------------------|
    if ( sparam == _btnLotMinus )
    {
        ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
        _lotSize = fmax(_lotMin, _lotSize-_lotStep);
        _calcUpdade( CALC_CHANGE_LOT );
        printf( " | Lot: %.2f  ", _lotSize );
        return;
    }   //---if Close
    //                          ...
}

void _lotCalc()
{
    //---
    _lotMin  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN  );
    _lotMax  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX  );
    _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );

    //---
}
 
honest_knave:

夜遅く、未パイル、未テストです。
ロットサイズ(_lotSize)を最初に設定した場所がわかりません。_lotSizeが常に_lotStepの倍数であることを確認する必要があります。
OnChartEvent()と_lotCalc()の間で分割するのではなく、すべてのロット計算を一緒にしておくと、より良いものになると思います。min / max / stepをチェックし、インクリメント / デクリメントを行う関数を1つ用意します。

それは私のlotSizeと losStepの 問題を解決したことを意味し、それは私がたくさん助けました。
本当にありがとうございます。

#Lot 0 (ゼロ) & (解決済みのLot SizeとLot Step問題の間)- Closed

 

そうそう、lotSizeのコードを忘れてしまったので、init 関数の 中で使っています。
それは_lotSizeのための良い場所ですか?

ありがとうございます。

int OnInit()
{
    _pip = Point;
    if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point;
    _lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT );

    //...
}