Double vs FLOAT - anlaşılmaz MathFloor hatası

 

Herkese merhaba, zaten alıntıların doğruluğu ile eziyet çekiyorum. Normalleşme vb.

       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 ));

yayılma:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105143 bidP2=105141 Averab2=105142.0000000000 AUTOPPRICE= 1000142

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




yayılma:3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: ÇİFT askP2=105144 bidP2=105141 Averab2=105142.5000000000 OTOPRICE= 100050142

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


yayılma:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: ÇİFT askP2=105145 bidP2=105141 Averab2=105143.000000000 OTOPRICE= 10005012

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: FLOAT askP=105145 bidP=105141 Averab=105143.000000000 OTOPRICE= 1.0514299870

yayılma: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 AUTOPPRICE= 1000143

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30:   FLOAT askP=105146 bidP=105141 Ortalama=105143.5000000000 OTOPRICE= 1.0514299870

Bu ekstra işaretler tünelin sonunda bir yerde..........

 
       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));

yayılma ile =2

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

yayılma ile = 3

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

4'lük bir yayılma ile!!!!

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

niye ya?

 
Vladislav Andruschenko :

Herkese merhaba, zaten alıntıların doğruluğu ile eziyet ettim. Normalleşme vb.

Double ve int'nin ne olduğunu bir şekilde anlayabilmeniz gerekir. Tip döküm nasıl çalışır.

MathMod ve MathFloor'u hiç kullanmadım . Kodunuzda, yazılanların arkasında ne olduğunu hiç anlamadığınız çok fazla çığlık var.

Çift sayı yazdırmak hiçbir şey ifade etmez. Gerçek çift değeri yazdırmak istiyorsanız, baytlarına bakmanız gerekir.

 

sadece elle yazmamak için çıktı alın,

Kendi başına değişken ondan beklediğim sonucu vermiyor.

Tip döküm , int ve çift normalleştirme, yardım almadan yaptığım şey.

Şu anda umutsuzluk içindeyim çünkü tüm seçenekleri denedim. ve olması gerektiği gibi çalışmayan 1000 koddan 1'lik bir parçayı ortaya çıkardı.

Ama yardımın için teşekkürler.

İstediğimi elde etmeye çalış: bana kodu daha sonra göstermene gerek yok. sadece işe yarayıp yaramadığını söyle.

Sor ve Bid alıyoruz.

ve ortalama fiyatı hesaplayın.

Yayılma tek ise (3,5,7,9 vb.), ortalama fiyatı Teklif'e daha yakın eşitleriz.

Örneğin:

Teklif=1.55555 Alış=1.55557 Ortalama Fiyat= 1.55556 Fark=2

Teklif=1.55555 Alış=1.55558 Ortalama fiyat= 1.55556 spread=3

ve her şeyi doğru yapacaksın.

Fakat yayılma 4,5,6,7 olduğunda bu doğruluk sizin için bilinmeyene gidecektir. ve sayı yanlış yerde yüzer.

 
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));

yayılma ile =2

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

yayılma ile = 3

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

4'lük bir yayılma ile!!!!

askP=105145 bidP=105141 Ortalama= 105143 MathFloor((int)Ortalama)= 105142

niye ya?

Bir şekilde benzer bir durum vardı - o zaman aklım zaten öfkeyle kaynıyordu. Double'ı şamandıra ile değiştirmek yardımcı oldu, neden hala bilmiyorum.

 
sibirqk :
Bir şekilde benzer bir durum vardı - o zaman aklım zaten öfkeyle kaynıyordu. Double'ı şamandıra ile değiştirmek yardımcı oldu, neden hala bilmiyorum.

Teşekkür ederim deneyeceğim ........ beynim de kaynadı bile.

EVET!!! İşte böyle çalışır! her şey yolunda.

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

Teşekkürler.! Artık ne yapacağımı bilmiyorum....

 
#define ALPHA 0.1

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

MathFloor bu şekilde saban sürer

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 bu şekilde saban sürer

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

farklı spreadlerde? 2,3,4,5,6,7 dahil?

çünkü yönteminizi daha önce denedim (olmadan da   + ALFA ). ve 2.3'te her şey yolunda, ancak 4.5'te - zaten bir aksaklık

Andrey Dik :
double Averab = NormalizeDouble (( Ask + Bid )/ 2.0 , Digits );

normalleştirme, işlevde yaptığım ilk şey bu, ancak ne yazık ki bazı yayılmalarda başarısız olmaya başlıyor

 
Vladislav Andruschenko :

normalleştirme, işlevde yaptığım ilk şey bu, ancak ne yazık ki bazı yayılmalarda başarısız olmaya başlıyor

Düzelttim, şimdi deneyin.
 
Vladislav Andruschenko :

Sor ve Bid alıyoruz.

ve ortalama fiyatı hesaplayın.

Yayılma tek ise (3,5,7,9 vb.), ortalama fiyatı Teklif'e daha yakın eşitleriz.

#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);
}
Neden: