DoubleとFLOATの比較 - MathFloorの不明確なエラー

 

皆さんこんにちは、名言の正確さには飽きてきましたね。正規化など。

      float AUTOPRICE;
      float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      float Averab=((askP+bidP))/2.0;
      AUTOPRICE=MathFloor(Averab)*Point;
      Print("FLOAT  "+"  askP="+askP+" bidP="+bidP+" Averab="+DoubleToString(Averab,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE,10));

      double AUTOPRICE2;
      double askP2=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP2=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      double Averab2=((askP2+bidP2))/2.0;
      AUTOPRICE2=MathFloor(Averab2)*Point;
      Print("DOUBLE  "+"  askP2="+askP2+" bidP2="+bidP2+" Averab2="+DoubleToString(Averab2,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE2,10));

スプレッド:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TESTMATHFLOOR EURUSD,M30:DOUBLE askP2=105143 bidP2=105141 Averab2=105142.000000 AUTOPRICE=1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105143 bidP=105141 Averab=105142.0000000000 AUTOPRICE=1.0514199734




スプレッド:3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105144 bidP2=105141 Averab2=105142.5000000000 AUTOPRICE=1.0514200000

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105144 bidP=105141 Averab=105142.5000000000 AUTOPRICE=1.0514199734


スプレッド:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105145 bidP=105141 Averab=105143.0000000000 AUTOPRICE=1.0514299870

スプレッド:5

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOATaskP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870

その余分な看板はトンネルの先のどこかにある......。

 
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

at spread=2

askP=105143 bidP=105141 Averab=105142MathFloor((int)Averab)=105142

at spread=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

を4で!!!!!!!!!!!!!!!!!!!!!!!!広がれ

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

なぜ

 
Vladislav Andruschenko:

皆さんこんにちは、名言の正確さには飽きてきましたね。正規化など。

doubleとintが何であるかは、なんとなく理解できるはずです。型変換のしくみ

MathModと MathFloorは使ったことがない。あなたのコードは、あなたが書いたものの背後にあるものをまったく理解していないことを、たくさん叫んでいます。

二重番号のプリントアウトは、何の意味もありません。doubleの真の値を表示したい場合は、そのバイトを見る必要があります。

 

プリミングのみで、手書きする手間を省くためです。

変数そのものに期待する結果が得られない。

タイプキャスティング、intの正規化、ダビングは、私が助けなしにやっていたことです。

今現在、あらゆる選択肢を試した結果、1000分の1のコードを載せても思うように動かず、絶望しています。

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

私が望むことをやってみてください。その後でコードを見せずに、うまくいくかどうかだけを教えてください。

AskとBidを取る。

を作成し、平均価格を算出する。

スプレッドが奇数(3,5,7,9など)の場合、平均価格をBidに近づけて等倍にする。

例えば、こんな感じです。

Bid=1.55555 Ask=1.55557 平均価格=1.55556 Spread=2

Bid=1.5555 Ask=1.55558 平均価格=1.55556 Spread=3

を使えば、きっとうまくいくはずです。

しかし、スプレッドが4、5、6、7となると、その精度が未知の世界に入り込むことになるのです。そして、数字が間違った方向に泳ぐことになる。

 
Vladislav Andruschenko:
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

at spread=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

at spread=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

を4で!!!!!!!!!!!!!!!!!!!!!!!!広がれ

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

なぜ

かつて私も同じような状況に陥ったことがある。私の心は憤怒の念で沸騰していた。doubleをfloatに置き換えることで解決しました、理由はまだ わかりません。

 
sibirqk:
私もかつて同じような状況に陥ったことがあり、その時は憤りで頭が沸騰していました。doubleをfloatに置き換えることで解決しました、理由はまだ わかりません。

ありがとうございます、試してみます......。 私も頭が真っ白になりそうです。

YES!!!まさにその通り!大丈夫です。

float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
float Averab=((askP+bidP))/2.0;

ありがとうございます!!!もう、どうしたらいいんだろう......。

 
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

MathFloorの 仕組みはこうなっています。

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}
 
double Averab = NormalizeDouble ((Ask + Bid)/(2.0 * Point), Digits);
 
fxsaber:
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

MathFloorの仕組みはこうなっています。

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}

2,3,4,5,6,7など、さまざまなスプレッドのために?

2,3のスプレッドはOKですが、4,5はすでに不具合 です。

アンドレイ・ディク
double Averab = NormalizeDouble ((Ask + Bid)/2.0, Digits);

正規化、これは関数で最初にやったことですが、残念ながらあるスプレッドで不具合が出始めます

 
Vladislav Andruschenko:

正規化は関数で最初にやったことだが、残念ながら特定のスプレッドで不具合が発生するようになった

修正しましたので、お試しください。
 
Vladislav Andruschenko:

AskとBidを取る。

を作成し、平均価格を算出する。

スプレッドが奇数(3,5,7,9など)の場合、平均価格をBidに近づけて等価にします。

#define ALPHA 0.1

int DoubleToInt( const double Num )
{
  return((int)(Num + ALPHA));
}

void OnStart()
{
  double NewPrice = DoubleToInt((Ask + Bid) / (2 * Point)) * Point;

  Print(NewPrice);
}
理由: