新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 106

 
-Aleks-:

请告知解决四舍五入问题的方法!?

我需要摆脱小数点而没有余数--四舍五入和指数化并不能解决整个问题--我应该怎么做?

例如,它是1.44430,我需要144430。

部分代码--原样

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

只需除以_点。
 
Alexey Viktorov:
只要除以_点。

错误的结果打印,原来是161188(1.61188)你的方法161187的打印结果是1.6119(为什么在打印Low[1]时,如果有5个小数位,就会进行四舍五入?

但如果我们把问题复杂化。


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]时,如果小数点后五位,它要向上取整?

但如果我们把问题复杂化。


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

我也许应该剪断绳子,但如何才能做到最佳?


没有必要削减任何东西。转换为字符串只是为了看到 正确的数字。你不需要为计算做任何事情。

好吧,如果你有一个压倒性的愿望,把字符串转换回StringToDouble()数字,然后乘以_Point,并规范化为所需的数字,可能是_Digits。
原因: