错误、漏洞、问题 - 页 1930

 
几乎是一个幼稚的问题:为什么会这样呢?
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 在规范化后是没有意义的。但是没有,正如剧本所示。为什么会这样呢?

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

 
在测试器中,PositionGet函数非常慢。出于示范目的,编写了以下专家顾问程序
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


注释了黄线的单次运行的结果

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


没有注释黄线的单次运行结果

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


TesterBench库 显示了同样的执行时间下降。


HH 不仅是PositionGet,还有OrderGet、HistoryDealGet、HistoryOrderGet都很慢。

 

在测试器(1629)中,交易以零价格开仓

测试器中 使用FIBOGroup-MT5服务器的真实刻度运行专家顾问


 

向开发者和感兴趣的同事提问。

在Tester的可视化模式中,有一个 CiMA类的对象--muwings。

模式="基于真实刻度的每个刻度"。展示台中的速度已接近最大值。

问题是这样的。当一个新的条形图出现时,你必须等待大量的新刻度来刷新CiMA muwings的值,或者说是muwings缓冲区的值。

而在每一个刻度上,更新是由CiMA::Refresh(-1) 方法加速的。

为什么测试器的效果这么差?

在实际贸易中没有这样的问题。

 

普沙这些天是个奇怪的人。

uest/302788

请求/302788

正如我所猜测的那样,是我被列为候选人,并对同一顺序进行了评论。

但这些信息就像对编码员一样)

 

从文件中可以看出

enum_base_corner

识别器

描述

左上角_上角

图表左上角的坐标中心

左下角

图表左下角的坐标中心

右下角

图表右下角的坐标中心

右上角

图中右上角的坐标中心

问题:为什么不能按数字顺序绘制表格? 你把1--而不是预期的"坐标中心在图表的左上角",而是"坐标中心在 图表的右下角"。

现在它看起来像这样

1 - 坐标中心在图表的左下角。
2 - 图形右下角的坐标中心
3 - 坐标中心在图表的右上角
4 - 坐标中心在图表的左上角

 
Aleksey Vyazmikin:

从文件中可以看出

enum_base_corner

识别器

描述

左上角_上角

图表左上角的坐标中心

左下角

图表左下角的坐标中心

右下角

图表右下角的坐标中心

右上角

图中右上角的坐标中心

问题:为什么表格不能按数字顺序排列? 你把1--而不是预期的"坐标中心在图的左上角",你得到的是"坐标中心在 图的右下角"。

它看起来像这样

1 - 坐标中心在图表的左下角。
2 - 图形右下角的坐标中心
3 - 坐标中心在图表的右上角
4 - 坐标中心在图表的左上角

计数从零开始。

是什么阻止你输入CORNER_LEFT_UPPER 而不是数字?这就是枚举的作用,所以你不必考虑数字。

 

在服务台

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坐标将从这里测量。

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

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(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_MQL5(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);
  }  


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

 
Artyom Trishkin:

计数从零开始。

是什么阻止你输入CORNER_LEFT_UPPER 而不是数字?这就是枚举的作用,所以你不必考虑数字。

从零开始?嗯,好吧--就让它从零开始吧--我没有考虑到这一点--但它仍然没有用!这就是我的想法。

因为这对我来说更有意义,而且我以前也用过它。

 
Aleksey Vyazmikin:

从头开始?好吧,好吧--即使是从头开始--我也没有考虑到这一点--但它仍然不能工作!这就是我的想法。

因为这对我来说更有意义,而且我以前也用过它......

我是否应该把你想确定的清单项目移到第4号上,它并不在那里?它变成了零--而且一切都到位了。