错误、漏洞、问题 - 页 1931

 

早上总是更好...:)

 
Aleksey Vyazmikin:

在服务台

MT4。

对于有固定尺寸的对象:OBJ_BUTTON,OBJ_RECTANGLE_LABEL 和 OBJ_EDIT 属性 OBJPROP_XDISTANCE 和 OBJPROP_YDISTANCE 设置左上角对象点相对于图表角(OBJPROP_CORNER)的位置,X 和 Y 坐标将从这里开始计算。


MT5。

对于有固定尺寸的对象:OBJ_BUTTON、OBJ_RECTANGLE_LABEL、OBJ_EDIT和OBJ_CHART,属性OBJPROP_XDISTANCE和OBJPROP_YDISTANCE设置对象左上角相对于图表角(OBJPROP_CORNER)的位置,X和Y坐标将从这里测量。

问题是,旧版MT4使用ObjectSet允许将对象相对于其边缘(角)放置 - 对于左边的对象,从第一个符号开始计算像素,对于右边的对象 - 从最后一个符号开始计算,而新版总是从第一个符号开始计算,这使得带文本的标签定位困难,因为你并不总是知道有多少文本符号会我要求开发者增加一个文本对齐方式的选择!


如果有人知道如何在MT5中获得左右对齐,请分享相应的功能!

而且不要生气,要仔细阅读帮助。

对于OBJ_LABEL、OBJ_BITMAP_LABEL和OBJ_RECTANGLE_LABEL对象,您可以设置图表角度,相对于该对象的锚点进行定位。这个角度是通过对象属性OBJPROP_CORNER设置的,它可以有ENUM_BASE_CORNER枚举中的四个值之一。

识别器

描述

左上角_上角

锚点相对于图表左上角的坐标

左下角

锚点坐标是相对于图表的左下角给出的。

右下角

锚点坐标是相对于图表的右下角设置的。

右上角

锚点的坐标是相对于图表的右上角设置的。

对象锚点的位置由OBJPROP_ANCHOR属性指定,可以是ENUM_ANCHOR_POINT枚举的9个值之一。

识别器

描述

锚定左上角

锚点在左上角

锚杆_LEFT

锚点在中间的左边

锚定左下角

锚点在左下角

锚杆_低位

中心以下的锚点

锚定右下角

锚点在右下角

锚杆_RIGHT

锚点在中央的右边

锚点_右上角

锚点在右上角

锚杆_上端

锚点在上部中心

锚点中心

锚点正好在物体的中心位置

 
Artyom Trishkin:

要不要我把你想标上数字4的清单项目往上移,它并不在那里?它变成了零--而且一切都到位了。

当然,我已经移动了所有的东西--也许我很愚蠢......



void OnStart()
  {
      Label("0",//Название
            0,       //Окно
            10,      //X
            32,      //Y
            "0 - Центр координат в левом верхнем углу графика",
            10,//Размер шрифта
            Yellow,//Цвет шрифта
            0        //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            );     
      Label("1",//Название
            0,       //Окно
            10,      //X
            32,      //Y
            "1 - Центр координат в левом нижнем углу графика",
            10,//Размер шрифта
            Yellow,//Цвет шрифта
            1        //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            );     
      Label("2",//Название
            0,       //Окно
            10,      //X
            32,      //Y
            "2 - Центр координат в правом нижнем углу графика",
            10,//Размер шрифта
            Yellow,//Цвет шрифта
            2        //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            );
      Label("3",//Название
            0,       //Окно
            10,     //X
            32,      //Y
            "3 - Центр координат в правом верхнем углу графика",
            10,//Размер шрифта
            Yellow,//Цвет шрифта
            3      //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            ); 

  }

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+
void Label(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
/*
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
*/   
 
Artyom Trishkin:

也不要生气,仔细阅读帮助。

对于OBJ_LABEL、OBJ_BITMAP_LABEL和OBJ_RECTANGLE_LABEL对象,您可以设置图表角度,相对于该对象的锚点进行定位。这个角度是通过对象属性OBJPROP_CORNER设置的,它可以有ENUM_BASE_CORNER枚举中的四个值之一。

识别器

描述

左上角_上角

锚点相对于图表左上角的坐标

左下角

锚点坐标是相对于图表的左下角给出的。

右下角

锚点坐标是相对于图表的右下角设置的。

右上角

锚点的坐标是相对于图表的右上角设置的。

对象锚点的位置由OBJPROP_ANCHOR属性指定,可以是ENUM_ANCHOR_POINT枚举的9个值之一。

识别器

描述

锚定左上角

锚点在左上角

锚杆_LEFT

锚点在中间的左边

锚定左下角

锚点在左下角

锚杆_低位

中心以下的锚点

锚定右下角

锚点在右下角

锚杆_RIGHT

锚点在中央的右边

锚点_右上角

锚点在右上角

锚杆_上端

锚点在上部中心

锚点中心

锚点直接位于物体的中心位置

谢谢,我明天会试着想办法的......

 
prostotrader:

早上总是更好...:)

通常是这样的 :)
 
SD说,在这种情况下,这样做是正确的。

关于交易、自动交易系统和交易策略测试的论坛

虫子、虫子、问题

fxsaber, 2017.07.18 09:51

几乎是一个幼稚的问题:为什么是这样的呢?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

由于某些原因,我确信DoubleToString在规范化后是没有意义的。但是没有,正如剧本所示。为什么会出现这种情况呢?

似乎双数->字符串的转换不能正确工作。


这个例子相当复杂,难以理解,所以我给你另一个例子。

void OnStart()
{
  Print((double)"8.905" == 8.905); // true
  Print(((string)(double)"8.905")); // 8.904999999999999
}

这就是我的意思。

Строковая в double переводится без проблем. Обратно - получаем другой результат.

即把字符串 "8.905",转换为双数并立即转换为字符串,得到8.904999999999999。但OnStart的第一行显示,(双)"8.905"==8.905。也就是说,应该打印8.905。

当然,明显的零端情况不应该起作用。

如果满足条件(双倍)"8.9050"==8.9050,那么条件(字符串)(双倍)"8.9050"=="8.9050 "也应该满足

在对这个问题进行了一番调查后,我得出了以下情况

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
}

请解释为什么转换双数->字符串仍被认为是正确的。最后一个例子是如此完全地打击了我的思想。

 
fxsaber:

请解释为什么双数->字符串的转换仍然被认为是正确的。最后一个例子是如此的完全让人心动。

对最后一个例子的评论

如果实数经历了相同的转换,可以认为它们是相同的。即使是看似相同的转换--num*0.5和num/2.0导致了不同的结果。镜像操作也可以这么说。num*=num2,num/=num2。 由此产生的数字将不等于原始数字。 欢迎来到实数世界。

在归一化过程中,在这个样本中对一个实数进行了3次操作--num*=1000,num+=0.5,num/=1000。

你可以在调试器中检查这些步骤

 
fxsaber:
SD说,在这种情况下,它是正确的。

为什么会混淆呢?

绝大多数的十进制实数都不能用无余数的二进制分数来表示。在此基础上再加上一个双重存储格式,你就会得到如此丑陋的东西。

其实,十进制的类型也不错,很方便。

 
Slava:

对最后一个例子的评论

如果对实数进行相同的转换,可以认为它们是相同的。即使是看似相同的转换--num*0.5和num/2.0导致了不同的结果。镜像操作也可以这么说。num*=num2,num/=num2。 由此产生的数字将不等于原始数字。 欢迎来到实数世界。

在这个例子中,在归一化过程中对一个实数进行了3次操作--num*=1000,num+=0.5,num/=1000。

你可以在调试器中检查这些步骤


非常有建设性的解释,谢谢!


但这个反例让我大跌眼镜。

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
}

正常化应该是这样进行的吗?

 
Комбинатор:

为什么会混淆呢?

经过Slava的解释,这并不令人困惑,但接下来有一个例子让我们质疑NormalizeDouble 本身的正确性。