Математические операции в MQL4

 

Пишу разновидность индикатора RAVI с целью повышения его наглядности.

Бьюсь несколько часов - не могу понять в чем проблема.

Смысл такой: использую 3 буфера ExtBuffer0, ExtBuffer1, ExtBuffer2. Все вычисления произвожу в ExtBuffer0, затем произвожу копирование данных в ExtBuffer1 или ExtBuffer2 в зависимости от условий.


Основная строка вычисления данных выглядит так:

ExtBuffer0[i] = (SMA1-SMA2)*100/SMA2;


А теперь проблема! Если строка написана ExtBuffer0[i] = (SMA1-SMA2)*100/SMA2, то изображаются данные только из буфера 0, если ExtBuffer0[i] = (SMA1-SMA2)*100 - то все отображается верно из всех 3 буферов.

Выходит, что проблема в операции деления.

Подскажите как быть.

Вот выдержка моего кода:

double prev, current, SMA1, SMA2;
bool up=true;

for(int i = 0; i <= Bars; i++)
{

SMA1=iMA(NULL,0,Period1,0,MODE_SMA,PRICE_CLOSE,i);

SMA2=iMA(NULL,0,Period2,0,MODE_SMA,PRICE_CLOSE,i);
ExtBuffer0[i] = (SMA1-SMA2)*100/SMA2;
}

for(i = Bars-1; i >= 0; i--)
{
current=ExtBuffer0[i];
prev=ExtBuffer0[i+1];
if (current > prev) up = true;
if (current < prev) up = false;

ExtBuffer2[i] = 0.0;
ExtBuffer1[i] = 0.0;

if (up == false)
{
ExtBuffer2[i] = current;
ExtBuffer1[i] = 0.0;
}
if (up == true)
{
ExtBuffer1[i] = current;
ExtBuffer2[i] = 0.0;
}
}

 

Не знаю поможет ли, но раньше было так:

(SMA1 - SMA2) x 100 / SMA2 != ((SMA1 - SMA2) x 100) / SMA2

Менялась точность вычислений в последних знаках. Возможно у Вас получаются очень маленькие значения соизмеримые с этой разницей в вычислениях.

 

Я уже пробовал ставить скобки и так ExtBuffer0[i] = ((SMA1-SMA2)*100)/SMA2; Результат такой же.

Возможна ли эта ситуация из-за процессоров семейства Sempron Mobile?

 
caspermax писал(а) >>

Я уже пробовал ставить скобки и так ExtBuffer0[i] = ((SMA1-SMA2)*100)/SMA2; Результат такой же.

Возможна ли эта ситуация из-за процессоров семейства Sempron Mobile?

Возможно просто происходит деление на ноль.

Желательно немного изменить конструкцию

ExtBuffer0[i] =0; if (SMA2>0) ExtBuffer0[i] = ((SMA1-SMA2)*100)/SMA2;

 

Спасибо!

Вот о делении на ноль у меня даже мысли не было! :((

все работатет!

 
Vinin >>:

Возможно просто происходит деление на ноль.

Желательно немного изменить конструкцию

ExtBuffer0[i] =0; if (SMA2>0) ExtBuffer0[i] = ((SMA1-SMA2)*100)/SMA2;

Именно это имел ввиду. Иногда эта неточность на грани. Маленькое число превращается в ноль.

Причина обращения: