Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 106

 
-Aleks-:

Подскажите, пожалуйста, решение проблемы округления!

Необходимо избавить число от запятой без остатка - округление и возведение в степень не решают всей проблемы - как быть?

К примеру было 1,44430 а надо 144430.

Часть кода - как есть

NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)

Просто раздели на _Point
 
Alexey Viktorov:
Просто раздели на _Point

Не верный результат принтует, оригинал равен  161188 (1,61188) Ваш метод 161187 принт дает 1,6119 (почему округление то делает при принти Low[1], если пять знаков после запятой?), мой вариант 161188.

Но если усложнить задачу


long Calc=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1);

 То, последняя часть числа 161184 - т.е. расхождение на 4 единицы

Ваш Вариант в этом Выражении выдает аналогичное значение

long CalcX=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;

 Есть мысли в чём ошибка и как её исправить? 

 

 
-Aleks-:

Не верный результат принтует, оригинал равен  161188 (1,61188) Ваш метод 161187 принт дает 1,6119 (почему округление то делает при принти Low[1], если пять знаков после запятой?), мой вариант 161188.

Но если усложнить задачу


long Calc=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1);

 То, последняя часть числа 161184 - т.е. расхождение на 4 единицы

Ваш Вариант в этом Выражении выдает аналогичное значение

long CalcX=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;

 Есть мысли в чём ошибка и как её исправить? 

 

Вот так запусти.

/********************Script program start function*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
 
Alexey Viktorov:
Вот так запусти.

/********************Script program start function*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/

 

Да, через строковую переменную получается верное число (предварительно), но прибавляются нули 161188.00000000 как от них избавиться?

 
-Aleks-:

 

Да, через строковую переменную получается верное число (предварительно), но прибавляются нули 161188.00000000 как от них избавиться?

В моём коде никаких нулей нету. Смотри как написано.
 
Alexey Viktorov:
В моём коде никаких нулей нету. Смотри как написано.

 Спасибо - я пропустил ноль.

Получилась такая конструкция

string CalcX=
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);

А теперь надо разобрать эти цифры обратно на составляющие.

При попытке преобразовать строку в число ловлю опять не верное число 161184 вместо 161188

long testX = StringToDouble(CalcX);
Print("testX=",testX);

 Надо резать видимо строку, но как это сделать оптимально правильно?


 
-Aleks-:

Да, через строковую переменную получается верное число (предварительно), но прибавляются нули 161188.00000000 как от них избавиться?

Распарсить строку по разделителю "."
 
Artyom Trishkin:
Ну так ... показывайте шаблон. А то как же ж знать чего там у вас?
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Подскажите, кто знает как реализовать индикатор, так чтобы вторая координата по времени в трендовой линии выставлялась по времени пробоя, либо касания оной. То есть есть трендовая линия и есть ее начало в определенном месте, а время второй координаты выставляется по усмотрению, но необходимо чтобы линия заканчивалась там, где она пересекается со свечой. Как допустим в индикаторе отображенном на рисунке
 
-Aleks-:

 Спасибо - я пропустил ноль.

Получилась такая конструкция

string CalcX=
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);

А теперь надо разобрать эти цифры обратно на составляющие.

При попытке преобразовать строку в число ловлю опять не верное число 161184 вместо 161188

long testX = StringToDouble(CalcX);
Print("testX=",testX);

 Надо резать видимо строку, но как это сделать оптимально правильно?


Ничего разбирать не надо. Перевод в string только для того чтобы увидеть нормальное число. Для вычислений ничего делать не надо.

Ну, а если есть непреодолимое желание поизвращаться то перевести строку обратно в число StringToDouble() и умножить на _Point с нормализацией до нужного количества знаков, наверное _Digits
Причина обращения: