Вы забываете, что вещественное 3 на самом деле может представляться как 2.9999999999, что при прямом преобразовании в int превращается в 2, а не в 3.
вывел все DeltaPriceDouble с помощью DoubleToStr( DeltaPriceDouble, Digits ), никаких 2.9999 нету.
2009.02.21 03:15:54 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.389 Close[ 1 ] = 1.3888 DeltaPrice = 0.0002 DeltaPriceDouble = 2.0000 DeltaPriceInt1 = 1 DeltaPriceInt2 = 2
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3891 Close[ 1 ] = 1.3888 DeltaPrice = 0.0003 DeltaPriceDouble = 3.0000 DeltaPriceInt1 = 2 DeltaPriceInt2 = 3
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5.0000 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3892 Close[ 1 ] = 1.3888 DeltaPrice = 0.0004 DeltaPriceDouble = 4.0000 DeltaPriceInt1 = 3 DeltaPriceInt2 = 4
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5.0000 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 03:15:52 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3889 Close[ 1 ] = 1.3888 DeltaPrice = 0.0001 DeltaPriceDouble = 1.0000 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1
2009.02.21 03:15:52 2009.01.05 00:01 Test EURUSD,M1: Close[ 0 ] = 1.3888 Close[ 1 ] = 1.3887 DeltaPrice = 0.0001 DeltaPriceDouble = 1.0000 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1
Если так и должно быть, то вопросов больше не имею :-). Но вообще мне кажется что так быть не должно. То есть double 2.0000 должен переводиться в int 2.
Как только нашёл где кроется неточность, был немного удивлён. И стал переводить double -> строка -> int.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
int init()
{
return( 0 );
}
int start()
{
// множитель для перевода цены в пункты
int MultToInt = MathPow( 10, Digits );
// вычисляем изменение цены
double DeltaPrice = Close[ 0 ] - Close[ 1 ];
// переводим изменение цены в пункты, но в double
double DeltaPriceDouble = MultToInt * DeltaPrice;
// думал, что так будет работать, но в этой строчке что-то не то...
int DeltaPriceInt1 = DeltaPriceDouble;
// а вот так вот отлично работает
int DeltaPriceInt2 = StrToInteger( DoubleToStr( DeltaPriceDouble, Digits ) );
Print( " Close[ 0 ] = ", Close[ 0 ], " Close[ 1 ] = ", Close[ 1 ], " DeltaPrice = ", DeltaPrice, " DeltaPriceDouble = ", DeltaPriceDouble, " DeltaPriceInt1 = ", DeltaPriceInt1, " DeltaPriceInt2 = ", DeltaPriceInt2 );
}
int deinit()
{
return( 0 );
}
Очень интересно посмотреть на значения DeltaPriceInt1, которые на единицу отличаются от верного значения
2009.02.21 02:20:56 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.389 Close[ 1 ] = 1.3888 DeltaPrice = 0.0002 DeltaPriceDouble = 2 DeltaPriceInt1 = 1 DeltaPriceInt2 = 2
2009.02.21 02:20:56 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3891 Close[ 1 ] = 1.3888 DeltaPrice = 0.0003 DeltaPriceDouble = 3 DeltaPriceInt1 = 2 DeltaPriceInt2 = 3
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3892 Close[ 1 ] = 1.3888 DeltaPrice = 0.0004 DeltaPriceDouble = 4 DeltaPriceInt1 = 3 DeltaPriceInt2 = 4
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3889 Close[ 1 ] = 1.3888 DeltaPrice = 0.0001 DeltaPriceDouble = 1 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1
2009.02.21 02:20:54 2009.01.05 00:01 Test EURUSD,M1: Close[ 0 ] = 1.3888 Close[ 1 ] = 1.3887 DeltaPrice = 0.0001 DeltaPriceDouble = 1 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1