Ошибки, баги, вопросы - страница 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 лишен смысла. Ан нет, как показывает скрипт. Почему так?

Похоже, что неправильно работает приведение double -> string.

 
В тестере очень медленно работают 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-библиотека показывает такое же падение времени выполнения.


ЗЫ Тормозят не только PositionGet, но и OrderGet, HistoryDealGet, HistoryOrderGet.

 

В тестере (1629) сделки открываются по нулевым ценам

Запускаем советник в тестере по реальным тикам торгового сервера FIBOGroup-MT5 Server


 

Вопрос к разработчикам и заинтересованным коллегам.

В Тестере в режиме визуализации задействован объект класса CiMA - мувинг.

Режим = "Каждый тик на основе реальных тиков". Скорость в Визуализаторе близка к максимальной.

Проблема такая. При появлении нового бара приходится ждать хренову тучу новых тиков, чтобы обновились значения мувингов типа CiMA, а точнее значения в буфере мувинга.

При этом на каждом тике форсируется обновление посредством метода CiMA::Refresh(-1).

Почему так хреново работает Тестер?

На реале таких проблем нет.

 

пуши странные нынче пошли: 

uest/302788

request/302788

как могу догадаться, это меня в кандидаты записали и прокоментировали в том же заказе. 

Но сообщения прям как для кодеров)

 

Из документации

 

ENUM_BASE_CORNER

Идентификатор

Описание

CORNER_LEFT_UPPER

Центр координат в левом верхнем углу графика

CORNER_LEFT_LOWER

Центр координат в левом нижнем углу графика

CORNER_RIGHT_LOWER

Центр координат в правом нижнем углу графика

CORNER_RIGHT_UPPER

Центр координат в правом верхнем углу графика

Вопрос: Почему нельзя было составить таблицу в цифровом порядке? ставишь 1 - и вместо ожидаемого "Центр координат в левом верхнем углу графика"  получаешь "Центр координат в правом нижнем углу графика".

Получается сейчас так

1 - Центр координат в левом нижнем углу графика
2 - Центр координат в правом нижнем углу графика
3 - Центр координат в правом верхнем углу графика
4 - Центр координат в левом верхнем углу графика

 
Aleksey Vyazmikin:

Из документации

 

ENUM_BASE_CORNER

Идентификатор

Описание

CORNER_LEFT_UPPER

Центр координат в левом верхнем углу графика

CORNER_LEFT_LOWER

Центр координат в левом нижнем углу графика

CORNER_RIGHT_LOWER

Центр координат в правом нижнем углу графика

CORNER_RIGHT_UPPER

Центр координат в правом верхнем углу графика

Вопрос: Почему нельзя было составить таблицу в цифровом порядке? ставишь 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 в пикселях.

Казалось бы одно и то же, вот только в MT4 нет левой точки объекта для OBJ_LABEL - есть правая, но не это вызвало мой гнев, дело в том, что старый код MT4 с использованием ObjectSet позволял разместить объекты относительно краев (углов) - для объектов в левой части расчет пикселей шел от первого символа, для правой части - от последнего символа, а новый вариант всегда делает расчет отступа от первого символа, что затрудняет позиционирование лейблов с текстом, так как не всегда известно, сколько будет текстовых символов. Прошу разработчиков добавить выбор способа выравнивания текста!

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

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, которой там нету? Он становится нулевым - и всё на местах.

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